@wemap/providers 7.5.0 → 8.0.0-alpha.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.
@@ -1 +1 @@
1
- {"version":3,"file":"wemap-providers.es.js","sources":["../src/events/EventType.js","../src/events/ProviderEvent.js","../src/providers/ProviderState.js","../src/events/ProvidersLoggerOld.js","../src/errors/ContainsIgnoredProviderError.js","../src/ProvidersOptions.js","../src/providers/Provider.js","../src/errors/AskImuOnDesktopError.js","../src/providers/imu/Imu.js","../src/errors/MissingSensorError.js","../src/errors/MissingAccelerometerError.js","../src/providers/imu/Accelerometer.js","../src/errors/MissingGyroscopeError.js","../src/providers/imu/Gyroscope.js","../src/providers/imu/HighRotationsDetector.js","../src/errors/MissingMagnetometerError.js","../../routers/src/model/LevelChange.js","../../routers/src/model/Step.js","../../routers/src/Constants.js","../../routers/src/model/Leg.js","../../routers/src/Utils.js","../../routers/src/model/Itinerary.js","../../routers/src/wemap/WemapRouterOptions.js","../../routers/src/wemap/WemapStepsGeneration.js","../../routers/src/remote/cityway/CitywayRemoteRouter.js","../../routers/src/remote/idfm/IdfmRemoteRouter.js","../../routers/src/remote/osrm/OsrmRemoteRouter.js","../../../node_modules/@mapbox/polyline/src/polyline.js","../../routers/src/remote/otp/OtpRemoteRouter.js","../src/providers/attitude/EkfAttitude.js","../src/providers/attitude/relative/RelativeAttitudeFromEkf.js","../src/providers/attitude/relative/RelativeAttitudeFromBrowser.js","../src/providers/attitude/relative/RelativeAttitudeFromInertial.js","../src/errors/MissingArCoreError.js","../src/errors/MissingNativeInterfaceError.js","../src/providers/position/relative/ArCore.js","../src/providers/attitude/relative/RelativeAttitude.js","../src/providers/attitude/TurnDectector.js","../src/providers/Constants.js","../src/providers/steps/StepDetectionMinMaxPeaks2.js","../src/providers/steps/StepDetector.js","../src/providers/steps/StraightLineDetector.js","../src/mapmatching/MapMatchingHandler.js","../src/errors/GeolocationApiMissingError.js","../src/errors/GeolocationPermissionDeniedError.js","../src/errors/GeolocationPositionUnavailableError.js","../src/providers/position/absolute/GnssWifi.js","../src/providers/position/relative/GeoRelativePositionFromArCore.js","../src/providers/position/relative/Pdr.js","../src/providers/position/relative/GeoRelativePosition.js","../../utils/src/TimeUtils.js","../src/providers/vision/Vps.js","../src/providers/position/absolute/AbsolutePosition.js","../src/providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js","../src/providers/inclination/InclinationFromAcc.js","../src/providers/inclination/InclinationFromRelativeAttitude.js","../src/providers/inclination/Inclination.js","../src/providers/attitude/absolute/AbsoluteAttitude.js","../src/providers/imu/MagnetometerCalibrationDetector.js","../src/errors/IpResolveServerError.js","../src/providers/position/absolute/Ip.js","../src/providers/others/Barcode.js","../src/providers/others/CameraNative.js","../src/providers/others/CameraProjectionMatrix.js","../src/Providers.js","../src/ProvidersInterface.js","../src/smoothers/PositionSmoother.js","../src/smoothers/AttitudeSmoother.js"],"sourcesContent":["/**\n * Event data types handled by {@link ProviderEvent}\n */\nexport default {\n Unknown: 'UNKNOWN',\n\n MagneticField: 'MAGNETIC_FIELD',\n AngularRate: 'ANGULAR_RATE',\n Acceleration: 'ACCELERATION',\n MagnetometerNeedCalibration: 'MAGNETOMETER_NEED_CALIBRATION',\n\n RelativeAttitude: 'RELATIVE_ATTITUDE',\n AbsoluteAttitude: 'ABSOLUTE_ATTITUDE',\n Attitude: 'ATTITUDE',\n\n Inclination: 'INCLINATION',\n AbsoluteHeading: 'ABSOLUTE_HEADING',\n Turn: 'TURN',\n HighRotation: 'HIGH_ROTATION',\n\n RelativePosition: 'RELATIVE_POSITION',\n GeoRelativePosition: 'GEO_RELATIVE_POSITION',\n AbsolutePosition: 'ABSOLUTE_POSITION',\n\n Step: 'STEP',\n StraightLine: 'STRAIGHT_LINE',\n\n Pressure: 'PRESSURE',\n BluetoothSignals: 'BLUETOOTH_SIGNALS',\n WifiSignals: 'WIFI_SIGNALS',\n ScanId: 'SCAN_ID',\n Barcode: 'BARCODE',\n CameraProjectionMatrix: 'CAMERA_PROJECTION_MATRIX',\n CameraNative: 'CAMERA_NATIVE',\n\n Itinerary: 'ITINERARY',\n Network: 'NETWORK',\n\n ForceVps: 'FORCE_VPS'\n};\n","import EventType from './EventType.js';\n\n/**\n * A provider event is an event which can be triggered by device sensors\n * or can be computed from raw providers.\n *\n * @template T\n */\nclass ProviderEvent {\n\n dataType = EventType.Unknown;\n providersStack = [];\n\n /** @type {T} */\n data = null;\n\n /**\n * Create a Provider Event with the minimum information\n * @param {EventType} dataType the type of event\n * @param {Object} data the event data\n */\n constructor(dataType, data) {\n this.dataType = dataType;\n this.data = data;\n }\n\n /**\n * @return {ProviderEvent<T>}\n */\n clone() {\n const evt = new ProviderEvent(this.dataType, this.data);\n evt.providersStack = this.providersStack.slice(0);\n return evt;\n }\n}\n\nexport default ProviderEvent;\n","export default {\n STARTING: 0,\n STARTED: 1,\n STOPPPED: 2\n};\n","import Logger from '@wemap/logger';\n\nclass ProvidersLoggerOld {\n\n _enabled = false;\n\n currentId = 0;\n objectsIdMap = new WeakMap();\n\n pushEvents = {};\n pushEventsRef = {};\n\n interval;\n initDate;\n\n\n get enabled() {\n return this._enabled;\n }\n\n set enabled(_newVal) {\n this._enabled = _newVal;\n }\n\n initializeInterval() {\n\n if (this.interval) {\n return;\n }\n\n this.interval = setInterval(() => {\n\n for (const [key, value] of Object.entries(this.pushEvents)) {\n Logger.debug('Received ' + value + ' notifications from ' + this.pushEventsRef[key].pname + ' last second');\n }\n\n this.pushEvents = {};\n this.pushEventsRef = {};\n }, 1000);\n }\n\n getObjectId(object) {\n if (!this.objectsIdMap.has(object)) {\n this.objectsIdMap.set(object, ++this.currentId);\n }\n return this.objectsIdMap.get(object);\n }\n\n addEvent(object, method) {\n\n if (!this.enabled) {\n return;\n }\n\n if (!this.initDate) {\n this.initDate = Date.now();\n }\n\n this.initializeInterval();\n\n const objectId = this.getObjectId(object);\n const objectClassName = object.pname;\n\n Logger.debug(objectClassName + '[' + objectId + '].' + method);\n }\n\n incrementNotifications(object) {\n\n if (!this.enabled) {\n return;\n }\n\n const objectId = this.getObjectId(object);\n\n let counter = this.pushEvents[objectId];\n if (!counter) {\n counter = 0;\n this.pushEventsRef[objectId] = object;\n }\n this.pushEvents[objectId] = counter + 1;\n }\n\n}\nexport default new ProvidersLoggerOld();\n","class ContainsIgnoredProviderError extends Error {\n\n static DEFAULT_MESSAGE = 'Contains ignored provider';\n\n constructor(message) {\n super(message || ContainsIgnoredProviderError.DEFAULT_MESSAGE);\n }\n}\n\nexport default ContainsIgnoredProviderError;\n","const ProvidersOptions = {\n\n /**\n * Does provider will use map to\n */\n useMapMatching: true,\n\n /**\n * Providers listed here will not be used by the system\n * List of {@link Provider#pname}\n */\n ignoreProviders: [],\n\n /**\n * Some providers are not used by default (VPS, QRCodeScanner) because they\n * require data from an optional external service or because they drain more\n * battery. They can be added to this list to be used\n * List of {@link Provider#pname}\n */\n optionalProviders: [],\n\n /**\n * Define the list of EventType that are optionals\n * List of {@link EventType}\n */\n optionalEvents: [],\n\n stopOnError: true,\n\n checkAvailabilityOnStart: true,\n\n stepdetectionlocker: true,\n\n smoother: true,\n\n get hasVps() {\n return this.optionalProviders.includes('Vps');\n }\n};\n\nexport default ProvidersOptions;\n","import EventType from '../events/EventType.js';\nimport ProviderEvent from '../events/ProviderEvent.js';\nimport ProvidersLoggerOld from '../events/ProvidersLoggerOld.js';\nimport ContainsIgnoredProviderError from '../errors/ContainsIgnoredProviderError.js';\nimport ProvidersOptions from '../ProvidersOptions.js';\nimport ProviderState from './ProviderState.js';\n\n\n/**\n * A provider is a meta class to define an entity which can be\n * started / stopped and provides a data of {@link ProviderEvent#DataType}\n */\nclass Provider {\n\n /** @type {number} */\n static _callbackUniqueId = 0;\n\n /** @type {number} */\n static _uniqueId = 1;\n\n\n /** @type {number} */\n id;\n\n /** @type {number} */\n state = ProviderState.STOPPPED;\n\n /** @type {ProviderEvent[]} */\n _lastEvents = null;\n\n _eventsCallbacks = [];\n _monitoringCallbacks = [];\n\n /**\n * Provider constructor\n */\n constructor() {\n\n if (this.constructor === Provider) {\n throw new Error('Can\\'t instantiate Provider directly');\n }\n\n this.id = Provider._uniqueId++;\n\n ProvidersLoggerOld.addEvent(this, 'constructor');\n }\n\n /**\n * Get the provider name\n * @type {String} the provider name\n */\n static get pname() {\n return 'Unknown';\n }\n\n /** @type {String} */\n get pname() {\n return this.constructor.pname;\n }\n\n /**\n * Get the list of events type which can be returned by the provider\n * @returns {EventType[]} the list of events type\n * @public\n * @abstract\n */\n get eventsType() {\n return [];\n }\n\n /**\n * @type {Promise} returns an availability promise\n */\n get availability() {\n if (ProvidersOptions.ignoreProviders.includes(this.pname)) {\n return Promise.reject(new ContainsIgnoredProviderError());\n }\n\n return this._availability;\n }\n\n /** @type {Promise} */\n get _availability() {\n return Promise.resolve();\n }\n\n /**\n * Create an event from current provider\n * @param {String} dataType type of ProviderEvent (from EventType)\n * @param {Object} data data exported to ProviderEvent\n * @returns {ProviderEvent}\n * @protected\n */\n static createEvent(dataType, data, fromEvents = []) {\n const event = new ProviderEvent(dataType, data);\n const newStack = fromEvents.reduce((acc, _event) => acc.concat(_event.providersStack), []);\n // Remove duplicates and keep lasts\n event.providersStack = [...new Set(newStack.reverse())].reverse();\n return event;\n }\n\n /**\n * Create an event from current provider\n * @param {EventType} dataType type of ProviderEvent\n * @param {Object} data data exported to ProviderEvent\n * @param {ProviderEvent[]} fromEvents events used for the creation of the new one\n * @returns {ProviderEvent}\n * @protected\n */\n createEvent(dataType, data, fromEvents) {\n return this.constructor.createEvent(dataType, data, fromEvents);\n }\n\n get hasNativeInterface() {\n return Boolean(this.nativeInterface);\n }\n\n get nativeInterface() {\n return typeof window !== 'undefined' ? (window.__nativeProviders || null) : null;\n }\n\n get useCameraNatively() {\n return false;\n }\n\n /**\n * Description of the function\n * @name onEventsFunction\n * @function\n * @param {ProviderEvent[]} events the array of provider events\n */\n\n /**\n *\n * @param {onEventsFunction} onEvents\n * @param {Function} onError\n * @param {Boolean} startIfNecessary\n * @returns {Number}\n */\n addEventListener(onEvents = () => {}, onError = () => {}, startIfNecessary = true) {\n const id = ++Provider._callbackUniqueId;\n\n /**\n * Build callback\n */\n this._eventsCallbacks.push({\n id,\n onEvents,\n onError,\n optional: !startIfNecessary\n });\n\n\n // The caller just want to have callbacks without starting the provider,\n // the routine can be stopped here\n if (!startIfNecessary) {\n return id;\n }\n\n\n // If the provider is already started do not go further\n if (this.state !== ProviderState.STOPPPED) {\n return id;\n }\n this.state = ProviderState.STARTING;\n\n // Check availability on start if defined in options\n let availabilityPromise = Promise.resolve();\n if (ProvidersOptions.checkAvailabilityOnStart) {\n availabilityPromise = this.availability;\n }\n\n availabilityPromise\n .then(() => {\n\n ProvidersLoggerOld.addEvent(this, 'start');\n // Call the child start function\n this.start();\n\n this.state = ProviderState.STARTED;\n\n this._monitoringCallbacks.forEach(({ onStarted }) => onStarted());\n })\n .catch(e => {\n this.state = ProviderState.STOPPPED;\n this.notifyError(e);\n })\n // notifyError can throw an error if onStop is not defined\n .catch(() => {});\n\n return id;\n }\n\n /**\n *\n * @param {Number} callbackUniqueId\n */\n removeEventListener(callbackUniqueId) {\n\n // Search the caller object in callbacks list\n const callback = this._eventsCallbacks.find(_callback => _callback.id === callbackUniqueId);\n if (!callback) {\n // The callback object is not found. Maybe it is already stopped.\n return;\n }\n\n // Remove the current callback from the list of the callbacks\n this._eventsCallbacks = this._eventsCallbacks.filter(_callback => _callback !== callback);\n\n // If this callback was optional, do not go further to stop the provider\n if (callback.optional) {\n return;\n }\n\n // If there is callbacks that are not optionals for start, do not stop the provider\n if (this._eventsCallbacks.find(_callback => !_callback.optional)) {\n return;\n }\n\n // If the provider is already stopped, do not stop it again.\n // This condition can be true if checkAvailabilityOnStart is true and returns an error\n if (this.state === ProviderState.STOPPPED) {\n return;\n }\n\n ProvidersLoggerOld.addEvent(this, 'stop');\n // Call the child stop function\n this.stop();\n\n this.state = ProviderState.STOPPPED;\n\n this._monitoringCallbacks.forEach(({ onStopped }) => onStopped());\n }\n\n\n /**\n *\n * @param {Function} onStarted\n * @param {Function} onStopped\n * @returns {Number}\n */\n addMonitoringListener(onStarted = () => {}, onStopped = () => {}) {\n const id = ++this.constructor._callbackUniqueId;\n this._monitoringCallbacks.push({\n id,\n onStarted,\n onStopped\n });\n return id;\n }\n\n /**\n *\n * @param {Number} callbackUniqueId\n */\n removeMonitoringListener(callbackUniqueId) {\n this._monitoringCallbacks = this._monitoringCallbacks.filter(\n _callback => _callback.id !== callbackUniqueId\n );\n }\n\n /**\n * @abstract\n */\n start() {\n throw new Error('Provider \"' + this.pname + '\" does not @override start()');\n }\n\n /**\n * @abstract\n */\n stop() {\n throw new Error('Provider \"' + this.pname + '\" does not @override stop()');\n }\n\n\n /**\n * Notify the subscriber defined in {@link addEventListener}\n * @param {ProviderEvent[]} events events to send to subscriber\n */\n notify(...events) {\n // Logging\n ProvidersLoggerOld.incrementNotifications(this);\n\n // Add current provider to the list of providers for this event.\n events.forEach(event => event.providersStack.unshift(this.pname));\n\n // Notify callbacks\n this._eventsCallbacks.forEach(({ onEvents }) => onEvents(events));\n\n // Keep a trace of the last events.\n this._lastEvents = events;\n }\n\n /**\n * Notify the subscriber defined in {@link addEventListener}\n * @param {Error} error The error raised\n */\n notifyError(error) {\n this._eventsCallbacks.forEach(({\n id, onError\n }) => {\n if (ProvidersOptions.stopOnError) {\n this.removeEventListener(id);\n }\n onError(error);\n });\n }\n\n /** @type {ProviderEvent} */\n get lastEvent() {\n return this._lastEvents ? this._lastEvents[0] : null;\n }\n\n /** @type {ProviderEvent[]} */\n get lastEvents() {\n return this._lastEvents;\n }\n\n /**\n * Input data from external interface\n * @param {ProviderEvent} event\n * @param {EventType} eventType\n */\n // eslint-disable-next-line no-unused-vars\n feed(event, eventType) {\n throw new Error('Not implemented');\n }\n}\n\nexport default Provider;\n","class AskImuOnDesktopError extends Error {\n\n static DEFAULT_MESSAGE = 'It seems that you ask for IMU events on a desktop browser';\n\n constructor(message) {\n super(message || AskImuOnDesktopError.DEFAULT_MESSAGE);\n }\n}\n\nexport default AskImuOnDesktopError;\n","import { deg2rad } from '@wemap/maths';\nimport {\n Browser, BrowserUtils\n} from '@wemap/utils';\n\nimport Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport AskImuOnDesktopError from '../../errors/AskImuOnDesktopError.js';\n\n/**\n * Imu (Inertial Measurement Unit) provider retrieve acceleration data\n * and/or angular rate data from inertial sensors.\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via devicemotion)\n * Safari iOS (v12.0): YES (via devicemotion)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/DeviceMotionEvent}\n * Firefox Android (v65.0.1): YES (via devicemotion)\n *\n * -----------------------------------\n */\nclass Imu extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'IMU';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AngularRate, EventType.Acceleration];\n }\n\n /**\n * @override\n */\n static get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n const subscribe = () => window.addEventListener('devicemotion', this.parseDeviceMotionEvent, true);\n\n if (typeof (DeviceMotionEvent) !== 'undefined' && typeof (DeviceMotionEvent.requestPermission) === 'function') {\n DeviceMotionEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n }\n\n /**\n * @override\n */\n stop() {\n window.removeEventListener('devicemotion', this.parseDeviceMotionEvent, true);\n }\n\n /**\n * devicemotion callback\n * @param {DeviceMotionEvent} e device motion event\n * @returns {ProviderEvent[]} an array of provider events\n * @private\n */\n parseDeviceMotionEvent = e => {\n const events = [];\n\n const timestamp = e.timeStamp / 1e3;\n\n let acc;\n if (e.accelerationIncludingGravity) {\n const {\n x, y, z\n } = e.accelerationIncludingGravity;\n\n if (typeof x === 'number' && typeof y === 'number' && typeof z === 'number') {\n acc = [x, y, z];\n\n if (BrowserUtils.name === Browser.SAFARI\n || BrowserUtils.name === Browser.IOS_WEBVIEW) {\n acc[0] *= -1;\n acc[1] *= -1;\n acc[2] *= -1;\n }\n }\n }\n\n if (acc) {\n events.push(this.createEvent(EventType.Acceleration, {\n timestamp,\n values: acc\n }));\n }\n\n let gyr;\n if (e.rotationRate) {\n const {\n alpha, beta, gamma\n } = e.rotationRate;\n\n if (typeof alpha === 'number' && typeof beta === 'number' && typeof gamma === 'number') {\n gyr = [deg2rad(alpha), deg2rad(beta), deg2rad(gamma)];\n }\n }\n\n if (gyr) {\n events.push(this.createEvent(EventType.AngularRate, {\n timestamp,\n values: gyr\n }));\n }\n\n if (events.length !== 0) {\n this.notify(...events);\n }\n }\n\n}\n\nexport default new Imu();\n","class MissingSensorError extends Error {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve events, a sensor is missing';\n\n constructor(message) {\n super(message || MissingSensorError.DEFAULT_MESSAGE);\n }\n\n from(fromMessage) {\n this.message += ' from ' + fromMessage;\n return this;\n }\n}\n\nexport default MissingSensorError;\n","import MissingSensorError from './MissingSensorError.js';\nclass MissingAccelerometerError extends MissingSensorError {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve Acceleration data';\n\n constructor(message) {\n super(message || MissingAccelerometerError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingAccelerometerError;\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport MissingAccelerometerError from '../../errors/MissingAccelerometerError.js';\nimport Imu from './Imu.js';\n\nclass Accelerometer extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Accelerometer';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Acceleration];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Imu.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Imu.addEventListener(\n events => this.parseImuEvents(events),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Imu.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n parseImuEvents = events => {\n\n const accelerationEvent = events.find(event => event.dataType === EventType.Acceleration);\n if (!accelerationEvent) {\n this.notifyError(new MissingAccelerometerError().from('devicemotion'));\n return;\n }\n this.notify(accelerationEvent.clone());\n }\n\n}\n\nexport default new Accelerometer();\n","import MissingSensorError from './MissingSensorError.js';\nclass MissingGyroscopeError extends MissingSensorError {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve Angular Rate data';\n\n constructor(message) {\n super(message || MissingSensorError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingGyroscopeError;\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport MissingGyroscopeError from '../../errors/MissingGyroscopeError.js';\nimport Imu from './Imu.js';\n\nclass Gyroscope extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Gyroscope';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AngularRate];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Imu.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Imu.addEventListener(\n events => this.parseImuEvents(events),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Imu.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n parseImuEvents = events => {\n\n const gyroscopeEvent = events.find(event => event.dataType === EventType.AngularRate);\n if (!gyroscopeEvent) {\n this.notifyError(new MissingGyroscopeError().from('devicemotion'));\n return;\n }\n this.notify(gyroscopeEvent.clone());\n }\n\n}\n\nexport default new Gyroscope();\n","import { Vector3 } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport Provider from '../Provider.js';\nimport Gyroscope from './Gyroscope.js';\n\nclass HighRotationsDetector extends Provider {\n\n // in radians by second\n static THRESHOLD = 10;\n\n /** @type {number} in seconds */\n static DELAY_CONSIDERATION = 3;\n\n /**\n * @override\n */\n static get pname() {\n return 'HighRotationsDetector';\n }\n\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.HighRotation];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Gyroscope.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Gyroscope.addEventListener(\n events => this._parseGyroscopeEvent(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Gyroscope.removeEventListener(this.providerId);\n }\n\n isInProgress() {\n if (!this.lastEvent || !Gyroscope.lastEvent) {\n return false;\n }\n\n const diffTime = Gyroscope.lastEvent.data.timestamp - this.lastEvent.data.timestamp;\n return diffTime < HighRotationsDetector.DELAY_CONSIDERATION;\n }\n\n /**\n * @private\n */\n _parseGyroscopeEvent = gyroscopeEvent => {\n\n const { values, timestamp } = gyroscopeEvent.data;\n const speed = Vector3.norm(values);\n if (speed > HighRotationsDetector.THRESHOLD) {\n this.notify(this.createEvent(EventType.HighRotation, { timestamp }, [gyroscopeEvent]));\n }\n\n }\n}\n\nexport default new HighRotationsDetector();\n","import MissingSensorError from './MissingSensorError.js';\n\nclass MissingMagnetometerError extends MissingSensorError {\n constructor(message) {\n super(message);\n }\n}\n\nexport default MissingMagnetometerError;\n","class LevelChange {\n\n /** @type {!string} [up|down] */\n direction;\n\n /** @type {!number} [-2, -1, 1, ...] */\n difference;\n\n /** @type {?string} [elevator|conveyor|stairs] */\n type = null;\n\n /**\n * @param {LevelChange} obj1\n * @param {LevelChange} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n return obj1.difference === obj2.difference\n && obj1.direction === obj2.direction\n && obj1.type === obj2.type;\n }\n\n /**\n * @param {LevelChange} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return LevelChange.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n return {\n direction: this.direction,\n difference: this.difference,\n type: this.type\n };\n }\n\n /**\n * @param {object} json\n * @returns {LevelChange}\n */\n static fromJson(json) {\n const levelChange = new LevelChange();\n levelChange.direction = json.direction;\n levelChange.difference = json.difference;\n levelChange.type = json.type;\n return levelChange;\n }\n}\n\nexport default LevelChange;\n","import { Coordinates } from '@wemap/geo';\n\nimport LevelChange from './LevelChange.js';\n\nclass Step {\n\n /** @type {!boolean} */\n firstStep = false;\n\n /** @type {!boolean} */\n lastStep = false;\n\n /** @type {!number} */\n number;\n\n /** @type {!Coordinates} */\n coords = [];\n\n\n /** @type {!number} */\n angle;\n\n /** @type {!number} */\n previousBearing;\n\n /** @type {!number} */\n nextBearing;\n\n\n /** @type {!number} */\n distance;\n\n /** @type {?number} */\n duration = null;\n\n /** @type {?string} */\n name = null;\n\n\n /** @type {?LevelChange} */\n levelChange = null;\n\n /** @type {?{?subwayEntrance: boolean, ?subwayEntranceRef: string}} */\n extras = {};\n\n /** @type {!number} */\n _idCoordsInLeg = null;\n\n /**\n * @param {Step} obj1\n * @param {Step} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n return obj1.firstStep === obj2.firstStep\n && obj1.lastStep === obj2.lastStep\n && obj1.number === obj2.number\n && obj1.coords.equalsTo(obj2.coords)\n && obj1.angle === obj2.angle\n && obj1.previousBearing === obj2.previousBearing\n && obj1.nextBearing === obj2.nextBearing\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.name === obj2.name\n && (\n obj1.levelChange === obj2.levelChange\n || obj1.levelChange !== null && obj1.levelChange.equalsTo(obj2.levelChange)\n )\n && (\n obj1.extras === obj2.extras\n || (\n obj1.extras !== null\n && obj1.extras.subwayEntrance === obj2.extras.subwayEntrance\n && obj1.extras.subwayEntranceRef === obj2.extras.subwayEntranceRef\n )\n )\n && obj1._idCoordsInLeg === obj2._idCoordsInLeg;\n }\n\n /**\n * @param {Step} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Step.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n number: this.number,\n coords: this.coords.toCompressedJson(),\n angle: this.angle,\n previousBearing: this.previousBearing,\n nextBearing: this.nextBearing,\n distance: this.distance,\n _idCoordsInLeg: this._idCoordsInLeg\n };\n if (this.firstStep) {\n output.firstStep = true;\n }\n if (this.lastStep) {\n output.lastStep = true;\n }\n if (this.duration !== null) {\n output.duration = this.duration;\n }\n if (this.name !== null) {\n output.name = this.name;\n }\n if (this.levelChange !== null) {\n output.levelChange = this.levelChange.toJson();\n }\n if (this.extras && Object.keys(this.extras).length !== 0) {\n output.extras = this.extras;\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Step}\n */\n static fromJson(json) {\n const step = new Step();\n step.number = json.number;\n step.coords = Coordinates.fromCompressedJson(json.coords);\n step.angle = json.angle;\n step.previousBearing = json.previousBearing;\n step.nextBearing = json.nextBearing;\n step.distance = json.distance;\n step._idCoordsInLeg = json._idCoordsInLeg;\n if (typeof json.firstStep === 'boolean') {\n step.firstStep = json.firstStep;\n }\n if (typeof json.lastStep === 'boolean') {\n step.lastStep = json.lastStep;\n }\n if (typeof json.duration === 'number') {\n step.duration = json.duration;\n }\n if (typeof json.name === 'string') {\n step.name = json.name;\n }\n if (typeof json.levelChange === 'object') {\n step.levelChange = LevelChange.fromJson(json.levelChange);\n }\n if (typeof json.extras === 'object') {\n step.extras = json.extras;\n }\n return step;\n }\n}\n\nexport default Step;\n","const Constants = {};\n\nConstants.ROUTING_MODE = {\n AIRPLANE: 'AIRPLANE',\n BOAT: 'BOAT',\n BIKE: 'BIKE',\n BUS: 'BUS',\n CAR: 'CAR',\n FERRY: 'FERRY',\n FUNICULAR: 'FUNICULAR',\n METRO: 'METRO',\n MOTO: 'MOTO',\n TRAIN: 'TRAIN',\n TAXI: 'TAXI',\n TRAM: 'TRAM',\n WALK: 'WALK',\n MULTI: 'MULTI',\n UNKNOWN: 'UNKNOWN'\n};\n\nConstants.PUBLIC_TRANSPORT = [\n Constants.ROUTING_MODE.AIRPLANE,\n Constants.ROUTING_MODE.BOAT,\n Constants.ROUTING_MODE.BUS,\n Constants.ROUTING_MODE.FERRY,\n Constants.ROUTING_MODE.FUNICULAR,\n Constants.ROUTING_MODE.METRO,\n Constants.ROUTING_MODE.TRAIN,\n Constants.ROUTING_MODE.TRAM\n];\n\nexport default Constants;\n","import { Coordinates, Network } from '@wemap/geo';\n\nimport Step from './Step.js';\nimport Constants from '../Constants.js';\n\nclass Leg {\n\n /** @type {!string} can be values in Constants.ROUTING_MODE */\n mode;\n\n /** @type {!number} */\n distance;\n\n /** @type {!number} */\n duration;\n\n /** @type {?number} */\n startTime = null;\n\n /** @type {?number} */\n endTime = null;\n\n /** @type {!{name: ?string, coords: !Coordinates}} */\n from;\n\n /** @type {!{name: ?string, coords: !Coordinates}} */\n to;\n\n /** @type {!Coordinates[]} */\n coords;\n\n /** @type {?{name: !string, routeColor: ?string, routeTextColor: ?string, directionName: ?string}} */\n transportInfo = null;\n\n /** @type {?(Step[])} */\n steps = null;\n\n isPublicTransport() {\n return Constants.PUBLIC_TRANSPORT.includes(this.mode);\n }\n\n /**\n * @returns {Network}\n */\n toNetwork() {\n return Network.fromCoordinates([this.coords]);\n }\n\n\n /**\n * @param {Leg} obj1\n * @param {Leg} obj2\n * @returns {Boolean}\n */\n // eslint-disable-next-line complexity\n static equalsTo(obj1, obj2) {\n const intermediate = obj1.mode === obj2.mode\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.from.name === obj2.from.name\n && obj1.from.coords.equalsTo(obj2.from.coords)\n && obj1.to.name === obj2.to.name\n && obj1.to.coords.equalsTo(obj2.to.coords)\n && obj1.coords.length === obj2.coords.length\n && (\n obj1.steps === obj2.steps\n || obj1.steps.length === obj2.steps.length\n );\n\n if (!intermediate) {\n return false;\n }\n\n let i;\n for (i = 0; i < obj1.coords.length; i++) {\n if (!obj1.coords[i].equalsTo(obj2.coords[i])) {\n return false;\n }\n }\n if (obj1.steps) {\n for (i = 0; i < obj1.steps.length; i++) {\n if (!obj1.steps[i].equalsTo(obj2.steps[i])) {\n return false;\n }\n }\n }\n\n if (obj1.transportInfo !== obj2.transportInfo) {\n if (obj1.transportInfo === null) {\n return false;\n }\n if (\n obj1.transportInfo.name !== obj2.transportInfo.name\n || obj1.transportInfo.routeColor !== obj2.transportInfo.routeColor\n || obj1.transportInfo.routeTextColor !== obj2.transportInfo.routeTextColor\n || obj1.transportInfo.directionName !== obj2.transportInfo.directionName\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @param {Leg} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Leg.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n mode: this.mode,\n from: { coords: this.from.coords.toCompressedJson() },\n to: { coords: this.to.coords.toCompressedJson() },\n distance: this.distance,\n duration: this.duration,\n coords: this.coords.map(coords => coords.toCompressedJson())\n };\n if (this.startTime !== null) {\n output.startTime = this.startTime;\n }\n if (this.endTime !== null) {\n output.endTime = this.endTime;\n }\n if (this.from.name !== null) {\n output.from.name = this.from.name;\n }\n if (this.to.name !== null) {\n output.to.name = this.to.name;\n }\n if (this.transportInfo !== null) {\n output.transportInfo = this.transportInfo;\n }\n if (this.steps !== null && this.steps.length > 0) {\n output.steps = this.steps.map(step => step.toJson());\n }\n return output;\n }\n\n\n /**\n * @param {object} json\n * @returns {Leg}\n */\n static fromJson(json) {\n const leg = new Leg();\n leg.mode = json.mode;\n leg.distance = json.distance;\n leg.duration = json.duration;\n\n if (typeof json.startTime === 'number') {\n leg.startTime = json.startTime;\n }\n if (typeof json.endTime === 'number') {\n leg.endTime = json.endTime;\n }\n\n leg.from = {\n coords: Coordinates.fromCompressedJson(json.from.coords),\n name: typeof json.from.name === 'string' ? json.from.name : null\n };\n leg.to = {\n coords: Coordinates.fromCompressedJson(json.to.coords),\n name: typeof json.to.name === 'string' ? json.to.name : null\n };\n\n leg.coords = json.coords.map(Coordinates.fromCompressedJson);\n\n if (typeof json.transportInfo === 'object') {\n leg.transportInfo = json.transportInfo;\n }\n if (typeof json.steps === 'object') {\n leg.steps = json.steps.map(Step.fromJson);\n }\n return leg;\n }\n\n}\n\nexport default Leg;\n","/**\n * Get route duration\n * @param {Number} speed in km/h\n * @returns {Number} duration in seconds\n */\nexport function getDurationFromLength(length, speed = 5) {\n return length / (speed * 1000 / 3600);\n}\n","/* eslint-disable max-statements */\nimport { Coordinates, Network } from '@wemap/geo';\nimport Leg from './Leg.js';\nimport Step from './Step.js';\nimport Constants from '../Constants.js';\nimport { getDurationFromLength } from '../Utils.js';\n\n/**\n * Main attributes are:\n * nodes: the ordered list of Node\n * edges: the ordered list of Edge\n * start: the start point (Coordinates)\n * end: the end point (Coordinates)\n * length: the route length\n */\nclass Itinerary {\n\n /** @type {!Coordinates} */\n from;\n\n /** @type {!Coordinates} */\n to;\n\n /** @type {!number} */\n distance;\n\n /** @type {!number} */\n duration;\n\n /** @type {!string} can be WALK, BIKE, CAR, PT */\n _mode;\n\n /** @type {?number} */\n startTime = null;\n\n /** @type {?number} */\n endTime = null;\n\n /** @type {!(Leg[])} */\n legs = [];\n\n /** @type {?Coordinates[]} */\n _coords = null;\n\n set coords(_) {\n throw new Error('Itinerary.coords cannot be set. They are calculated from Itinerary.legs.');\n }\n\n /** @type {!(Coordinates[])} */\n get coords() {\n if (!this._coords) {\n // Returns the coordinates contained in all legs and remove duplicates between array\n this._coords = this.legs.reduce((acc, val) => {\n const isDuplicate = acc.length && val.coords.length && acc[acc.length - 1].equalsTo(val.coords[0]);\n acc.push(...val.coords.slice(isDuplicate ? 1 : 0));\n return acc;\n }, []);\n }\n return this._coords;\n }\n\n set steps(_) {\n throw new Error('Itinerary.step cannot be set. They are calculated from Itinerary.legs.');\n }\n\n /** @type {!(Step[])} */\n get steps() {\n return this.legs.map(leg => leg.steps).flat();\n }\n\n set mode(_) {\n throw new Error('Itinerary.mode cannot be set. They are calculated from Itinerary.legs.');\n }\n\n get mode() {\n if (!this._mode) {\n let isPublicTransport = false;\n let isBicycle = false;\n let isDriving = false;\n\n this.legs.forEach((leg) => {\n isPublicTransport = isPublicTransport || Constants.PUBLIC_TRANSPORT.includes(leg.mode);\n isBicycle = isBicycle || leg.mode === Constants.ROUTING_MODE.BIKE;\n isDriving = isDriving || leg.mode === Constants.ROUTING_MODE.CAR;\n });\n\n if (isPublicTransport) {\n this._mode = 'PT';\n } else if (isDriving) {\n this._mode = 'CAR';\n } else if (isBicycle) {\n this._mode = 'BIKE';\n } else {\n this._mode = 'WALK';\n }\n }\n\n return this._mode;\n\n }\n\n /**\n * @returns {Network}\n */\n toNetwork() {\n return Network.fromCoordinates([this.coords]);\n }\n\n /**\n * @param {Itinerary[]} itineraries\n * @returns {Itinerary}\n */\n static fromItineraries(...itineraries) {\n const itinerary = new Itinerary();\n itinerary.from = itineraries[0].from;\n itinerary.to = itineraries[itineraries.length - 1].to;\n itinerary.distance = 0;\n itinerary.duration = 0;\n itinerary.legs = [];\n\n itineraries.forEach(_itinerary => {\n itinerary.distance += _itinerary.distance;\n itinerary.duration += _itinerary.duration;\n itinerary.legs.push(..._itinerary.legs);\n itinerary.legs.forEach(leg => {\n leg.steps[0].firstStep = false;\n leg.steps[leg.steps.length - 1].lastStep = false;\n });\n });\n\n itinerary.legs[0].steps[0].firstStep = true;\n const lastLeg = itinerary.legs[itinerary.legs.length - 1];\n lastLeg.steps[lastLeg.steps.length - 1].lastStep = true;\n\n return itinerary;\n }\n\n /**\n * Convert lat/lng/level points to Itinerary\n * @param {number[][]} points 2D points array of lat/lng/level (level is optional)\n * @param {Coordinates} from\n * @param {Coordinates} to\n * @param {string} mode\n * @returns {Itinerary}\n */\n static fromOrderedPointsArray(points, start, end) {\n\n const pointToCoordinates = point => new Coordinates(point[0], point[1], null, point[2]);\n\n return this.fromOrderedCoordinates(\n points.map(pointToCoordinates),\n pointToCoordinates(start),\n pointToCoordinates(end)\n );\n }\n\n /**\n * Convert ordered Coordinates to Itinerary\n * @param {Coordinates[]} points\n * @param {Coordinates} from\n * @param {Coordinates} to\n * @param {string} mode\n * @returns {Itinerary}\n */\n static fromOrderedCoordinates(points, from, to, mode = 'WALK') {\n\n const itinerary = new Itinerary();\n itinerary.from = from;\n itinerary.to = to;\n\n const leg = new Leg();\n leg.mode = mode;\n leg.from = { name: null, coords: from };\n leg.to = { name: null, coords: to };\n\n leg.coords = points;\n leg.distance = points.reduce((acc, coords, idx, arr) => {\n if (idx !== 0) {\n return acc + arr[idx - 1].distanceTo(coords);\n }\n return acc;\n }, 0);\n leg.duration = getDurationFromLength(leg.distance);\n itinerary.legs.push(leg);\n\n itinerary.distance = leg.distance;\n itinerary.duration = leg.duration;\n\n return itinerary;\n }\n\n\n /**\n * @param {Itinerary} obj1\n * @param {Itinerary} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n const intermediate = obj1.from.equalsTo(obj2.from)\n && obj1.to.equalsTo(obj2.to)\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.legs.length === obj2.legs.length;\n\n if (!intermediate) {\n return false;\n }\n\n for (let i = 0; i < obj1.legs.length; i++) {\n if (!obj1.legs[i].equalsTo(obj2.legs[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @param {Itinerary} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Itinerary.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n from: this.from.toCompressedJson(),\n to: this.to.toCompressedJson(),\n distance: this.distance,\n duration: this.duration,\n mode: this.mode,\n legs: this.legs.map(leg => leg.toJson())\n };\n if (this.startTime !== null) {\n output.startTime = this.startTime;\n }\n if (this.endTime !== null) {\n output.endTime = this.endTime;\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Itinerary}\n */\n static fromJson(json) {\n const itinerary = new Itinerary();\n itinerary.from = Coordinates.fromCompressedJson(json.from);\n itinerary.to = Coordinates.fromCompressedJson(json.to);\n itinerary.distance = json.distance;\n itinerary.duration = json.duration;\n itinerary.legs = json.legs.map(Leg.fromJson);\n if (typeof json.startTime === 'number') {\n itinerary.startTime = json.startTime;\n }\n if (typeof json.endTime === 'number') {\n itinerary.endTime = json.endTime;\n }\n return itinerary;\n }\n}\nexport default Itinerary;\n","import { GraphRouterOptions } from '@wemap/geo';\nimport { OsmElement } from '@wemap/osm';\n\nclass WemapRouterOptions extends GraphRouterOptions {\n\n /** @type {WemapRouterOptions} */\n static DEFAULT = new WemapRouterOptions();\n\n /**\n * @returns {WemapRouterOptions}\n */\n static get WITHOUT_STAIRS() {\n const options = new WemapRouterOptions();\n options.acceptEdgeFn = edge => edge.builtFrom.tags.highway !== 'steps';\n return options;\n }\n\n /**\n * Get route duration\n * @param {Number} speed in km/h\n */\n static getDurationFromLength(length, speed = 5) {\n return length / (speed * 1000 / 3600);\n }\n\n /** @type {function(GraphEdge<OsmElement>):boolean} */\n weightEdgeFn = edge => edge.builtFrom.isElevator ? 30 : WemapRouterOptions.getDurationFromLength(edge.length);\n\n\n}\n\nexport default WemapRouterOptions;\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { Coordinates, Level, GraphItinerary, GraphNode, GraphUtils } from '@wemap/geo';\nimport { diffAngle, deg2rad } from '@wemap/maths';\nimport { OsmElement } from '@wemap/osm';\n\nimport LevelChange from '../model/LevelChange.js';\nimport Step from '../model/Step.js';\n\nconst SKIP_STEP_ANGLE_MAX = deg2rad(20);\n\nclass WemapStepsGeneration {\n\n /**\n * @param {GraphItinerary<OsmElement>} itinerary\n * @returns {Step[]}\n */\n static fromGraphItinerary(itinerary) {\n\n const steps = [];\n\n const { start, end, nodes, edges } = itinerary;\n\n let currentStep, previousStep;\n let previousBearing = start.bearingTo(nodes[0].coords);\n\n for (let i = 0; i < nodes.length - 1; i++) {\n\n const isFirstStep = !currentStep;\n\n const node = nodes[i];\n const nextNode = nodes[i + 1];\n const edge = edges[i];\n\n const bearing = edge.bearing;\n const angle = diffAngle(previousBearing, bearing + Math.PI);\n\n let splitByAngle = Math.abs(diffAngle(Math.PI, angle)) >= SKIP_STEP_ANGLE_MAX;\n\n const splitByLevel = edge.level && edge.level.isRange\n && node.coords.level && !node.coords.level.isRange;\n splitByAngle = splitByAngle && !(node.coords.level && node.coords.level.isRange);\n\n const splitStepCondition = splitByAngle || splitByLevel;\n\n const isSubwayEntrance = node ? node.builtFrom.tags.railway === 'subway_entrance' : false;\n\n // New step creation\n if (isFirstStep || splitStepCondition || isSubwayEntrance) {\n\n previousStep = currentStep;\n\n currentStep = new Step();\n currentStep.coords = node.coords;\n currentStep.number = steps.length + 1;\n currentStep.angle = angle;\n currentStep.previousBearing = previousBearing;\n currentStep.nextBearing = bearing;\n currentStep.name = edge.builtFrom.tags.name || null;\n currentStep.distance = 0;\n currentStep.duration = 0;\n\n if (isSubwayEntrance) {\n currentStep.extras.subwayEntrance = true;\n currentStep.name = node.builtFrom.tags.name;\n if (node.builtFrom.tags.ref) {\n currentStep.extras.subwayEntranceRef = node.builtFrom.tags.ref;\n }\n }\n\n if (splitByLevel) {\n currentStep.levelChange = WemapStepsGeneration.levelChangefromTwoNodes(node, nextNode);\n }\n\n steps.push(currentStep);\n\n if (!previousStep) {\n currentStep.firstStep = true;\n }\n }\n\n currentStep.distance += edge.length;\n currentStep.duration += itinerary.edgesWeights[i];\n previousBearing = bearing;\n }\n\n const lastNode = nodes[nodes.length - 1];\n\n // Create a last step if end is not on the network\n if (!Coordinates.equalsTo(lastNode.coords, end)) {\n const lastStep = new Step();\n lastStep.coords = lastNode.coords;\n lastStep.number = steps.length + 1;\n lastStep.previousBearing = previousBearing;\n lastStep.distance = lastNode.coords.distanceTo(end);\n lastStep.nextBearing = lastNode.coords.bearingTo(end);\n lastStep.angle = diffAngle(lastStep.previousBearing, lastStep.nextBearing + Math.PI);\n steps.push(lastStep);\n }\n\n steps[steps.length - 1].lastStep = true;\n\n return steps;\n }\n\n /**\n * @param {GraphNode<OsmElement>} firstNode\n * @param {GraphNode<OsmElement>} secondNode\n * @returns {LevelChange}\n */\n static levelChangefromTwoNodes(firstNode, secondNode) {\n\n const levelChange = new LevelChange();\n\n const edge = GraphUtils.getEdgeByNodes(firstNode.edges, firstNode, secondNode);\n\n if (edge.builtFrom.isElevator) {\n levelChange.type = 'elevator';\n } else if (edge.builtFrom.isConveying) {\n levelChange.type = 'conveyor';\n } else if (edge.builtFrom.areStairs) {\n levelChange.type = 'stairs';\n }\n\n levelChange.difference = Level.diff(firstNode.coords.level, secondNode.coords.level);\n levelChange.direction = levelChange.difference > 0 ? 'up' : 'down';\n\n return levelChange;\n }\n}\nexport default WemapStepsGeneration;\n","/* eslint-disable max-depth */\n/* eslint-disable max-statements */\nimport { Coordinates } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport RemoteRouter from '../RemoteRouter.js';\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata, dateWithTimeZone } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'Car');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'Walk');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'Bike');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'PT');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'PT');\n\n\n/**\n * List of all routing modes supported by the API\n */\nconst routingModeCorrespondance = new Map();\nroutingModeCorrespondance.set('WALK', Constants.ROUTING_MODE.WALK);\nroutingModeCorrespondance.set('BICYCLE', Constants.ROUTING_MODE.BIKE);\nroutingModeCorrespondance.set('TRAMWAY', Constants.ROUTING_MODE.TRAM);\nroutingModeCorrespondance.set('METRO', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('FUNICULAR', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('BUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('COACH', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SCHOOL', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('BUS_PMR', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('MINIBUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TROLLEY_BUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TAXIBUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SHUTTLE', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TRAIN', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('HST', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('LOCAL_TRAIN', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('AIR', Constants.ROUTING_MODE.AIRPLANE);\nroutingModeCorrespondance.set('FERRY', Constants.ROUTING_MODE.BOAT);\nroutingModeCorrespondance.set('TAXI', Constants.ROUTING_MODE.UNKNOWN);\nroutingModeCorrespondance.set('CAR_POOL', Constants.ROUTING_MODE.UNKNOWN);\nroutingModeCorrespondance.set('PRIVATE_VEHICLE', Constants.ROUTING_MODE.CAR);\nroutingModeCorrespondance.set('SCOOTER', Constants.ROUTING_MODE.MOTO);\n\n/**\n * List of all plan trip supported by the API\n * Routing mode UNKNOWN means that the itinerary will not be parsed by the router\n */\nconst planTripType = new Map();\nplanTripType.set(0, Constants.ROUTING_MODE.BUS);\nplanTripType.set(1, Constants.ROUTING_MODE.WALK);\nplanTripType.set(2, Constants.ROUTING_MODE.BIKE);\nplanTripType.set(3, Constants.ROUTING_MODE.CAR);\nplanTripType.set(4, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(5, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(6, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(7, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(8, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(9, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(10, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(11, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(12, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(13, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(14, Constants.ROUTING_MODE.UNKNOWN);\n\n\n/**\n * Singleton.\n */\nclass CitywayRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'cityway';\n }\n\n\n /**\n * @override\n * @throws {RoutingModeCorrespondanceNotFound}\n * @throws {RemoteRouterServerUnreachable}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n const res = await fetch(url);\n if (res.status !== 200) {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }\n const response = await res.json();\n return this.createRouterResponseFromJson(response);\n }\n\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n const citywayMode = inputModeCorrespondance.get(mode);\n if (!citywayMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n const fromPlace = `DepartureLatitude=${waypoints[0].latitude}&DepartureLongitude=${waypoints[0].longitude}`;\n const toPlace = `ArrivalLatitude=${waypoints[1].latitude}&ArrivalLongitude=${waypoints[1].longitude}`;\n const queryMode = `TripModes=${citywayMode}`;\n\n const url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}&${queryMode}`;\n\n return `${url.origin}${url.pathname}${search}`;\n }\n\n /**\n * Generate multi itineraries from Cityway JSON\n * @param {object} json JSON file provided by Cityway.\n * @returns {?RouterResponse}\n * @example https://preprod.api.lia2.cityway.fr/journeyplanner/api/opt/PlanTrips/json?DepartureLatitude=49.51509388236216&DepartureLongitude=0.09341749619366316&ArrivalLatitude=49.5067090188444&ArrivalLongitude=0.1694842115417831&DepartureType=COORDINATES&ArrivalType=COORDINATES\n */\n createRouterResponseFromJson(json) {\n\n if (json.StatusCode !== 200 || !json.Data || !json.Data.length) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n\n // Do not know if it the best approach, but it works...\n const allJsonTrips = json.Data.reduce((acc, dataObj) => {\n acc.push(...dataObj.response.trips.Trip.map(trip => ({\n ...trip,\n ...(dataObj.hasOwnProperty('PlanTripType') ? { PlanTripType: dataObj.PlanTripType } : {})\n })));\n return acc;\n }, []);\n\n // eslint-disable-next-line no-labels\n itineraryLoop:\n for (const trip of allJsonTrips) {\n\n if (trip.hasOwnProperty('PlanTripType') && planTripType.get(trip.PlanTripType) === Constants.ROUTING_MODE.UNKNOWN) {\n continue;\n }\n\n const itinerary = new Itinerary();\n\n itinerary.duration = this.parseDuration(trip.Duration);\n itinerary.startTime = this.jsonDateToTimestamp(trip.Departure.Time);\n itinerary.from = this.jsonToCoordinates(trip.Departure.Site.Position);\n itinerary.endTime = this.jsonDateToTimestamp(trip.Arrival.Time);\n itinerary.to = this.jsonToCoordinates(trip.Arrival.Site.Position);\n\n for (const jsonSection of trip.sections.Section) {\n\n const jsonLeg = jsonSection.Leg ? jsonSection.Leg : jsonSection.PTRide;\n\n const leg = new Leg();\n\n leg.mode = routingModeCorrespondance.get(jsonLeg.TransportMode);\n leg.duration = this.parseDuration(jsonLeg.Duration);\n leg.startTime = this.jsonDateToTimestamp(jsonLeg.Departure.Time);\n leg.endTime = this.jsonDateToTimestamp(jsonLeg.Arrival.Time);\n leg.coords = [];\n\n if (leg.mode === Constants.ROUTING_MODE.UNKNOWN) {\n // eslint-disable-next-line\n continue itineraryLoop;\n }\n\n if (leg.mode === Constants.ROUTING_MODE.WALK\n || leg.mode === Constants.ROUTING_MODE.BIKE\n || leg.mode === Constants.ROUTING_MODE.CAR) {\n\n leg.from = {\n name: jsonLeg.Departure.Site.Name,\n coords: this.jsonToCoordinates(jsonLeg.Departure.Site.Position)\n };\n leg.to = {\n name: jsonLeg.Arrival.Site.Name,\n coords: this.jsonToCoordinates(jsonLeg.Arrival.Site.Position)\n };\n\n leg.steps = [];\n for (const jsonPathLink of jsonLeg.pathLinks.PathLink) {\n const step = new Step();\n let stepCoords;\n if (jsonPathLink.Geometry) {\n stepCoords = this.parseWKTGeometry(jsonPathLink.Geometry);\n } else {\n stepCoords = [leg.from.coords, leg.to.coords];\n }\n step.coords = stepCoords[0];\n step._idCoordsInLeg = leg.coords.length;\n stepCoords.forEach((coords, idx) => {\n if (\n idx !== 0\n || leg.coords.length === 0\n || !leg.coords[leg.coords.length - 1].equalsTo(coords)\n ) {\n leg.coords.push(coords);\n }\n });\n\n\n step.name = jsonPathLink.Departure.Site.Name;\n step.levelChange = null;\n\n step.distance = jsonPathLink.Distance;\n\n leg.steps.push(step);\n }\n\n } else if (Constants.PUBLIC_TRANSPORT.includes(leg.mode)) {\n\n leg.from = {\n name: jsonLeg.Departure.StopPlace.Name,\n coords: this.jsonToCoordinates(jsonLeg.Departure.StopPlace.Position)\n };\n leg.to = {\n name: jsonLeg.Arrival.StopPlace.Name,\n coords: this.jsonToCoordinates(jsonLeg.Arrival.StopPlace.Position)\n };\n\n let transportName = jsonLeg.Line.Number;\n if (leg.mode === Constants.ROUTING_MODE.TRAM && transportName.toLowerCase().includes('tram')) {\n // In order to remove the \"TRAM \" prefix.\n transportName = transportName.substr(5);\n }\n\n leg.transportInfo = {\n name: transportName,\n routeColor: jsonLeg.Line.Color,\n routeTextColor: jsonLeg.Line.TextColor,\n directionName: jsonLeg.Destination\n };\n\n for (const jsonStep of jsonLeg.steps.Step) {\n const stepCoords = this.parseWKTGeometry(jsonStep.Geometry);\n stepCoords.forEach((coords, idx) => {\n if (\n idx !== 0\n || leg.coords.length === 0\n || !leg.coords[leg.coords.length - 1].equalsTo(coords)\n ) {\n leg.coords.push(coords);\n }\n });\n }\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = jsonLeg.Line.Name;\n legStep.levelChange = null;\n legStep.distance = jsonLeg.Distance;\n leg.steps = [legStep];\n } else {\n Logger.warn(`[CitywayParser] Unknown leg mode: ${jsonLeg.TransportMode}`);\n }\n\n leg.distance = leg.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n itinerary.legs.push(leg);\n\n }\n\n routerResponse.itineraries.push(itinerary);\n\n itinerary.distance = itinerary.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n routerResponse.from = routerResponse.itineraries[0].from;\n routerResponse.to = routerResponse.itineraries[routerResponse.itineraries.length - 1].to;\n\n return routerResponse;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(json.Lat, json.Long);\n }\n\n /**\n * @param {string} jsonDate\n * @returns {number}\n */\n jsonDateToTimestamp(jsonDate) {\n const [dateStr, timeStr] = jsonDate.split(' ');\n const [dayStr, monthStr, yearStr] = dateStr.split('/');\n const [hoursStr, minutesStr, secondsStr] = timeStr.split(':');\n\n return dateWithTimeZone(\n Number(yearStr),\n Number(monthStr) - 1,\n Number(dayStr),\n Number(hoursStr),\n Number(minutesStr),\n Number(secondsStr)\n ).getTime();\n }\n\n /**\n * @param {string} wktGeometry\n * @returns {Coordinates[]}\n */\n parseWKTGeometry(wktGeometry) {\n const tmpCoordsStr = wktGeometry.match(/LINESTRING \\((.*)\\)/i);\n const tmpCoordsPt = wktGeometry.match(/POINT \\((.*)\\)/i);\n if (!tmpCoordsStr && !tmpCoordsPt) {\n return null;\n }\n\n if (tmpCoordsPt) {\n const [lng, lat] = tmpCoordsPt[1].split(' ');\n return [new Coordinates(Number(lat), Number(lng))];\n }\n\n return tmpCoordsStr[1].split(',').map(str => {\n const sp = str.trim().split(' ');\n return new Coordinates(Number(sp[1]), Number(sp[0]));\n });\n }\n\n /**\n * @param {string} iso8601Duration\n * @see https://stackoverflow.com/a/29153059/2239938\n */\n parseDuration(iso8601Duration) {\n const iso8601DurationRegex = /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\n var matches = iso8601Duration.match(iso8601DurationRegex);\n\n // const sign = typeof matches[1] === 'undefined' ? '+' : '-',\n const years = typeof matches[2] === 'undefined' ? 0 : Number(matches[2]);\n const months = typeof matches[3] === 'undefined' ? 0 : Number(matches[3]);\n const weeks = typeof matches[4] === 'undefined' ? 0 : Number(matches[4]);\n const days = typeof matches[5] === 'undefined' ? 0 : Number(matches[5]);\n const hours = typeof matches[6] === 'undefined' ? 0 : Number(matches[6]);\n const minutes = typeof matches[7] === 'undefined' ? 0 : Number(matches[7]);\n const seconds = typeof matches[8] === 'undefined' ? 0 : Number(matches[8]);\n\n return seconds\n + minutes * 60\n + hours * 3600\n + days * 86400\n + weeks * (86400 * 7)\n + months * (86400 * 30)\n + years * (86400 * 365.25);\n }\n}\n\nexport default new CitywayRemoteRouter();\n","/* eslint-disable max-statements */\nimport { Coordinates, Utils as GeoUtils } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata, dateWithTimeZone } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\nimport IdfmRemoteRouterTokenError from './IdfmRemoteRouterTokenError.js';\n\n/**\n * List of all modes supported by the API\n * http://doc.navitia.io/#physical-mode\n */\n\nconst routingModeCorrespondance = new Map();\nroutingModeCorrespondance.set('Air', Constants.ROUTING_MODE.AIRPLANE);\nroutingModeCorrespondance.set('Boat', Constants.ROUTING_MODE.BOAT);\nroutingModeCorrespondance.set('Bus', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('BusRapidTransit', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Coach', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Ferry', Constants.ROUTING_MODE.FERRY);\nroutingModeCorrespondance.set('Funicular', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('LocalTrain', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('LongDistanceTrain', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('Metro', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('Métro', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('RailShuttle', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('RapidTransit', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Shuttle', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SuspendedCableCar', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('Taxi', Constants.ROUTING_MODE.TAXI);\nroutingModeCorrespondance.set('Train', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('RER', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('Tramway', Constants.ROUTING_MODE.TRAM);\nroutingModeCorrespondance.set('walking', Constants.ROUTING_MODE.WALK);\nroutingModeCorrespondance.set('bike', Constants.ROUTING_MODE.BIKE);\n\n/**\n * List of transports modes\n */\nconst TRANSPORT_IDS = [\n 'physical_mode:Air',\n 'physical_mode:Boat',\n 'physical_mode:Bus',\n 'physical_mode:BusRapidTransit',\n 'physical_mode:Coach',\n 'physical_mode:Ferry',\n 'physical_mode:Funicular',\n 'physical_mode:LocalTrain',\n 'physical_mode:LongDistanceTrain',\n 'physical_mode:Metro',\n 'physical_mode:RailShuttle',\n 'physical_mode:RapidTransit',\n 'physical_mode:Shuttle',\n 'physical_mode:SuspendedCableCar',\n 'physical_mode:Taxi',\n 'physical_mode:Train',\n 'physical_mode:Tramway'\n];\n\nconst clientId = '539eec73-3bb5-4327-bb5e-a52672658592';\nconst clientSecret = '899f4bb9-f1d5-45d3-9f67-530827bb6734';\n\n/**\n * Get last item of a given array\n * @param {Array} array\n * @returns {any}\n */\nfunction last(array) {\n return array[array.length - 1];\n}\n\n/**\n * Singleton.\n */\nclass IdfmRemoteRouter extends RemoteRouter {\n\n isLogged = false;\n token = null;\n expiresAt = null;\n\n /**\n * @override\n */\n get rname() {\n return 'idfm';\n }\n\n /**\n * @override\n * @throws {IdfmRemoteRouterTokenError}\n * @throws {RemoteRouterServerUnreachable}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n if (!this.canRequestService()) {\n await this._connect();\n }\n\n const url = this.getURL(endpointUrl, mode, waypoints);\n\n const res = await fetch(url, {\n method: 'GET',\n headers: { Authorization: 'Bearer ' + this.token }\n });\n if (res.status !== 200) {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }\n const response = await res.json();\n\n return this.createRouterResponseFromJson(response);\n }\n\n /**\n * @throws {IdfmRemoteRouterTokenError}\n */\n async _connect() {\n\n const details = {\n 'grant_type': 'client_credentials',\n 'scope': 'read-data',\n 'client_id': clientId,\n 'client_secret': clientSecret\n };\n\n const data = new URLSearchParams();\n for (const property in details) {\n if (details.hasOwnProperty(property)) {\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(details[property]);\n data.append(encodedKey, encodedValue);\n }\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'\n });\n\n const res = await fetch('https://idfm.getwemap.com/api/oauth/token', {\n method: 'POST',\n body: data,\n headers\n });\n if (res.status !== 200) {\n throw new IdfmRemoteRouterTokenError();\n }\n const response = await res.json();\n\n if (response.access_token) {\n this.token = response.access_token;\n this.isLogged = true;\n this.expiresAt = new Date(new Date().getTime() + response.expires_in * 1000);\n }\n }\n\n canRequestService() {\n return this.token && this.expiresAt && this.expiresAt - new Date() > 0;\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n */\n getURL(endpointUrl, mode, waypoints) {\n\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n\n const fromPlace = `from=${waypoints[0].longitude};${waypoints[0].latitude}`;\n const toPlace = `to=${waypoints[1].longitude};${waypoints[1].latitude}`;\n\n let url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}`;\n\n let query = '';\n switch (mode) {\n case Constants.ROUTING_MODE.WALK:\n query = this.getWalkingQuery();\n break;\n case Constants.ROUTING_MODE.BIKE:\n query = this.getBikeQuery();\n break;\n case Constants.ROUTING_MODE.CAR:\n query = this.getCarQuery();\n break;\n default:\n break;\n }\n\n url = `${url.origin}${url.pathname}${search}${query}`;\n\n return url;\n }\n\n getCarQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowCar = 'first_section_mode[]=walking&first_section_mode[]=car&last_section_mode[]=walking&last_section_mode[]=car';\n\n return `&${forbiddenTransport}&${allowCar}`;\n }\n\n getWalkingQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowWalking = 'first_section_mode[]=walking&last_section_mode[]=walking';\n\n return `&${forbiddenTransport}&${allowWalking}`;\n }\n\n getBikeQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowBike = 'first_section_mode[]=bike&last_section_mode[]=bike';\n\n return `&${forbiddenTransport}&${allowBike}`;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(Number(json.lat), Number(json.lon));\n }\n\n getSectionCoords(section) {\n const from = section.from.stop_point ? this.jsonToCoordinates(section.from.stop_point.coord) : this.jsonToCoordinates(section.from.address.coord);\n const to = section.to.stop_point ? this.jsonToCoordinates(section.to.stop_point.coord) : this.jsonToCoordinates(section.to.address.coord);\n\n return {\n from,\n to\n };\n }\n\n /**\n * Since the IDFM API does not provide coords for each step, we need to compute them\n * We trim the coordinates of the leg with the distance of each step and keep the last result as the coords of the step\n * @param {Leg} leg\n */\n findStepsCoord(leg) {\n const { steps, coords } = leg;\n\n const duplicatedCoords = [...coords];\n let previousStep = steps[0];\n let accumulatedIndex = 0;\n\n for (const [idx, step] of steps.entries()) {\n let newCoords;\n\n if (idx === 0) {\n step._idCoordsInLeg = 0;\n newCoords = coords[0];\n } else if (idx === steps.length - 1) {\n step._idCoordsInLeg = coords.length - 1;\n newCoords = last(coords);\n } else if (duplicatedCoords.length === 1) {\n accumulatedIndex++;\n\n step._idCoordsInLeg = accumulatedIndex;\n\n newCoords = duplicatedCoords[0];\n\n coords[step._idCoordsInLeg] = newCoords;\n } else {\n const result = GeoUtils.trimRoute(duplicatedCoords, duplicatedCoords[0], previousStep.distance);\n accumulatedIndex += result.length - 1;\n\n duplicatedCoords.splice(0, result.length - 1);\n\n step._idCoordsInLeg = accumulatedIndex;\n\n newCoords = last(result);\n\n coords[step._idCoordsInLeg] = newCoords;\n }\n\n step.coords = newCoords;\n\n previousStep = step;\n }\n }\n\n /**\n * @param {string} stringDate (e.g. 20211117T104516)\n * @returns {number}\n */\n dateStringToTimestamp(stringDate, timeZone) {\n const yearStr = stringDate.substr(0, 4);\n const monthStr = stringDate.substr(4, 2);\n const dayStr = stringDate.substr(6, 2);\n const hoursStr = stringDate.substr(9, 2);\n const minutesStr = stringDate.substr(11, 2);\n const secondsStr = stringDate.substr(13, 2);\n\n return dateWithTimeZone(\n Number(yearStr),\n Number(monthStr) - 1,\n Number(dayStr),\n Number(hoursStr),\n Number(minutesStr),\n Number(secondsStr),\n timeZone\n ).getTime();\n }\n\n /**\n * Generate multi itineraries from OTP JSON\n * @param {object} json JSON file provided by OTP.\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json) {\n\n if (!json || !json.journeys) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = this.getSectionCoords(json.journeys[0].sections[0]).from;\n routerResponse.to = this.getSectionCoords(last(json.journeys[0].sections)).to;\n\n const timeZone = json.context.timezone;\n\n for (const jsonItinerary of json.journeys) {\n\n const itinerary = new Itinerary();\n\n itinerary.duration = jsonItinerary.duration;\n itinerary.startTime = this.dateStringToTimestamp(jsonItinerary.departure_date_time, timeZone);\n itinerary.endTime = this.dateStringToTimestamp(jsonItinerary.arrival_date_time, timeZone);\n itinerary.from = routerResponse.from;\n itinerary.to = routerResponse.to;\n itinerary.distance = 0;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonSection of jsonItinerary.sections) {\n\n if (jsonSection.type === 'waiting' || jsonSection.type === 'transfer') {\n continue;\n }\n\n const leg = new Leg();\n let existingCoords = [];\n const { from, to } = this.getSectionCoords(jsonSection);\n\n leg.distance = 0;\n leg.mode = routingModeCorrespondance.get(jsonSection.mode);\n leg.duration = jsonSection.duration;\n leg.startTime = this.dateStringToTimestamp(jsonSection.departure_date_time, timeZone);\n leg.endTime = this.dateStringToTimestamp(jsonSection.arrival_date_time, timeZone);\n\n leg.from = {\n name: jsonSection.from.name,\n coords: from\n };\n\n leg.to = {\n name: jsonSection.to.name,\n coords: to\n };\n\n // A section can have multiple same coordinates, we need to remove them\n leg.coords = jsonSection.geojson.coordinates.reduce((acc, [lon, lat]) => {\n if (!existingCoords.includes(`${lon}-${lat}`)) {\n existingCoords = existingCoords.concat(`${lon}-${lat}`);\n acc.push(new Coordinates(lat, lon));\n }\n\n return acc;\n }, []);\n\n leg.steps = [];\n\n if (jsonSection.path) {\n for (const jsonPathLink of jsonSection.path) {\n const step = new Step();\n\n step.levelChange = null;\n\n step.name = jsonPathLink.name;\n step.distance = jsonPathLink.length;\n\n leg.distance += step.distance;\n leg.steps.push(step);\n }\n\n this.findStepsCoord(leg);\n }\n\n if (jsonSection.type === 'public_transport') {\n leg.transportInfo = {\n name: jsonSection.display_informations.code,\n routeColor: jsonSection.display_informations.color,\n routeTextColor: jsonSection.display_informations.text_color,\n directionName: jsonSection.display_informations.direction\n };\n\n leg.mode = routingModeCorrespondance.get(jsonSection.display_informations.physical_mode);\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = leg.transportInfo.directionName;\n legStep.levelChange = null;\n legStep.distance = jsonSection.geojson.properties[0].length;\n\n leg.steps = [legStep];\n }\n\n itinerary.distance += leg.distance;\n\n itinerary.legs.push(leg);\n\n }\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n return routerResponse;\n }\n}\n\nexport default new IdfmRemoteRouter();\n","/* eslint-disable max-statements */\n\nimport { Level, Coordinates } from '@wemap/geo';\nimport { rad2deg, positiveMod } from '@wemap/maths';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport { generateStepsMetadata } from '../RemoteRouterUtils.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Leg from '../../model/Leg.js';\nimport Step from '../../model/Step.js';\nimport LevelChange from '../../model/LevelChange.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport Constants from '../../Constants.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'driving');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'walking');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'bike');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'bus');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'walking');\n\n\n/**\n * Singleton.\n */\nclass OsrmRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'osrm';\n }\n\n /**\n * @override\n * @throws {RemoteRouterServerUnreachable}\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n const res = await fetch(url);\n if (res.status !== 200) {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }\n const response = await res.json();\n return this.createRouterResponseFromJson(response, waypoints[0], waypoints[1]);\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n\n const osrmMode = inputModeCorrespondance.get(mode);\n if (!osrmMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n\n let url = endpointUrl + '/route/v1/' + osrmMode + '/';\n url += waypoints.map(waypoint => [waypoint.longitude + ',' + waypoint.latitude]).join(';');\n url += '?geometries=geojson&overview=full&steps=true';\n\n return url;\n }\n\n /**\n * @param {Coordinates} coordinates\n * @returns {object}\n */\n coordinatesToJson(coordinates) {\n const output = [coordinates.lng, coordinates.lat];\n if (coordinates.level) {\n output.push(coordinates.level.toString());\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n const output = new Coordinates(json[1], json[0]);\n if (json.length > 2) {\n output.level = Level.fromString(json[2]);\n }\n return output;\n }\n\n nodesToJsonCoords(nodes) {\n return nodes.map(node => this.coordinatesToJson(node.coords));\n }\n\n\n getModifierFromAngle(_angle) {\n\n const angle = positiveMod(rad2deg(_angle), 360);\n\n if (angle > 0 && angle < 60) {\n return 'sharp right';\n }\n if (angle >= 60 && angle < 140) {\n return 'right';\n }\n if (angle >= 140 && angle < 160) {\n return 'slight right';\n }\n if (angle >= 160 && angle <= 200) {\n return 'straight';\n }\n if (angle > 200 && angle <= 220) {\n return 'slight left';\n }\n if (angle > 220 && angle <= 300) {\n return 'left';\n }\n if (angle > 300 && angle < 360) {\n return 'sharp left';\n }\n return 'u turn';\n }\n\n\n noRouteFoundJson(message) {\n return {\n 'code': 'NoRoute',\n message\n };\n }\n\n /**\n * @param {Itinerary} itinerary\n * @returns {object}\n */\n itineraryToOsrmJson(itinerary) {\n\n const lastLegId = itinerary.legs.length - 1;\n\n const jsonLegs = itinerary.legs.map(({ distance, duration, coords, steps }, idLeg) => {\n\n const lastStepId = steps.length - 1;\n\n return {\n distance,\n duration,\n steps: steps.map((step, idStep, arr) => {\n\n let type = idStep === 0 && idLeg === 0 ? 'depart' : 'turn';\n type = idStep === lastStepId && idLeg === lastLegId ? 'arrive' : type;\n\n const stepCoordsIdx = coords.findIndex(p => p.equalsTo(step.coords));\n const nextStepCoordsIdx = idStep === lastStepId\n ? stepCoordsIdx\n : coords.findIndex(p => p.equalsTo(arr[idStep + 1].coords));\n\n const jsonStep = {\n geometry: {\n type: 'LineString',\n coordinates: coords.slice(stepCoordsIdx, nextStepCoordsIdx + 1).map(this.coordinatesToJson)\n },\n distance: step.distance,\n duration: step.duration,\n name: step.name,\n maneuver: {\n bearing_before: rad2deg(step.previousBearing),\n bearing_after: rad2deg(step.nextBearing),\n location: this.coordinatesToJson(step.coords),\n modifier: this.getModifierFromAngle(step.angle),\n type\n }\n };\n if (step.levelChange !== null) {\n jsonStep.levelChange = step.levelChange.toJson();\n }\n if (typeof step.extras === 'object' && Object.keys(step.extras).length !== 0) {\n jsonStep.extras = step.extras;\n }\n\n return jsonStep;\n })\n };\n });\n\n return {\n 'code': 'Ok',\n 'routes': [\n {\n 'geometry': {\n 'type': 'LineString',\n 'coordinates': itinerary.coords.map(this.coordinatesToJson)\n },\n 'legs': jsonLegs,\n 'distance': itinerary.distance,\n 'duration': itinerary.duration,\n 'weight_name': 'routability',\n 'weight': 0\n }\n ],\n 'waypoints': []\n };\n }\n\n /**\n * @param {object} jsonSteps\n * @param {Coordinates[]} legCoords\n * @returns {Step[]}\n */\n parseJsonSteps(jsonSteps, legCoords) {\n\n if (!jsonSteps) {\n return [];\n }\n\n return jsonSteps.map(jsonStep => {\n\n const step = new Step();\n step.coords = this.jsonToCoordinates(jsonStep.maneuver.location);\n\n // Sometimes, OSRM step does not have the same coordinates than a point in legCoords.\n // ex: first step of https://routing.getwemap.com/route/v1/walking/2.33222164147,48.87084765712;2.3320734,48.8730212?geometries=geojson&overview=full&steps=true\n // That is why we look for the closest point.\n const distances = legCoords.map(coords => coords.distanceTo(step.coords));\n const idStepCoordsInLeg = distances.indexOf(Math.min(...distances));\n if (idStepCoordsInLeg < 0) {\n throw new Error('Osrm Parser: Cannot find step coords in leg coordinates');\n }\n step._idCoordsInLeg = idStepCoordsInLeg;\n\n step.name = jsonStep.name;\n step.levelChange = jsonStep.levelChange ? LevelChange.fromJson(jsonStep.levelChange) : null;\n\n step.distance = jsonStep.distance;\n step.duration = jsonStep.duration;\n\n if (jsonStep.extras && jsonStep.extras.subwayEntrance) {\n step.extras.subwayEntrance = true;\n if (jsonStep.extras.subwayEntranceRef) {\n step.extras.subwayEntranceRef = jsonStep.extras.subwayEntranceRef;\n }\n }\n\n return step;\n });\n }\n\n /**\n * Generate multi itineraries from OSRM JSON\n * @param {object} json JSON file provided by OSRM.\n * @param {Coordinates} from itinerary start\n * @param {Coordinates} to itinerary end\n * @param {?string} routingMode [walking|driving|bicycle]\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json, from, to, routingMode = 'walking') {\n const { routes: jsonRoutes } = json;\n\n if (!jsonRoutes) {\n return null;\n }\n\n const routingModeCorrespondance = new Map();\n routingModeCorrespondance.set('walking', 'WALK');\n routingModeCorrespondance.set('driving', 'CAR');\n routingModeCorrespondance.set('bicycle', 'BIKE');\n const mode = routingModeCorrespondance.get(routingMode) || null;\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = from;\n routerResponse.to = to;\n\n for (const jsonItinerary of jsonRoutes) {\n\n const itinerary = new Itinerary();\n\n // itinerary.coords = jsonItinerary.geometry.coordinates.map(jsonToCoordinates);\n itinerary.distance = jsonItinerary.distance;\n itinerary.duration = jsonItinerary.duration;\n itinerary.from = from;\n itinerary.to = to;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonLeg of jsonItinerary.legs) {\n\n const leg = new Leg();\n\n leg.mode = mode;\n leg.distance = jsonLeg.distance;\n leg.duration = jsonLeg.duration;\n\n leg.coords = jsonLeg.steps\n .map(step => step.geometry.coordinates.map(this.jsonToCoordinates))\n .flat()\n // Remove duplicates\n .filter((coords, idx, arr) => idx === 0 || !arr[idx - 1].equalsTo(coords));\n\n leg.from = {\n name: null,\n coords: leg.coords[0]\n };\n leg.to = {\n name: null,\n coords: leg.coords[leg.coords.length - 1]\n };\n\n leg.steps = this.parseJsonSteps(jsonLeg.steps, leg.coords);\n\n itinerary.legs.push(leg);\n }\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n\n }\n\n return routerResponse;\n }\n}\n\nexport default new OsrmRemoteRouter();\n","'use strict';\n\n/**\n * Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm)\n *\n * Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js)\n * by [Mark McClure](http://facstaff.unca.edu/mcmcclur/)\n *\n * @module polyline\n */\n\nvar polyline = {};\n\nfunction py2_round(value) {\n // Google's polyline algorithm uses the same rounding strategy as Python 2, which is different from JS for negative values\n return Math.floor(Math.abs(value) + 0.5) * (value >= 0 ? 1 : -1);\n}\n\nfunction encode(current, previous, factor) {\n current = py2_round(current * factor);\n previous = py2_round(previous * factor);\n var coordinate = current - previous;\n coordinate <<= 1;\n if (current - previous < 0) {\n coordinate = ~coordinate;\n }\n var output = '';\n while (coordinate >= 0x20) {\n output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63);\n coordinate >>= 5;\n }\n output += String.fromCharCode(coordinate + 63);\n return output;\n}\n\n/**\n * Decodes to a [latitude, longitude] coordinates array.\n *\n * This is adapted from the implementation in Project-OSRM.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Array}\n *\n * @see https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js\n */\npolyline.decode = function(str, precision) {\n var index = 0,\n lat = 0,\n lng = 0,\n coordinates = [],\n shift = 0,\n result = 0,\n byte = null,\n latitude_change,\n longitude_change,\n factor = Math.pow(10, Number.isInteger(precision) ? precision : 5);\n\n // Coordinates have variable length when encoded, so just keep\n // track of whether we've hit the end of the string. In each\n // loop iteration, a single coordinate is decoded.\n while (index < str.length) {\n\n // Reset shift, result, and byte\n byte = null;\n shift = 0;\n result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result |= (byte & 0x1f) << shift;\n shift += 5;\n } while (byte >= 0x20);\n\n latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n shift = result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result |= (byte & 0x1f) << shift;\n shift += 5;\n } while (byte >= 0x20);\n\n longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n lat += latitude_change;\n lng += longitude_change;\n\n coordinates.push([lat / factor, lng / factor]);\n }\n\n return coordinates;\n};\n\n/**\n * Encodes the given [latitude, longitude] coordinates array.\n *\n * @param {Array.<Array.<Number>>} coordinates\n * @param {Number} precision\n * @returns {String}\n */\npolyline.encode = function(coordinates, precision) {\n if (!coordinates.length) { return ''; }\n\n var factor = Math.pow(10, Number.isInteger(precision) ? precision : 5),\n output = encode(coordinates[0][0], 0, factor) + encode(coordinates[0][1], 0, factor);\n\n for (var i = 1; i < coordinates.length; i++) {\n var a = coordinates[i], b = coordinates[i - 1];\n output += encode(a[0], b[0], factor);\n output += encode(a[1], b[1], factor);\n }\n\n return output;\n};\n\nfunction flipped(coords) {\n var flipped = [];\n for (var i = 0; i < coords.length; i++) {\n var coord = coords[i].slice();\n flipped.push([coord[1], coord[0]]);\n }\n return flipped;\n}\n\n/**\n * Encodes a GeoJSON LineString feature/geometry.\n *\n * @param {Object} geojson\n * @param {Number} precision\n * @returns {String}\n */\npolyline.fromGeoJSON = function(geojson, precision) {\n if (geojson && geojson.type === 'Feature') {\n geojson = geojson.geometry;\n }\n if (!geojson || geojson.type !== 'LineString') {\n throw new Error('Input must be a GeoJSON LineString');\n }\n return polyline.encode(flipped(geojson.coordinates), precision);\n};\n\n/**\n * Decodes to a GeoJSON LineString geometry.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Object}\n */\npolyline.toGeoJSON = function(str, precision) {\n var coords = polyline.decode(str, precision);\n return {\n type: 'LineString',\n coordinates: flipped(coords)\n };\n};\n\nif (typeof module === 'object' && module.exports) {\n module.exports = polyline;\n}\n","/* eslint-disable max-statements */\nimport Polyline from '@mapbox/polyline';\n\nimport { Coordinates } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'CAR');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'WALK');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'BICYCLE');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'WALK,TRANSIT');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'WALK,TRANSIT');\n\n/**\n * Singleton.\n */\nclass OtpRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'otp';\n }\n\n /**\n * @override\n * @throws {RemoteRouterServerUnreachable}\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n const res = await fetch(url);\n if (res.status !== 200) {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }\n const response = await res.json();\n return this.createRouterResponseFromJson(response);\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n\n const otpMode = inputModeCorrespondance.get(mode);\n if (!otpMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n\n const fromPlace = `fromPlace=${waypoints[0].latitude},${waypoints[0].longitude}`;\n const toPlace = `toPlace=${waypoints[1].latitude},${waypoints[1].longitude}`;\n const queryMode = `mode=${otpMode}`;\n\n const url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}&${queryMode}`;\n\n return `${url.origin}${url.pathname}${search}`;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(json.lat, json.lon);\n }\n\n /**\n * @param {object} jsonSteps\n * @param {Coordinates[]} legCoords\n * @returns {Step[]}\n */\n parseJsonSteps(jsonSteps, legCoords) {\n\n if (!jsonSteps) {\n return [];\n }\n\n return jsonSteps.map(jsonStep => {\n\n const step = new Step();\n const stepCoords = this.jsonToCoordinates(jsonStep);\n\n // OTP step does not have the same coordinates than a point in legCoords.\n // That is why we look for the closest point.\n const distances = legCoords.map(coords => coords.distanceTo(stepCoords));\n const idStepCoordsInLeg = distances.indexOf(Math.min(...distances));\n if (idStepCoordsInLeg < 0) {\n throw new Error('OTP Parser: Cannot find closest step');\n }\n step.coords = legCoords[idStepCoordsInLeg];\n step._idCoordsInLeg = idStepCoordsInLeg;\n\n step.name = jsonStep.streetName;\n step.levelChange = null;\n\n step.distance = jsonStep.distance;\n\n return step;\n });\n }\n\n /**\n * Generate multi itineraries from OTP JSON\n * @param {object} json JSON file provided by OTP.\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json) {\n\n const { plan: jsonPlan } = json;\n\n if (!jsonPlan) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = this.jsonToCoordinates(jsonPlan.from);\n routerResponse.to = this.jsonToCoordinates(jsonPlan.to);\n\n for (const jsonItinerary of jsonPlan.itineraries) {\n\n const itinerary = new Itinerary();\n\n itinerary.duration = jsonItinerary.duration;\n itinerary.startTime = jsonItinerary.startTime;\n itinerary.endTime = jsonItinerary.endTime;\n itinerary.from = routerResponse.from;\n itinerary.to = routerResponse.to;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonLeg of jsonItinerary.legs) {\n\n const leg = new Leg();\n\n leg.mode = jsonLeg.mode;\n leg.duration = jsonLeg.duration;\n leg.startTime = jsonLeg.startTime;\n leg.endTime = jsonLeg.endTime;\n leg.from = {\n name: jsonLeg.from.name,\n coords: this.jsonToCoordinates(jsonLeg.from)\n };\n leg.to = {\n name: jsonLeg.to.name,\n coords: this.jsonToCoordinates(jsonLeg.to)\n };\n leg.coords = Polyline.decode(jsonLeg.legGeometry.points).map(([lat, lon]) => new Coordinates(lat, lon));\n\n leg.steps = this.parseJsonSteps(jsonLeg.steps, leg.coords);\n\n if (leg.mode === 'BUS' || leg.mode === 'TRAM') {\n leg.transportInfo = {\n name: jsonLeg.route,\n routeColor: jsonLeg.routeColor,\n routeTextColor: jsonLeg.routeTextColor,\n directionName: jsonLeg.headsign\n };\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = jsonLeg.headsign;\n legStep.levelChange = null;\n legStep.distance = jsonLeg.distance;\n leg.steps = [legStep];\n }\n\n // jsonLeg.distance is not reliable when compared to the array of leg coords.\n // leg.distance = jsonLeg.distance;\n leg.distance = leg.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n itinerary.legs.push(leg);\n\n }\n\n itinerary.distance = itinerary.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n return routerResponse;\n }\n}\n\nexport default new OtpRemoteRouter();\n\n","import {\n Matrix, Matrix3, Matrix4, Quaternion, Vector, Vector3\n} from '@wemap/maths';\n\n\nconst DEFAULT_RELATIVE_NOISES = {\n acc: 0.5,\n gyr: 0.3\n};\n\nconst DEFAULT_ABSOLUTE_NOISES = {\n acc: 0.5,\n gyr: 0.3,\n yc: 2\n};\n\nclass EkfAttitude {\n\n constructor(accRef = [0, 0, 1], ycRef = [-1, 0, 0]) {\n\n this.accRef = accRef;\n this.cRef = ycRef;\n\n this.P = Matrix.diag(Array(4).fill(0.1 ** 2));\n\n this.quaternion = null;\n\n\n this.noises = {\n relative: null,\n absolute: null\n };\n this.setRelativeNoises(DEFAULT_RELATIVE_NOISES);\n this.setAbsoluteNoises(DEFAULT_ABSOLUTE_NOISES);\n }\n\n setRelativeNoises(relativeNoises) {\n this.noises.relative = {\n accelerometer: Matrix.diag(Array(3).fill(relativeNoises.acc ** 2)),\n gyroscope: Matrix.diag(Array(3).fill(relativeNoises.gyr ** 2))\n };\n }\n\n\n setAbsoluteNoises(absoluteNoises) {\n this.noises.absolute = {\n accelerometer: Matrix.diag(Array(3).fill(absoluteNoises.acc ** 2)),\n gyroscope: Matrix.diag(Array(3).fill(absoluteNoises.gyr ** 2)),\n yc: Matrix.diag(Array(3).fill(absoluteNoises.yc ** 2))\n };\n }\n\n /**\n * Try to initialize filter.\n * To initialize, we need at least current acceleration (acc)\n */\n tryInitialize(acc, mag) {\n\n const accNormalized = Vector3.normalize(acc);\n\n if (mag) {\n const magNormalized = Vector3.normalize(mag);\n\n const H = Vector3.normalize(Vector3.cross(magNormalized, accNormalized));\n const M = Vector3.cross(accNormalized, H);\n\n const R = [\n [H[0], M[0], accNormalized[0]],\n [H[1], M[1], accNormalized[1]],\n [H[2], M[2], accNormalized[2]]\n ];\n\n this.quaternion = Quaternion.fromMatrix3(R);\n\n } else {\n\n const r = Vector3.dot(accNormalized, this.accRef) + 1;\n const v = Vector3.cross(accNormalized, this.accRef);\n\n let quaternion = [r, v[0], v[1], v[2]];\n quaternion = Quaternion.normalize(quaternion);\n\n this.quaternion = quaternion;\n }\n\n return this.quaternion;\n }\n\n update(diffTime, acc, gyr, mag) {\n\n if (!this.quaternion) {\n return this.tryInitialize(acc, mag);\n }\n\n let q = this.quaternion;\n\n /* ------------\n * ESTIMATION\n * ------------*/\n\n const qArray = q;\n const gyrInt = Vector3.multiplyScalar(gyr, 0.5 * diffTime);\n const F = this.computeC([1, gyrInt[0], gyrInt[1], gyrInt[2]]);\n const qAPriori = Matrix.multiplyVector(F, q);\n const E1 = Matrix.diag([qArray[0], qArray[0], qArray[0]]);\n const eSkew = Matrix3.skew([qArray[1], qArray[2], qArray[3]]);\n\n const qPart = [-1 * qArray[1], -1 * qArray[2], -1 * qArray[3]];\n const E = Matrix.concatRow([qPart], Matrix3.add(eSkew, E1));\n\n const Qk = Matrix.multiplyScalar(\n Matrix.multiply(\n Matrix.multiply(E, this.noises[mag ? 'absolute' : 'relative'].gyroscope),\n Matrix.transpose(E)\n ),\n (diffTime / 2) ** 2\n );\n\n const pAPriori = Matrix4.add(\n Matrix.multiply(\n Matrix.multiply(F, this.P),\n Matrix.transpose(F)\n ),\n Qk\n );\n\n /* ------------\n * CORRECTION\n * ------------*/\n\n const accNormalized = Vector3.normalize(acc);\n let dz, K, H;\n\n if (mag) {\n\n const magNormalized = Vector3.normalize(mag);\n const yc = Vector3.cross(accNormalized, magNormalized);\n const ycNormalized = Vector3.normalize(yc);\n\n const dzYc = Vector3.subtract(ycNormalized, Quaternion.rotate(qAPriori, this.cRef));\n const dzAcc = Vector3.subtract(accNormalized, Quaternion.rotate(qAPriori, this.accRef));\n dz = Vector.concat(dzYc, dzAcc);\n\n const HYc = this.jacobianES(qAPriori, this.cRef);\n const HAcc = this.jacobianES(qAPriori, this.accRef);\n H = Matrix.concatRow(HYc, HAcc);\n\n const RYc = Matrix.concatLine(this.noises.absolute.yc, Matrix3.zeros);\n const RAcc = Matrix.concatLine(Matrix3.zeros, this.noises.absolute.accelerometer);\n const R = Matrix.concatRow(RYc, RAcc);\n\n K = Matrix.multiply(\n Matrix.multiply(pAPriori, Matrix.transpose(H)),\n Matrix.inverse(\n Matrix.add(\n Matrix.multiply(\n Matrix.multiply(H, pAPriori),\n Matrix.transpose(H)\n ),\n R\n )\n )\n );\n } else {\n dz = Vector3.subtract(accNormalized, Quaternion.rotate(qAPriori, this.accRef));\n H = this.jacobianES(qAPriori, this.accRef);\n const R = this.noises.relative.accelerometer;\n\n K = Matrix.multiply(\n Matrix.multiply(pAPriori, Matrix.transpose(H)),\n Matrix3.inverse(\n Matrix3.add(\n Matrix.multiply(\n Matrix.multiply(H, pAPriori),\n Matrix.transpose(H)\n ),\n R\n )\n )\n );\n }\n\n q = Quaternion.add(\n qAPriori,\n Matrix.multiplyVector(K, dz)\n );\n const P = Matrix.multiply(\n Matrix4.subtract(\n Matrix4.identity,\n Matrix.multiply(K, H)\n ),\n pAPriori\n );\n\n q = Quaternion.normalize(q);\n this.quaternion = q;\n this.P = P;\n\n return q;\n }\n\n computeC(b) {\n return [\n [b[0], -b[1], -b[2], -b[3]],\n [b[1], b[0], b[3], -b[2]],\n [b[2], -b[3], b[0], b[1]],\n [b[3], b[2], -b[1], b[0]]\n ];\n }\n\n jacobianES(q, v) {\n\n const [qw, qx, qy, qz] = q;\n const [vx, vy, vz] = v;\n\n return [\n [2 * qz * vy - 2 * qy * vz, 2 * qy * vy + 2 * qz * vz, 2 * qx * vy - 2 * qw * vz - 4 * qy * vx, 2 * qw * vy + 2 * qx * vz - 4 * qz * vx],\n [2 * qx * vz - 2 * qz * vx, 2 * qw * vz - 4 * qx * vy + 2 * qy * vx, 2 * qx * vx + 2 * qz * vz, 2 * qy * vz - 2 * qw * vx - 4 * qz * vy],\n [2 * qy * vx - 2 * qx * vy, 2 * qz * vx - 4 * qx * vz - 2 * qw * vy, 2 * qw * vx - 4 * qy * vz + 2 * qz * vy, 2 * qx * vx + 2 * qy * vy]\n ];\n }\n}\n\nexport default EkfAttitude;\n","import { Attitude } from '@wemap/geo';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport EkfAttitude from '../EkfAttitude.js';\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\n\nimport Accelerometer from '../../imu/Accelerometer.js';\nimport Gyroscope from '../../imu/Gyroscope.js';\n\n\n/**\n * Relative attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation\n * The provider does not work until an offset is given.\n */\nclass RelativeAttitudeFromEkf extends Provider {\n\n lastTimestamp = 0;\n\n /**\n * @override\n */\n constructor(context) {\n super(context);\n this.ekfAttitude = new EkfAttitude();\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromEkf';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n Accelerometer.availability,\n Gyroscope.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n this.accelerometerProviderId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.gyroscopeProviderId = Gyroscope.addEventListener(\n events => (this.gyroscopeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.accelerometerProviderId);\n Gyroscope.removeEventListener(this.gyroscopeProviderId);\n }\n\n /**\n * @private\n */\n onAccelerometerEvent = accelerationEvent => {\n\n if (!this.gyroscopeEvent) {\n return;\n }\n\n const {\n values: acceleration, timestamp\n } = accelerationEvent.data;\n\n // Handle timestamps and dt\n if (this.lastTimestamp === 0) {\n this.lastTimestamp = timestamp;\n return;\n }\n const diffTime = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n\n const quaternion = this.ekfAttitude.update(diffTime, acceleration, this.gyroscopeEvent.data.values);\n\n if (quaternion) {\n const attitude = new Attitude(quaternion,\n timestamp,\n RelativeAttitudeFromInertial.DEFAULT_DRIFT\n );\n this.notify(this.createEvent(\n EventType.RelativeAttitude,\n attitude,\n [accelerationEvent, this.gyroscopeEvent]));\n }\n };\n}\n\nexport default new RelativeAttitudeFromEkf();\n","import { Attitude } from '@wemap/geo';\nimport { Rotations } from '@wemap/maths';\nimport { BrowserUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AskImuOnDesktopError from '../../../errors/AskImuOnDesktopError.js';\nimport MissingSensorError from '../../../errors/MissingSensorError.js';\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\n\n\n/**\n * Relative attitude provider gives the device attitude in a custom frame (x-right, y-front, z-up) using\n * browser deviceorientation\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via deviceorientation but deviceorientation.alpha is unreliable! Sometimes it starts at 0°, sometimes at 270°)\n * Safari iOS (v12.0): YES (via deviceorientation)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/ondeviceorientation}\n * Firefox Android (v65.0.1): YES (via deviceorientation)\n *\n * -----------------------------------\n */\nclass RelativeAttitudeFromBrowser extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromBrowser';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n const subscribe = () => window.addEventListener('deviceorientation', this.onDeviceOrientationEvent, true);\n\n if (typeof (DeviceOrientationEvent) !== 'undefined' && typeof (DeviceOrientationEvent.requestPermission) === 'function') {\n DeviceOrientationEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n }\n\n /**\n * @override\n */\n stop() {\n window.removeEventListener('deviceorientation', this.onDeviceOrientationEvent, true);\n }\n\n\n onDeviceOrientationEvent = e => {\n\n if (typeof e.alpha !== 'number' || typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientation'));\n return;\n }\n\n const quaternion = Rotations.eulerToQuaternionZXYDegrees([e.alpha, e.beta, e.gamma]);\n const attitude = new Attitude(quaternion,\n e.timeStamp / 1e3,\n RelativeAttitudeFromInertial.DEFAULT_DRIFT\n );\n this.notify(this.createEvent(EventType.RelativeAttitude, attitude));\n };\n}\n\nexport default new RelativeAttitudeFromBrowser();\n","import { Attitude } from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport EventType from '../../../events/EventType.js';\nimport RelativeAttitudeFromEkf from './RelativeAttitudeFromEkf.js';\nimport RelativeAttitudeFromBrowser from './RelativeAttitudeFromBrowser.js';\nimport HighRotationsDetector from '../../imu/HighRotationsDetector.js';\n\n\nclass RelativeAttitudeFromInertial extends Provider {\n\n /**\n * default relative attitude drift in rad.second-1\n */\n DEFAULT_DRIFT = deg2rad(5) / 60;\n\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromInertial';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n RelativeAttitudeFromEkf.availability,\n RelativeAttitudeFromBrowser.availability,\n HighRotationsDetector.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n RelativeAttitudeFromEkf.availability\n .then(() => (this.provider = RelativeAttitudeFromEkf))\n .catch(() => (this.provider = RelativeAttitudeFromBrowser))\n .finally(() => {\n this.listenerId = this.provider.addEventListener(\n events => this._parseEvent(events[0]),\n error => this.notifyError(error)\n );\n this._highRotationsDetector = HighRotationsDetector.addEventListener(\n () => {},\n error => this.notifyError(error)\n );\n });\n }\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _parseEvent(event) {\n const relativeAttitudeEvent = event.clone();\n if (HighRotationsDetector.isInProgress()) {\n let accuracy = relativeAttitudeEvent.data.accuracy + (this.DEFAULT_DRIFT * 100);\n accuracy = Math.min(accuracy, Math.PI);\n relativeAttitudeEvent.data.accuracy = accuracy;\n }\n this.notify(relativeAttitudeEvent);\n }\n\n /**\n * @override\n */\n stop() {\n if (this.provider) {\n this.provider.removeEventListener(this.listenerId);\n this.provider = null;\n }\n HighRotationsDetector.removeEventListener(this._highRotationsDetector);\n }\n}\n\nexport default new RelativeAttitudeFromInertial();\n","class MissingArCoreError extends Error {\n\n static DEFAULT_MESSAGE = 'ARCore is missing';\n\n constructor(message) {\n super(message || MissingArCoreError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingArCoreError;\n","class MissingNativeInterfaceError extends Error {\n\n static DEFAULT_MESSAGE = 'Native interface is missing';\n\n constructor(message) {\n super(message || MissingNativeInterfaceError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingNativeInterfaceError;\n","/* eslint-disable no-bitwise */\nimport {\n Attitude, RelativePosition\n} from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\nimport { TimeUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport MissingArCoreError from '../../../errors/MissingArCoreError.js';\nimport MissingNativeInterfaceError from '../../../errors/MissingNativeInterfaceError.js';\nimport ProviderState from '../../ProviderState.js';\nclass ArCore extends Provider {\n\n static Payload = {\n Pose: {\n ref: 2 ** 0,\n size: 7\n },\n Barcode: {\n ref: 2 ** 1,\n size: 1\n },\n ProjMat: {\n ref: 2 ** 2,\n size: 16\n },\n ImageRef: {\n ref: 2 ** 3,\n size: 1\n }\n };\n\n /**\n * default relative attitude drift in rad.second-1\n */\n static RELATIVE_ATTITUDE_DRIFT = deg2rad(3) / 60;\n\n previousPosition = [0, 0, 0];\n\n /**\n * @override\n */\n static get pname() {\n return 'ArCore';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude, EventType.RelativePosition, EventType.Barcode];\n }\n\n\n /**\n * @override\n */\n start() {\n if (this.nativeProvider) {\n this.nativeProvider.start();\n }\n\n this.pullDataLoop();\n }\n\n /**\n * @override\n */\n stop() {\n if (this.nativeProvider) {\n this.nativeProvider.stop();\n }\n }\n\n pullDataLoop = () => {\n\n if (this.state === ProviderState.STOPPPED) {\n return;\n }\n\n const payload = JSON.parse(this.nativeProvider.getInfo());\n if (payload.length > 1) {\n this.parsePayload(payload);\n }\n requestAnimationFrame(this.pullDataLoop);\n }\n\n parsePayload(payload) {\n\n const ref = payload[0];\n let bufferIndex = 1;\n\n const events = [];\n\n const time = TimeUtils.preciseTime() / 1e3;\n\n if (ref & ArCore.Payload.Pose.ref) {\n\n const attitude = new Attitude(\n payload.slice(bufferIndex, bufferIndex + 4),\n time,\n this.constructor.RELATIVE_ATTITUDE_DRIFT,\n );\n events.push(this.createEvent(EventType.RelativeAttitude, attitude));\n\n const newPosition = [payload[bufferIndex + 4], payload[bufferIndex + 5], payload[bufferIndex + 6]];\n const position = new RelativePosition(\n newPosition[0] - this.previousPosition[0],\n newPosition[1] - this.previousPosition[1],\n newPosition[2] - this.previousPosition[2],\n time,\n 1e-4\n );\n this.previousPosition = newPosition;\n events.push(this.createEvent(EventType.RelativePosition, position));\n\n bufferIndex += ArCore.Payload.Pose.size;\n }\n\n if (ref & ArCore.Payload.Barcode.ref) {\n events.push(this.createEvent(EventType.Barcode, payload[bufferIndex]));\n bufferIndex += ArCore.Payload.Barcode.size;\n }\n\n if (ref & ArCore.Payload.ProjMat.ref) {\n const projMatrix = payload.slice(bufferIndex, bufferIndex + ArCore.Payload.ProjMat.size);\n events.push(this.createEvent(EventType.CameraProjectionMatrix, projMatrix));\n bufferIndex += ArCore.Payload.ProjMat.size;\n }\n\n if (events.length !== 0) {\n this.notify(...events);\n }\n }\n\n\n get nativeProvider() {\n\n if (!this._nativeProvider) {\n\n if (!this.nativeInterface) {\n throw new MissingNativeInterfaceError();\n }\n\n this._nativeProvider = this.nativeInterface.getArCoreProvider();\n if (!this._nativeProvider) {\n throw new MissingArCoreError();\n }\n\n }\n\n return this._nativeProvider;\n }\n\n /**\n * @override\n */\n get _availability() {\n try {\n const nativeProvider = this.nativeProvider;\n\n if (!nativeProvider.checkAvailability()) {\n return Promise.reject(new MissingArCoreError());\n }\n\n } catch (e) {\n return Promise.reject(e);\n }\n\n return Promise.resolve();\n }\n\n enableBarcodeScanner() {\n try {\n this.nativeProvider.enableBarcodeScanner();\n } catch (e) {\n this.notifyError(e);\n }\n }\n\n disableBarcodeScanner() {\n try {\n this.nativeProvider.disableBarcodeScanner();\n } catch (e) {\n this.notifyError(e);\n }\n }\n\n /**\n * @override\n */\n static get useCameraNatively() {\n return true;\n }\n}\n\nexport default new ArCore();\n","import Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport ProviderState from '../../ProviderState.js';\n\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\nimport ArCore from '../../position/relative/ArCore.js';\n\n/**\n * Relative attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation\n * The provider does not work until an offset is given.\n */\nclass RelativeAttitude extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitudeFromInertial.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.arCoreMonitoringId = ArCore.addMonitoringListener(\n () => {\n this.listenArCore();\n this.unlistenInertial();\n }, () => {\n this.unlistenArCore();\n this.listenInertial();\n });\n\n if (ArCore.state === ProviderState.STARTED) {\n this.listenArCore();\n } else {\n this.listenInertial();\n }\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeMonitoringListener(this.arCoreMonitoringId);\n this.unlistenArCore();\n this.unlistenInertial();\n }\n\n\n listenInertial = () => {\n this.inertialProviderId = RelativeAttitudeFromInertial.addEventListener(\n events => this.notify(events[0].clone()),\n error => this.notifyError(error)\n );\n }\n\n unlistenInertial = () => {\n RelativeAttitudeFromInertial.removeEventListener(this.inertialProviderId);\n }\n\n listenArCore = () => {\n this.arCoreProviderId = ArCore.addEventListener(\n events => {\n const relativeAttitudeEvent = events.find(event => event.dataType === EventType.RelativeAttitude);\n if (relativeAttitudeEvent) {\n this.notify(relativeAttitudeEvent.clone());\n }\n },\n () => {},\n false\n );\n };\n\n unlistenArCore = () => {\n ArCore.removeEventListener(this.arCoreProviderId);\n }\n}\n\nexport default new RelativeAttitude();\n","import { std } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitude from './relative/RelativeAttitude.js';\nimport Provider from '../Provider.js';\n\nclass TurnDetector extends Provider {\n\n // in seconds\n static SLIDING_WINDOW_TIME = 0.3;\n\n static STD_THRESHOLD = 0.075;\n\n /** @type {number} in seconds */\n static CONSIDER_TURN_UNTIL = 1;\n\n /** @type {number[]} */\n slidingWindow = [];\n\n /**\n * @override\n */\n static get pname() {\n return 'TurnDetector';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Turn];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitude.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = RelativeAttitude.addEventListener(\n events => this._parseRelativeAttitude(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n RelativeAttitude.removeEventListener(this.providerId);\n }\n\n isTurning() {\n if (!this.lastEvent || !RelativeAttitude.lastEvent) {\n return false;\n }\n\n const diffTime = RelativeAttitude.lastEvent.data.time - this.lastEvent.data.timestamp;\n return diffTime < TurnDetector.CONSIDER_TURN_UNTIL;\n }\n\n /**\n * @private\n */\n _parseRelativeAttitude = relativeAttitudeEvent => {\n\n const { heading, time: timestamp } = relativeAttitudeEvent.data;\n\n this.slidingWindow = this.slidingWindow.filter(item => item[0] >= timestamp - TurnDetector.SLIDING_WINDOW_TIME);\n this.slidingWindow.push([timestamp, heading]);\n\n const stdVal = std(this.slidingWindow.map(item => item[1]));\n if (stdVal > TurnDetector.STD_THRESHOLD) {\n this.notify(this.createEvent(EventType.Turn, { timestamp }, [relativeAttitudeEvent]));\n }\n\n }\n}\n\nexport default new TurnDetector();\n","const Constants = {\n DEFAULT_ALTITUDE: 1.6\n};\n\nexport default Constants;\n","class StepDetectionMinMaxPeaks2 {\n\n // in seconds\n static WINDOW_TIME = 0.3;\n\n // in seconds\n static MIN_TIME_BETWEEN_STEPS = 0.4;\n\n // in Hz\n static MAX_FRENQUENCY = 4;\n static MIN_FRENQUENCY = 1;\n\n // in m.s-2\n static VERTICAL_ACC_POSITIVE_PEAK_THRESHOLD = 0.75;\n static VERTICAL_ACC_NEGATIVE_PEAK_THRESHOLD = -0.3;\n\n\n constructor() {\n this.slidingWindow = [];\n\n this.lastStepTimestamp = -StepDetectionMinMaxPeaks2.MIN_TIME_BETWEEN_STEPS;\n this.previousVerticalAcc = 0;\n this.influence = 0.2;\n }\n\n\n compute(timestamp, linearAcc, angularRate) {\n\n const verticalAcc = this.influence * (linearAcc[2] * 2) + (1 - this.influence) * this.previousVerticalAcc;\n this.previousVerticalAcc = verticalAcc;\n\n\n if (Math.sqrt(angularRate[0] ** 2 + angularRate[1] ** 2 + angularRate[2] ** 2) > 0.75) {\n return false;\n }\n\n if (this.lastStepTimestamp && this.lastStepTimestamp + StepDetectionMinMaxPeaks2.MIN_TIME_BETWEEN_STEPS > timestamp) {\n return false;\n }\n\n let maxValue = Number.MIN_SAFE_INTEGER;\n let minValue = Number.MAX_SAFE_INTEGER;\n\n this.slidingWindow.forEach(function(item, index, object) {\n if (item.timestamp < timestamp - StepDetectionMinMaxPeaks2.WINDOW_TIME) {\n object.splice(index, 1);\n } else {\n maxValue = Math.max(item.verticalAcc, maxValue);\n minValue = Math.min(item.verticalAcc, minValue);\n }\n });\n this.slidingWindow.push({\n timestamp: timestamp,\n verticalAcc: verticalAcc\n });\n\n\n if (maxValue > StepDetectionMinMaxPeaks2.VERTICAL_ACC_POSITIVE_PEAK_THRESHOLD\n && minValue < StepDetectionMinMaxPeaks2.VERTICAL_ACC_NEGATIVE_PEAK_THRESHOLD) {\n\n const timeInterval = this.lastStepTimestamp ? timestamp - this.lastStepTimestamp : 1;\n this.frequency = Math.min(Math.max((1 / timeInterval), StepDetectionMinMaxPeaks2.MIN_FRENQUENCY), StepDetectionMinMaxPeaks2.MAX_FRENQUENCY);\n\n this.lastStepTimestamp = timestamp;\n return true;\n }\n\n return false;\n }\n\n get lastStepSize() {\n\n if (!this.frequency) {\n return 0;\n }\n\n const kParamA = 0.45;\n const kParamB = 0.2;\n return kParamA + kParamB * this.frequency;\n }\n\n get speed() {\n return this.lastStepSize && this.frequency ? this.lastStepSize * this.frequency : 0;\n }\n\n mean(data) {\n let sum = 0.0, mean = 0.0;\n\n for (let i = 0; i < data.length; ++i) {\n sum += data[i].verticalAcc;\n }\n mean = sum / data.length;\n return mean;\n }\n\n stddev(data) {\n const theMean = this.mean(data);\n let standardDeviation = 0;\n for (let i = 0; i < data.length; ++i) {\n standardDeviation += (data[i].verticalAcc - theMean) ** 2;\n }\n\n return Math.sqrt(standardDeviation / data.length);\n }\n}\n\nexport default StepDetectionMinMaxPeaks2;\n","import { Constants as GeoConstants } from '@wemap/geo';\nimport { Quaternion } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitudeFromInertial from '../attitude/relative/RelativeAttitudeFromInertial.js';\nimport Accelerometer from '../imu/Accelerometer.js';\nimport Gyroscope from '../imu/Gyroscope.js';\nimport Provider from '../Provider.js';\nimport StepDetectionMinMaxPeaks2 from './StepDetectionMinMaxPeaks2.js';\n\n\nclass StepDetector extends Provider {\n\n constructor() {\n super();\n this.stepDetector = new StepDetectionMinMaxPeaks2();\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'StepDetector';\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n Accelerometer.availability,\n Gyroscope.availability,\n RelativeAttitudeFromInertial.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n this.numOfSteps = 0;\n\n this.accelerometerProviderId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.gyroscopeProviderId = Gyroscope.addEventListener(\n events => (this.angularRateEvent = events[0]),\n error => this.notifyError(error)\n );\n\n this.attitudeProviderId = RelativeAttitudeFromInertial.addEventListener(\n events => (this.attitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.accelerometerProviderId);\n Gyroscope.removeEventListener(this.gyroscopeProviderId);\n RelativeAttitudeFromInertial.removeEventListener(this.attitudeProviderId);\n }\n\n onAccelerometerEvent(accelerationEvent) {\n\n if (!this.attitudeEvent || !this.angularRateEvent) {\n return;\n }\n\n const {\n values: acceleration, timestamp\n } = accelerationEvent.data;\n\n /**\n * Step Detection and Step Size Detection\n */\n const linearAcc = this.constructor.computeLinearAcceleration(\n this.attitudeEvent.data.quaternion, acceleration);\n const stepDetected = this.stepDetector.compute(timestamp, linearAcc, this.angularRateEvent.data.values);\n\n if (stepDetected) {\n const size = this.stepDetector.lastStepSize;\n this.numOfSteps++;\n this.notify(this.createEvent(\n EventType.Step, {\n size,\n number: this.numOfSteps\n },\n [accelerationEvent, this.angularRateEvent, this.attitudeEvent]\n ));\n }\n }\n\n // Linear acceleration in ENU\n static computeLinearAcceleration(quaternion, acc) {\n const linearAcc = Quaternion.rotate(Quaternion.inverse(quaternion), acc);\n linearAcc[2] -= GeoConstants.EARTH_GRAVITY;\n return linearAcc;\n }\n}\n\nexport default new StepDetector();\n","import Provider from '../Provider.js';\nimport StepDetector from './StepDetector.js';\nimport TurnDectector from '../attitude/TurnDectector.js';\nimport EventType from '../../events/EventType.js';\n\nclass StraightLineDetector extends Provider {\n\n /** @type {number} */\n static STEPS_CONSIDERED_FOR_STRAIGHT_LINE = 2;\n\n /** @type {number?} */\n _turnDetectorProviderId = null;\n\n /** @type {number?} */\n _stepDetectorProviderId = null;\n\n /** @type {number} */\n _countSteps = 0;\n\n /**\n * @override\n */\n static get pname() {\n return 'StraightLineDetector';\n }\n\n /**\n * @override\n */\n start() {\n this._turnDetectorProviderId = TurnDectector.addEventListener(this._onTurn);\n this._stepDetectorProviderId = StepDetector.addEventListener(this._onStep);\n }\n\n /**\n * @override\n */\n stop() {\n TurnDectector.removeEventListener(this._turnDetectorProviderId);\n StepDetector.removeEventListener(this._stepDetectorProviderId);\n }\n\n _onTurn = (event) => {\n if (this._countSteps >= StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE) {\n\n const fromEvents = [event];\n if (StepDetector.lastEvent !== null) {\n fromEvents.push(StepDetector.lastEvent);\n }\n\n this.notify(this.createEvent(EventType.StraightLine, false, fromEvents));\n\n }\n this._countSteps = 0;\n }\n\n _onStep = (event) => {\n this._countSteps++;\n\n if (this._countSteps === StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE) {\n\n const fromEvents = [event];\n if (TurnDectector.lastEvent !== null) {\n fromEvents.push(TurnDectector.lastEvent);\n }\n this.notify(this.createEvent(EventType.StraightLine, true, fromEvents));\n\n }\n\n }\n\n /**\n * @returns {boolean}\n */\n isStraight() {\n return this._countSteps >= StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE;\n }\n\n get numStepsDetectedFromLastTurn() {\n return this._countSteps;\n }\n}\n\nexport default new StraightLineDetector();\n","/* eslint-disable max-statements */\nimport {\n AbsoluteHeading, GraphEdge, MapMatching, Network, GraphProjection, UserPosition\n} from '@wemap/geo';\nimport { deg2rad, diffAngle, diffAngleLines } from '@wemap/maths';\nimport { Itinerary } from '@wemap/routers';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../events/EventType.js';\nimport ProviderEvent from '../events/ProviderEvent.js';\n\nimport AbsoluteAttitude from '../providers/attitude/absolute/AbsoluteAttitude.js';\nimport AbsoluteAttitudeFromBrowser from '../providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js';\nimport TurnDectector from '../providers/attitude/TurnDectector.js';\nimport Constants from '../providers/Constants.js';\nimport AbsolutePosition from '../providers/position/absolute/AbsolutePosition.js';\nimport Provider from '../providers/Provider.js';\nimport ProviderState from '../providers/ProviderState.js';\nimport StepDetector from '../providers/steps/StepDetector.js';\nimport StraightLineDetector from '../providers/steps/StraightLineDetector.js';\nimport ProvidersOptions from '../ProvidersOptions.js';\n\nclass MapMatchingHandler extends Provider {\n\n /** @type {number} in radians */\n static MM_MAX_ANGLE = deg2rad(30);\n\n /** @type {number} in meters */\n static MM_MAX_DIST = 30;\n\n /** @type {number} in meters */\n static MM_MIN_DIST = 0;\n\n /** @type {boolean} */\n static ORIENTATION_MATCHING = true;\n\n /** @type {boolean} */\n static USE_ITINERARY_START_AS_POSITION = true;\n\n /** @type {number} in meters */\n static MM_HUGE_JUMP_DISTANCE = 3;\n\n /** @type {number} */\n static MIN_STEPS_BETWEEN_ORIENTATION_MATCHING = 3;\n\n /** @type {number} */\n static MIN_STEPS_FOR_ORIENTATION_MATCHING = 5;\n\n /** @type {number} */\n static LAST_PROJECTIONS_WINDOW_SIZE = 3;\n\n /** @type {number} */\n static LAST_PROJECTIONS_EDGE_ANGLE_THRESHOLD = deg2rad(3);\n\n /** @type {MapMatching} */\n _mapMatching;\n\n /** @type {number} */\n _mapMatchingMinDistance;\n\n /** @type {boolean} */\n _internalProvidersStarted = false;\n\n /** @type {number?} */\n _straightLineDetectorProviderId;\n\n /** @type {number?} */\n _turnDetectorProviderId;\n\n /** @type {number?} */\n _stepDetectorProviderId;\n\n /** @type {GraphProjection[]} */\n _projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n\n /** @type {number} */\n _countStepsFromLastMatching = 0;\n\n /** @type {GraphProjection[]} */\n _lastProjections = [];\n\n\n constructor() {\n super();\n\n this._mapMatching = new MapMatching();\n this._mapMatching.maxDistance = MapMatchingHandler.MM_MAX_DIST;\n this._mapMatching.maxAngleBearing = MapMatchingHandler.MM_MAX_ANGLE;\n this._mapMatchingMinDistance = MapMatchingHandler.MM_MIN_DIST;\n }\n\n /**\n * @override\n */\n start() {\n if (this.network) {\n this._startInternalProviders();\n }\n }\n\n /**\n * @override\n */\n stop() {\n this._stopInternalProviders();\n }\n\n _manageStartStop = () => {\n if (this.network && !this._internalProvidersStarted) {\n this._startInternalProviders();\n } else if (!this.network && this._internalProvidersStarted) {\n this._stopInternalProviders();\n }\n }\n\n _startInternalProviders() {\n\n if (this.enabled && this._internalProvidersStarted) {\n return;\n }\n\n this._straightLineDetectorProviderId = StraightLineDetector.addEventListener();\n this._turnDetectorProviderId = TurnDectector.addEventListener();\n this._stepDetectorProviderId = StepDetector.addEventListener(() => (this._countStepsFromLastMatching++));\n\n this._internalProvidersStarted = true;\n }\n\n _stopInternalProviders() {\n\n if (this.enabled && !this._internalProvidersStarted) {\n return;\n }\n\n StraightLineDetector.removeEventListener(this._straightLineDetectorProviderId);\n TurnDectector.removeEventListener(this._turnDetectorProviderId);\n StepDetector.removeEventListener(this._stepDetectorProviderId);\n\n this._internalProvidersStarted = false;\n }\n\n get enabled() {\n return ProvidersOptions.useMapMatching;\n }\n\n /** @type {?Network} */\n get network() {\n return this._mapMatching.network;\n }\n\n /** @type {?Network} */\n set network(network) {\n\n this._mapMatching.network = network;\n this.notify(this.createEvent(EventType.Network, network));\n\n this._manageStartStop();\n\n if (this.canUseMapMatching()) {\n // TODO if necessary\n // this._notifyPositionFromNetworkInput(network);\n }\n }\n\n /** @type {?Itinerary} */\n set itinerary(itinerary) {\n\n this._mapMatching.network = itinerary ? itinerary.toNetwork() : null;\n this.notify(this.createEvent(EventType.Itinerary, itinerary));\n\n this._manageStartStop();\n\n if (this.canUseMapMatching()) {\n this._notifyPositionFromItineraryInput(itinerary);\n }\n }\n\n /**\n * @returns {boolean}\n */\n canUseMapMatching() {\n return this.enabled && this.network;\n }\n\n /**\n * @param {Itinerary} itinerary\n */\n _notifyPositionFromItineraryInput(itinerary) {\n\n if (!MapMatchingHandler.USE_ITINERARY_START_AS_POSITION || itinerary.start) {\n return;\n }\n\n const lastEvent = AbsolutePosition.lastEvent;\n const lastPosition = lastEvent ? lastEvent.data : null;\n\n const notify = (pos) => {\n const newEvent = lastEvent\n ? lastEvent.clone()\n : new ProviderEvent(EventType.AbsolutePosition);\n newEvent.data = pos;\n AbsolutePosition.notify(newEvent);\n };\n\n // In case of an itinerary, use itinerary start as new position,\n // but add the distance between lastPosition and itinerary start for the accuracy\n const newPosition = UserPosition.fromCoordinates(itinerary.from);\n\n if (lastPosition) {\n newPosition.alt = lastPosition.alt;\n newPosition.time = lastPosition.time;\n newPosition.accuracy = lastPosition.accuracy + newPosition.distanceTo(lastPosition);\n newPosition.bearing = lastPosition.bearing;\n } else if (itinerary.coords >= 2) {\n newPosition.alt = Constants.DEFAULT_ALTITUDE;\n newPosition.time = TimeUtils.preciseTime();\n newPosition.accuracy = 0;\n newPosition.bearing = itinerary.coords[0].bearingTo(itinerary.coords[1]);\n } else {\n return;\n }\n\n // if the distance between itinerary.start and itinerary.nodes[0] is less than MM_MAX_DIST,\n // projection.projection is itinerary.nodes[0]\n const projection = this.getProjection(newPosition, true);\n if (projection) {\n notify(projection.projection);\n // Do not notify for attitude projection because bearing has not been used.\n } else {\n // This means the first position is far from the network and the user has\n // to reach itinerary.nodes[0] before to continue\n notify(newPosition);\n }\n return;\n }\n\n /**\n * @param {ProviderEvent<UserPosition>} newPositionEvent\n */\n notifyPositionFromFeed(newPositionEvent) {\n\n const projection = this.getProjection(newPositionEvent.data, true, false);\n if (!projection) {\n AbsolutePosition.notify(newPositionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projection.projection,\n [newPositionEvent]\n ));\n }\n\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n */\n notifyPositionFromAbsolute(positionEvent) {\n\n const newPosition = positionEvent.data;\n\n let projectionWithBearing = null;\n if (newPosition.bearing !== null) {\n projectionWithBearing = this.getProjection(newPosition, true, true);\n }\n\n if (!projectionWithBearing) {\n // Verify if the newPosition is far enough from the network to be used by the system.\n const projectionWithoutBearing = this.getProjection(newPosition, true, false);\n if (!projectionWithoutBearing) {\n // In this case, the newPosition is far enough and can be used safely.\n AbsolutePosition.notify(positionEvent);\n }\n return;\n }\n\n // newPosition must not be used after this line\n\n const thisWillBeAHugeJump = projectionWithBearing.distanceFromNearestElement > MapMatchingHandler.MM_HUGE_JUMP_DISTANCE;\n\n // In case of a huge jump, be sure the user is in a straight line\n if (thisWillBeAHugeJump && !StraightLineDetector.isStraight()) {\n return;\n }\n\n // Detector to avoid big jumps in the wrong direction\n if (thisWillBeAHugeJump && this._detectWrongBigJump(projectionWithBearing)) {\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projectionWithBearing.projection,\n [positionEvent]\n ));\n\n this.tryOrientationMatching(projectionWithBearing);\n\n }\n\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n */\n notifyPositionFromRelative(positionEvent) {\n\n if (TurnDectector.isTurning()) {\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections = [];\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n const newPosition = positionEvent.data;\n const projection = this.getProjection(newPosition, true, true);\n\n if (projection) {\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections.push(projection);\n if (this._lastProjections.length > MapMatchingHandler.LAST_PROJECTIONS_WINDOW_SIZE) {\n this._lastProjections.shift();\n }\n\n const thisWillBeAHugeJump = projection.distanceFromNearestElement > MapMatchingHandler.MM_HUGE_JUMP_DISTANCE;\n\n // In case of a huge jump, be sure the user is in a straight line\n if (thisWillBeAHugeJump && !StraightLineDetector.isStraight()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n // Detector to avoid big jumps in the wrong direction\n if (thisWillBeAHugeJump && this._detectWrongBigJump(projection)) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n // Do not use projection if the neareast element is not the same direction than previous\n if (!this._areLastProjectionsInTheSameDirection()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projection.projection,\n [positionEvent]\n ));\n this.tryOrientationMatching(projection);\n\n } else {\n\n // Sometimes, the newPosition.bearing diverges due to the Absolute Attitude offset\n // and the Orientation Matching. So, we created this detector to check if projection\n // with bearing from \"AbsoluteAttitudeFromBrowser\" is better than the current bearing.\n // /!\\ This works only if the user is waking in the same direction than the smartphone orientation /!\\\n if (StraightLineDetector.isStraight()) {\n\n const testedPosition = newPosition.clone();\n testedPosition.bearing = AbsoluteAttitudeFromBrowser.lastEvent.data.heading;\n const projectionWithAbs = this.getProjection(testedPosition, true, true);\n\n if (projectionWithAbs) {\n\n this._projectionsWithAbsAndWithoutRelAttitudeInARow.push(projectionWithAbs);\n if (this._projectionsWithAbsAndWithoutRelAttitudeInARow.length < 3) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n this._lastProjections.push(projectionWithAbs);\n if (this._lastProjections.length > MapMatchingHandler.LAST_PROJECTIONS_WINDOW_SIZE) {\n this._lastProjections.shift();\n }\n\n\n if (!this._areLastProjectionsInTheSameDirection()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projectionWithAbs.projection,\n [positionEvent]\n ));\n\n this.tryOrientationMatching(projectionWithAbs);\n return;\n }\n }\n\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections = [];\n\n // If no projection found with both projection methods, simply use the newPosition.\n AbsolutePosition.notify(positionEvent);\n }\n\n }\n\n /**\n * @param {Projection} projection\n */\n _detectWrongBigJump(projection) {\n\n if (this.network instanceof Itinerary && AbsolutePosition.lastEvent) {\n const itinerary = this.network;\n const infoPrevious = itinerary.getInfo(AbsolutePosition.lastEvent.data);\n const infoProjection = itinerary.getInfo(projection.projection);\n if (infoPrevious\n && infoProjection\n && infoPrevious.traveledDistance > infoProjection.traveledDistance\n && (infoPrevious.traveledDistance - infoProjection.traveledDistance) > projection.origin.accuracy\n && projection.distanceFromNearestElement > projection.origin.accuracy\n && projection.origin.distanceTo(AbsolutePosition.lastEvent.data) < projection.origin.accuracy + AbsolutePosition.lastEvent.data.accuracy) {\n\n return true;\n }\n }\n\n return false;\n }\n\n _areLastProjectionsInTheSameDirection() {\n\n if (this._lastProjections.length === 0) {\n return false;\n }\n\n const firstProjection = this._lastProjections[0];\n return !this._lastProjections.some(projection =>\n !(projection.nearestElement instanceof GraphEdge)\n || (diffAngleLines(projection.nearestElement.bearing, firstProjection.nearestElement.bearing)\n > MapMatchingHandler.LAST_PROJECTIONS_EDGE_ANGLE_THRESHOLD)\n );\n }\n\n /**\n * @param {Projection} projection\n */\n tryOrientationMatching(projection) {\n\n if (!MapMatchingHandler.ORIENTATION_MATCHING) {\n return;\n }\n\n if (this.state !== ProviderState.STARTED\n || this._countStepsFromLastMatching < MapMatchingHandler.MIN_STEPS_BETWEEN_ORIENTATION_MATCHING\n || StraightLineDetector.numStepsDetectedFromLastTurn < MapMatchingHandler.MIN_STEPS_FOR_ORIENTATION_MATCHING) {\n return;\n }\n\n const { nearestElement, origin } = projection;\n if (!(nearestElement instanceof GraphEdge)) {\n return;\n }\n\n let matchingDirection;\n const matchingDirectionAngle1 = diffAngle(nearestElement.bearing, origin.bearing);\n const matchingDirectionAngle2 = diffAngle(nearestElement.bearing + Math.PI, origin.bearing);\n\n if (Math.abs(matchingDirectionAngle1) < Math.abs(matchingDirectionAngle2)) {\n matchingDirection = nearestElement.bearing;\n } else {\n matchingDirection = (nearestElement.bearing + Math.PI) % (2 * Math.PI);\n }\n\n const matchedHeading = new AbsoluteHeading(\n matchingDirection,\n origin.time,\n 0\n // Math.min(Math.abs(matchingDirectionAngle1), Math.abs(matchingDirectionAngle2))\n );\n\n AbsoluteAttitude._forceHeadingForRelative(\n new ProviderEvent(EventType.AbsoluteHeading, matchedHeading)\n );\n\n this._countStepsFromLastMatching = 0;\n }\n\n getProjection(position, useDistance, useBearing) {\n return this._mapMatching.getProjection(position, useDistance, useBearing);\n }\n\n get maxDistance() {\n return this._mapMatching.maxDistance;\n }\n\n set maxDistance(maxDistance) {\n this._mapMatching.maxDistance = maxDistance;\n }\n\n get minDistance() {\n return this._mapMatchingMinDistance;\n }\n\n set minDistance(minDistance) {\n this._mapMatchingMinDistance = minDistance;\n }\n\n get maxAngleBearing() {\n return this._mapMatching.maxAngleBearing;\n }\n\n set maxAngleBearing(maxAngleBearing) {\n this._mapMatching.maxAngleBearing = maxAngleBearing;\n }\n}\n\nexport default new MapMatchingHandler();\n","class GeolocationApiMissingError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation api is missing';\n\n constructor(message) {\n super(message || GeolocationApiMissingError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationApiMissingError;\n","class GeolocationPermissionDeniedError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation permission denied';\n\n constructor(message) {\n super(message || GeolocationPermissionDeniedError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationPermissionDeniedError;\n","class GeolocationPositionUnavailableError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation position unavailable';\n\n constructor(message) {\n super(message || GeolocationPositionUnavailableError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationPositionUnavailableError;\n","import { UserPosition } from '@wemap/geo';\nimport Logger from '@wemap/logger';\nimport { deg2rad } from '@wemap/maths';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../../../events/EventType.js';\nimport GeolocationApiMissingError from '../../../errors/GeolocationApiMissingError.js';\nimport Provider from '../../Provider.js';\nimport GeolocationPermissionDeniedError from '../../../errors/GeolocationPermissionDeniedError.js';\nimport GeolocationPositionUnavailableError from '../../../errors/GeolocationPositionUnavailableError.js';\nimport Constants from '../../Constants.js';\n\n\n/**\n * GnssWifiProvider is a provider based on navigator.geolocation.\n * This API does not allow us to know if the position returned is provided\n * by Wifi Fingerprinting algorithms or by GNSS. That is why the name is\n * \"GnssWifi\".\n */\nclass GnssWifi extends Provider {\n\n static POSITION_OPTIONS = {\n enableHighAccuracy: true,\n timeout: Infinity,\n maximumAge: 0\n };\n\n /**\n * @override\n */\n static get pname() {\n return 'GnssWifi';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return typeof (navigator) === 'object' && navigator.geolocation\n ? Promise.resolve()\n : Promise.reject(new GeolocationApiMissingError());\n }\n\n /**\n * @override\n */\n start() {\n\n this.geoLocationId = navigator.geolocation.watchPosition(\n this.onNewPosition,\n this.onPositionError,\n GnssWifi.POSITION_OPTIONS\n );\n\n }\n\n /**\n * @override\n */\n stop() {\n\n navigator.geolocation.clearWatch(this.geoLocationId);\n\n }\n\n /**\n * @private\n */\n onNewPosition = geolocation => {\n\n const { coords } = geolocation;\n if (!coords) {\n return;\n }\n\n let bearing;\n if (coords.heading) {\n bearing = deg2rad(coords.heading);\n }\n\n const timestamp = TimeUtils.unixTimestampToPreciseTime(geolocation.timestamp) / 1e3;\n\n const position = new UserPosition(\n coords.latitude,\n coords.longitude,\n Constants.DEFAULT_ALTITUDE,\n null,\n timestamp,\n coords.accuracy,\n bearing,\n this.pname);\n\n this.notify(this.createEvent(\n EventType.AbsolutePosition, position\n ));\n\n };\n\n onPositionError = error => {\n\n Logger.warn(`[Providers] watchPosition error: [${error.code}] ${error.message}`);\n\n let customError;\n switch (error.code) {\n case 1:\n customError = new GeolocationPermissionDeniedError(error.message);\n break;\n case 2:\n customError = new GeolocationPositionUnavailableError(error.message);\n break;\n default:\n customError = new Error(error.message);\n }\n\n this.notifyError(customError);\n };\n}\n\nexport default new GnssWifi();\n","import { GeoRelativePosition } from '@wemap/geo';\n\nimport EventType from '../../../events/EventType.js';\nimport AbsoluteAttitude from '../../attitude/absolute/AbsoluteAttitude.js';\nimport Provider from '../../Provider.js';\nimport ArCore from './ArCore.js';\n\nclass GeoRelativePositionFromArCore extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'GeoRelativePositionFromArCore';\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n\n this.arCoreProviderId = ArCore.addEventListener(\n this.onArCoreEvents,\n error => this.notifyError(error)\n );\n\n this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(\n events => (this.absoluteAttitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeEventListener(this.arCoreProviderId);\n AbsoluteAttitude.removeEventListener(this.absoluteAttitudeProviderId);\n }\n\n onArCoreEvents = events => {\n const relativeAttitudeEvent = events.find(event => event.dataType === EventType.RelativeAttitude);\n const relativePositionEvent = events.find(event => event.dataType === EventType.RelativePosition);\n\n if (relativeAttitudeEvent && relativePositionEvent && this.absoluteAttitudeEvent) {\n this.compute(relativePositionEvent, relativeAttitudeEvent, this.absoluteAttitudeEvent);\n }\n }\n\n compute(relativePositionEvent, relativeAttitudeEvent, absoluteAttitudeEvent) {\n const relativePosition = relativePositionEvent.data;\n const relativeAttitude = relativeAttitudeEvent.data;\n const absoluteAttitude = absoluteAttitudeEvent.data;\n\n const rotation = absoluteAttitude.heading - relativeAttitude.heading;\n\n /**\n * Here, we transform \"relativePosition\" which is defined in ArCore frame to a relative \"position\" defined in ENU frame\n */\n const east = Math.cos(rotation) * relativePosition.x - Math.sin(rotation) * relativePosition.z;\n const north = -Math.sin(rotation) * relativePosition.x - Math.cos(rotation) * relativePosition.z;\n const up = relativePosition.y;\n\n /**\n * Relative position is defined in ENU frame\n */\n const position = new GeoRelativePosition(\n east,\n north,\n up,\n relativePosition.time,\n 0,\n absoluteAttitude.heading\n );\n\n this.notify(this.createEvent(\n EventType.GeoRelativePosition,\n position,\n [relativePositionEvent, relativeAttitudeEvent, absoluteAttitudeEvent]\n ));\n }\n}\n\nexport default new GeoRelativePositionFromArCore();\n","import { GeoRelativePosition } from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport StepDetector from '../../steps/StepDetector.js';\nimport AbsoluteAttitude from '../../attitude/absolute/AbsoluteAttitude.js';\n\n\nclass Pdr extends Provider {\n\n // https://ieeexplore.ieee.org/document/7346766\n misalignment = [1, 0, 0, 0];\n misalignmentError = deg2rad(3);\n\n /**\n * @override\n */\n static get pname() {\n return 'PDR';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n StepDetector.availability,\n AbsoluteAttitude.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n\n this.stepDetectionProviderId = StepDetector.addEventListener(\n events => this.onStepEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(\n events => (this.attitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n\n }\n\n /**\n * @override\n */\n stop() {\n StepDetector.removeEventListener(this.stepDetectionProviderId);\n AbsoluteAttitude.removeEventListener(this.absoluteAttitudeProviderId);\n }\n\n /**\n * @private\n */\n onStepEvent = stepEvent => {\n\n if (!this.attitudeEvent) {\n return;\n }\n\n const stepSize = stepEvent.data.size;\n\n /**\n * There is three frames because (device heading != walking direction):\n *\n * Device frame (x-Device Right, y-Device Top, z-Device Front)\n * Navigation frame (x-Nav East, y-Nav North, z-Nav Up)\n * Earth local frame (x-East y-North z-Up)\n *\n *\n * For the PDR, in order to find the step direction,\n * we are looking for the rotation between the device frame and the navigation frame.\n * Attitude is the rotation from the device frame to the earth local frame.\n * Misalignment is the rotation from the navigation frame to the earth local frame\n */\n const deviceAttitude = this.attitudeEvent.data;\n\n /**\n * For optimisation, as we define misalignment to identity, we do not process the quat mulitply formula.\n */\n // const deviceInNavFrame = Quaternion.multiply(deviceAttitude.quaternion, this.misalignment);\n // const deviceDirection = new Attitude(deviceInNavFrame).heading;\n const deviceDirection = deviceAttitude.heading;\n\n /**\n * A bad accuracy from PDR is due to three things:\n * - Attitude accuracy\n * - Misalignement (device heading != walking direction)\n * - Step detection false positives / false negatives\n * Following formula only use attitude accuracy with cone formula\n */\n const deviceDirectionAccuracy = deviceAttitude.accuracy + this.misalignmentError;\n const accuracy = (stepSize / 2) * Math.sin(deviceDirectionAccuracy / 2);\n const timestamp = deviceAttitude.time;\n\n /**\n * Relative position is defined in ENU frame\n */\n const position = new GeoRelativePosition(\n stepSize * Math.sin(deviceDirection),\n stepSize * Math.cos(deviceDirection),\n 0,\n timestamp,\n accuracy,\n deviceDirection\n );\n\n this.notify(this.createEvent(\n EventType.GeoRelativePosition,\n position,\n [stepEvent, this.attitudeEvent]\n ));\n }\n\n}\n\nexport default new Pdr();\n","import { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport GeoRelativePositionFromArCore from './GeoRelativePositionFromArCore.js';\nimport Pdr from './Pdr.js';\n\n\nclass GeoRelativePosition extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'GeoRelativePosition';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.GeoRelativePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n Pdr.availability,\n GeoRelativePositionFromArCore.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n\n GeoRelativePositionFromArCore.availability\n .then(() => (this.geoRelativeProvider = GeoRelativePositionFromArCore))\n .catch(() => (this.geoRelativeProvider = Pdr))\n .finally(() => {\n this.providerId = this.geoRelativeProvider.addEventListener(\n events => {\n const event = events.find(_event => _event.dataType === EventType.GeoRelativePosition);\n if (event) {\n this.notify(event.clone());\n }\n },\n error => this.notifyError(error)\n );\n });\n }\n\n /**\n * @override\n */\n stop() {\n if (this.geoRelativeProvider) {\n this.geoRelativeProvider.removeEventListener(this.providerId);\n this.geoRelativeProvider = null;\n }\n }\n}\n\nexport default new GeoRelativePosition();\n","export function preciseTime() {\n if (typeof window !== 'undefined' && window.performance) {\n return window.performance.now();\n }\n const hrtime = process.hrtime();\n return Math.round((hrtime[0] * 1e3) + (hrtime[1] / 1e6));\n}\n\n/**\n * Return a value equivalent to performance now from a given unix timestamp\n * @param {Number} timestamp a unix timestamp\n * @returns timestamp relative to performance.now()\n */\nexport function unixTimestampToPreciseTime(timestamp) {\n return preciseTime() + timestamp - new Date().getTime();\n}\n\n/**\n * Return a value equivalent to a unix timestamp from a given performance now value\n * @param {Number} _preciseTime timestamp relative to performance.now()\n * @returns a unix timestamp\n */\nexport function preciseTimeToUnixTimestamp(_preciseTime) {\n return new Date().getTime() + _preciseTime - preciseTime();\n}\n","/* eslint-disable max-statements */\nimport { SharedCameras, CameraUtils, Camera } from '@wemap/camera';\nimport { Attitude, Level, UserPosition } from '@wemap/geo';\nimport Logger from '@wemap/logger';\nimport { deg2rad, Quaternion } from '@wemap/maths';\nimport { TimeUtils } from '../../../../utils/index.js';\n\nimport EventType from '../../events/EventType.js';\nimport ProviderEvent from '../../events/ProviderEvent.js';\nimport Provider from '../Provider.js';\nimport ProviderState from '../ProviderState.js';\n\nclass Vps extends Provider {\n\n // static SERVICE_URL = 'http://localhost:45678/';\n static SERVICE_URL = 'https://vps.maaap.it/';\n static MAP_ID = 'wemap';\n static MIN_TIME_BETWEEN_TWO_REQUESTS = 1000;\n\n /** @type {boolean} */\n _serverError = false;\n\n /** @type {boolean} */\n _cameraError = false;\n\n /** @type {Camera} */\n _camera = null;\n\n /**\n * @override\n */\n static get pname() {\n return 'Vps';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude, EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.resolve();\n }\n\n /**\n * @override\n */\n start() {\n\n // 1. Add listeners on shared cameras to detect new cameras\n SharedCameras.on('added', this._onCameraDetected);\n SharedCameras.on('removed', this._onCameraRemoved);\n\n // 2. If a camera already exists, use it\n if (SharedCameras.list.length) {\n if (SharedCameras.list.length > 1) {\n Logger.warn('It seems that more than 1 camera has been detected'\n + ' for VPS. Taking the first...');\n }\n this._useCamera(SharedCameras.list[0].camera);\n }\n }\n\n /**\n * @override\n */\n stop() {\n SharedCameras.off('added', this._onCameraDetected);\n SharedCameras.off('removed', this._onCameraRemoved);\n\n this._camera = null;\n }\n\n\n _onCameraDetected = ({ camera }) => {\n if (this._camera) {\n Logger.warn('It seems that more than 1 camera has been detected'\n + ' for VPS. Taking the first...');\n }\n this._useCamera(camera);\n }\n\n _onCameraRemoved = () => {\n if (this._camera) {\n this._camera.off('started', this._internalStart);\n this._camera.off('stopped', this._internalStop);\n } else {\n Logger.warn('There is no previously detected camera but once has stopped');\n }\n this._camera = null;\n }\n\n /**\n * @param {Camera} camera\n */\n _useCamera(camera) {\n this._camera = camera;\n\n camera.on('started', this._internalStart);\n camera.on('stopped', this._internalStop);\n\n if (camera.state === Camera.State.STARTED) {\n this._internalStart();\n }\n }\n\n\n _internalStart = async () => {\n\n this._serverError = false;\n\n while (this.state !== ProviderState.STOPPPED) {\n\n if (this.lastEvent) {\n const diffTime = TimeUtils.preciseTime() - this.lastEvent.data.time * 1e3;\n const timeToWait = Math.max(0, Vps.MIN_TIME_BETWEEN_TWO_REQUESTS - diffTime);\n await new Promise(resolve => setTimeout(resolve, timeToWait));\n }\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n const url = Vps.SERVICE_URL + Vps.MAP_ID;\n\n // 1. Prepare the request\n if (!this._camera || this._camera.state !== Camera.State.STARTED) {\n break;\n }\n const payload = await this._prepareRequest();\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 2. Send the request\n const serverResponse = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }\n });\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 3. Parse the response\n const events = await this._parseResponse(serverResponse, url, payload.time);\n if (this._serverError || this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 4. Notify events\n if (events.length) {\n this.notify(...events);\n }\n }\n\n if (this.state !== ProviderState.STOPPPED) {\n this.stop();\n }\n }\n\n _internalStop = () => {\n // do nothing\n }\n\n\n /**\n * @returns {Object}\n */\n async _prepareRequest() {\n\n const camera = this._camera;\n\n // Retrieve the image\n const image = await camera.currentImage;\n const time = TimeUtils.preciseTime() / 1e3;\n // TODO: move the grayscale conversion in the currentImage getter\n CameraUtils.convertToGrayscale(image);\n const reducedImage = CameraUtils.reduceImageSize(image, 1280);\n // const reducedImage = CameraUtils.reduceImageSize(image, 720, 720);\n const { height, width } = reducedImage;\n const base64Image = CameraUtils.canvasToBase64(reducedImage);\n\n // Retrieve the calibration matrix\n const calibration = CameraUtils.createCameraCalibrationFromWidthHeightFov(\n width, height, deg2rad(camera.hardwareVerticalFov)\n );\n\n // Build the payload\n return {\n calibration,\n size: [width, height],\n image: base64Image,\n time\n };\n }\n\n /**\n * @param {Response} res\n * @param {String} url\n * @param {Number} requestTime\n * @returns {ProviderEvent[]}\n */\n async _parseResponse(res, url, requestTime) {\n if (res.status !== 200) {\n Logger.warn(`The VPS server (${url}) has encountered a problem`);\n this._serverError = true;\n return [];\n }\n\n const json = await res.json();\n if (json.error) {\n return [];\n }\n\n const { attitude, userPosition } = Vps._parseJsonResponse(json, requestTime);\n\n const events = [\n this.createEvent(EventType.AbsoluteAttitude, attitude),\n this.createEvent(EventType.AbsolutePosition, userPosition)\n ];\n\n return events;\n }\n\n\n static _parseJsonResponse(json, requestTime) {\n\n const quaternion = [\n json.attitude.w,\n json.attitude.x,\n json.attitude.y,\n json.attitude.z\n ];\n const quaternionNorm = Quaternion.norm(quaternion);\n quaternion[0] /= quaternionNorm;\n quaternion[1] /= quaternionNorm;\n quaternion[2] /= quaternionNorm;\n quaternion[3] /= quaternionNorm;\n\n const quaternionWithScreenRotation = Quaternion.multiply(\n Quaternion.fromAxisAngle([0, 0, 1], deg2rad(window.orientation || 0)), quaternion\n );\n\n const attitude = new Attitude(quaternionWithScreenRotation, requestTime, 0);\n\n\n const userPosition = new UserPosition(\n json.coordinates.lat,\n json.coordinates.lng,\n json.coordinates.alt,\n json.coordinates.level ? new Level(json.coordinates.level) : null,\n requestTime,\n 0,\n attitude.heading\n );\n\n\n return { userPosition, attitude };\n }\n}\n\nexport default new Vps();\n","import { UserPosition, GeoRelativePosition } from '@wemap/geo';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport MapMatchingHandler from '../../../mapmatching/MapMatchingHandler.js';\nimport GnssWifi from './GnssWifi.js';\nimport { default as GeoRelativePositionProvider } from '../relative/GeoRelativePosition.js';\nimport ProvidersOptions from '../../../ProvidersOptions.js';\nimport ProviderState from '../../ProviderState.js';\nimport Vps from '../../vision/Vps.js';\n\nclass AbsolutePosition extends Provider {\n\n // Use the new absolute position if its accuracy is at least x times better than the last one.\n static ACCURACY_RELOC_RATIO = 1.5;\n\n /** @type {boolean} */\n static USE_MM_FOR_FEED = true;\n\n\n /** @type {number?} */\n _gnssWifiProviderId;\n\n /** @type {number?} */\n _relativePositionProviderId;\n\n /** @type {number?} */\n _mapMatchingHandlerId\n\n /** @type {boolean?} */\n _waitUntilNextVpsPosition = false;\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsolutePosition';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n GeoRelativePositionProvider.availability,\n GnssWifi.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n GeoRelativePositionProvider.availability\n .then(() => {\n this._relativePositionProviderId = GeoRelativePositionProvider.addEventListener(\n events => this._onRelativePosition(events[0])\n );\n })\n .catch(() => {\n // do nothing\n });\n\n if (ProvidersOptions.hasVps) {\n\n this._vpsProviderId = Vps.addEventListener(events => {\n this._onAbsolutePosition(events.find(event => event.dataType === EventType.AbsolutePosition));\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n });\n\n } else {\n\n this._gnssWifiProviderId = GnssWifi.addEventListener(\n events => {\n // bearing from GnssWifi is not reliable for our usecase\n events[0].data.bearing = null;\n this._onAbsolutePosition(events[0], false);\n }\n );\n\n }\n\n this._mapMatchingHandlerId = MapMatchingHandler.addEventListener();\n }\n\n\n /**\n * @override\n */\n stop() {\n if (this._relativePositionProviderId) {\n GeoRelativePositionProvider.removeEventListener(this._relativePositionProviderId);\n this._relativePositionProviderId = null;\n }\n if (this._gnssWifiProviderId) {\n GnssWifi.removeEventListener(this._gnssWifiProviderId);\n this._gnssWifiProviderId = null;\n }\n if (this._vpsProviderId) {\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n }\n\n MapMatchingHandler.removeEventListener(this._mapMatchingHandlerId);\n }\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n * @param {boolean} canContainLevel\n */\n _onAbsolutePosition(positionEvent, canContainLevel = true) {\n\n const newPosition = positionEvent.data.clone();\n const lastPosition = this.lastEvent ? this.lastEvent.data : null;\n\n if (lastPosition) {\n\n // Is the new position accuracy is better enough than the last position accuracy\n const isBetterEnough = newPosition.accuracy * AbsolutePosition.ACCURACY_RELOC_RATIO <= lastPosition.accuracy;\n\n // Is the new position is far from the new one (regarding accuracy)\n // This is important if the person put the current page in the background during a while\n const isFarEnough = lastPosition.distanceTo(newPosition) > lastPosition.accuracy + newPosition.accuracy;\n\n if (!isBetterEnough && !isFarEnough) {\n return;\n }\n\n if (!canContainLevel) {\n newPosition.level = lastPosition.level;\n }\n\n // If the new position does not have a bearing, retrieve the bearing from the last position\n if (newPosition.bearing === null) {\n newPosition.bearing = lastPosition.bearing;\n }\n }\n\n\n const newPositionEvent = this.createEvent(\n EventType.AbsolutePosition,\n newPosition,\n [positionEvent]\n );\n\n // If the MM is disable or the network is not set yet, use the new position as it is.\n // If the position bearing is null, do not use MM, it is too dangerous.\n if (!MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromAbsolute(newPositionEvent);\n }\n\n /**\n * @param {ProviderEvent<GeoRelativePosition>} relativeEvent\n */\n _onRelativePosition(relativeEvent) {\n\n if (!this.lastEvent || this._waitUntilNextVpsPosition) {\n return;\n }\n\n const lastPosition = this.lastEvent.data;\n\n const offsetPos = relativeEvent.data;\n\n const dist = Math.sqrt(offsetPos.x ** 2 + offsetPos.y ** 2);\n const bearing = Math.atan2(offsetPos.x, offsetPos.y);\n const alt = lastPosition.alt !== null ? offsetPos.z : null;\n\n const newPosition = lastPosition.destinationPoint(dist, bearing, alt);\n newPosition.bearing = offsetPos.bearing;\n newPosition.time = offsetPos.time;\n newPosition.accuracy += offsetPos.accuracy;\n\n\n const newPositionEvent = this.createEvent(\n EventType.AbsolutePosition,\n newPosition,\n [relativeEvent]\n );\n\n\n if (!MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromRelative(newPositionEvent);\n }\n\n\n /**\n * @override\n * @param {UserPosition|ProviderEvent} data\n * @param {EventType} eventType\n */\n feed(data, eventType) {\n\n /** @type {ProviderEvent<UserPosition>} */\n let newPositionEvent;\n\n if (eventType === EventType.ForceVps) {\n if (!this._vpsProviderId && this.state === ProviderState.STARTED) {\n this._waitUntilNextVpsPosition = true;\n this._vpsProviderId = Vps.addEventListener(events => {\n this._waitUntilNextVpsPosition = false;\n this._onAbsolutePosition(events.find(event => event.dataType === EventType.AbsolutePosition));\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n });\n }\n\n return;\n\n }\n\n if (data instanceof UserPosition) {\n\n if (data.time === null) {\n throw Error('the time of the position is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the position is not defined');\n }\n\n newPositionEvent = new ProviderEvent(EventType.AbsolutePosition, data);\n\n } else if (data instanceof ProviderEvent) {\n\n if (data.dataType !== EventType.AbsolutePosition\n || !(data.data instanceof UserPosition)) {\n throw Error('the provider event is not an UserPosition');\n }\n\n newPositionEvent = data;\n\n } else {\n throw new Error('data is nor an UserPosition or a ProviderEvent');\n }\n\n // If the MM is disable or the network is not set yet, use the new position as it is.\n if (!AbsolutePosition.USE_MM_FOR_FEED || !MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromFeed(newPositionEvent);\n }\n}\n\nexport default new AbsolutePosition();\n","import geomagnetism from '@wemap/geomagnetism';\n\nimport {\n Attitude, Coordinates\n} from '@wemap/geo';\nimport {\n deg2rad, rad2deg, Quaternion, Rotations\n} from '@wemap/maths';\nimport {\n Browser, BrowserUtils\n} from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AskImuOnDesktopError from '../../../errors/AskImuOnDesktopError.js';\nimport MissingMagnetometerError from '../../../errors/MissingMagnetometerError.js';\nimport MissingSensorError from '../../../errors/MissingSensorError.js';\nimport AbsolutePosition from '../../position/absolute/AbsolutePosition.js';\n\n\n/**\n * Absolute attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation or deviceorientationabsolute\n * The provider does not work until an AbsolutePosition is given. This is necessary to\n * calculate declination.\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via deviceorientationabsolute)\n * Safari iOS (v12.0): YES (via deviceorientation and event.webkitCompassHeading)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/ondeviceorientation}\n * Firefox Android (v65.0.1): NO {@link https://www.fxsitecompat.com/en-CA/docs/2018/various-device-sensor-apis-are-now-deprecated/}\n *\n * -----------------------------------\n */\nclass AbsoluteAttitudeFromBrowser extends Provider {\n\n // from http://tyrex.inria.fr/mobile/benchmarks-attitude/\n static DEFAULT_ACCURACY = deg2rad(15);\n\n absolutePositionProviderId = null;\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsoluteAttitudeFromBrowser';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n\n const subscribe = () => {\n switch (BrowserUtils.name) {\n case Browser.CHROME:\n window.addEventListener('deviceorientationabsolute',\n this.onDeviceOrientationChromeEvent, true);\n break;\n\n case Browser.SAFARI:\n case Browser.IOS_WEBVIEW:\n window.addEventListener('deviceorientation',\n this.onDeviceOrientationSafariEvent, true);\n break;\n }\n };\n\n if (typeof (DeviceOrientationEvent) !== 'undefined' && typeof (DeviceOrientationEvent.requestPermission) === 'function') {\n DeviceOrientationEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n\n\n const lastAbsolutePosition = AbsolutePosition.lastEvent;\n if (lastAbsolutePosition) {\n this.onAbsolutePositionEvent(lastAbsolutePosition);\n } else {\n this.absolutePositionProviderId = AbsolutePosition.addEventListener(\n events => this.onAbsolutePositionEvent(events[0]),\n error => this.notifyError(error),\n false\n );\n }\n\n }\n\n /**\n * @override\n */\n stop() {\n switch (BrowserUtils.name) {\n case Browser.CHROME:\n window.removeEventListener('deviceorientationabsolute',\n this.onDeviceOrientationChromeEvent, true);\n break;\n\n case Browser.SAFARI:\n case Browser.IOS_WEBVIEW:\n window.removeEventListener('deviceorientation',\n this.onDeviceOrientationSafariEvent, true);\n break;\n }\n\n if (this.absolutePositionProviderId !== null) {\n AbsolutePosition.removeEventListener(this.absolutePositionProviderId);\n }\n }\n\n\n onDeviceOrientationChromeEvent = e => {\n\n this.magQuaternionTimestamp = e.timeStamp / 1e3;\n\n if (typeof e.alpha !== 'number' || typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientationabsolute'));\n return;\n }\n\n this.magQuaternion = Rotations.eulerToQuaternionZXYDegrees(\n [e.alpha, e.beta, e.gamma]);\n\n this.compute();\n };\n\n\n iosPreviousQuat = null;\n iosIsSkyMode;\n\n onDeviceOrientationSafariEvent = e => {\n\n this.magQuaternionTimestamp = e.timeStamp / 1e3;\n\n if (typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientation'));\n return;\n }\n\n if (typeof e.webkitCompassHeading !== 'number') {\n super.notifyError(new MissingMagnetometerError().from('deviceorientation'));\n return;\n }\n\n /**\n * Trying the best to retrieve a good quaternion from devicemotion event.\n */\n\n let alpha;\n const [qw, qx, qy, qz] = Rotations.eulerToQuaternionZXYDegrees([e.webkitCompassHeading, e.beta, e.gamma]);\n const groundAngle = rad2deg(Math.acos(qw ** 2 - qx ** 2 - qy ** 2 + qz ** 2));\n\n let isSkyMode;\n if (groundAngle > 136) {\n isSkyMode = true;\n } else if (groundAngle < 134) {\n isSkyMode = false;\n } else if (this.iosPreviousQuat && this.iosIsSkyMode !== null) {\n /**\n * This condition is true only if :\n * - we are in the [134°; 136°] ground angle range\n * - we know the previous quaternion\n * - one of the both previous condition has been reached during this session\n *\n * In this case, we define a threshold to detect if there is a \"jump\" in the quaternion calculation,\n * then, the mode is switched.\n */\n isSkyMode = Quaternion.distance([qw, qx, qy, qz], this.iosPreviousQuat) < 0.5\n ? this.iosIsSkyMode\n : !this.iosIsSkyMode;\n }\n this.iosPreviousQuat = [qw, qx, qy, qz];\n this.iosIsSkyMode = isSkyMode;\n\n if (typeof (isSkyMode) === 'undefined') {\n // Algorithm uncertainity\n return;\n }\n\n if (isSkyMode) {\n alpha = 180 - e.webkitCompassHeading;\n } else {\n alpha = AbsoluteAttitudeFromBrowser.webkitCompassToHeading(\n e.webkitCompassHeading, e.beta, e.gamma);\n }\n\n this.magQuaternion = Rotations.eulerToQuaternionZXYDegrees([alpha, e.beta, e.gamma]);\n\n this.compute();\n };\n\n\n compute() {\n\n if (!this.declinationQuaternion || !this.magQuaternion) {\n return;\n }\n\n const trueQuaternion = Quaternion.multiply(this.declinationQuaternion, this.magQuaternion);\n const attitude = new Attitude(trueQuaternion, this.magQuaternionTimestamp,\n this.constructor.DEFAULT_ACCURACY, this.pname);\n this.notify(this.createEvent(\n EventType.AbsoluteAttitude,\n attitude,\n [this.absolutePositionEvent]\n ));\n }\n\n /**\n * Initialized declination quaternion using current position.\n * This method should be theoretically called every time the user moves.\n * But in reality declination does not change as much.\n * @param {Coordinates} positionEvent user position event\n */\n onAbsolutePositionEvent = positionEvent => {\n\n if (!positionEvent) {\n return;\n }\n\n this.absolutePositionEvent = positionEvent;\n\n const position = positionEvent.data;\n const wmmResult = geomagnetism.model().point([position.lat, position.lng]);\n // Declination is given in NED frame and our code use ENU, that is why we have: \"-decl\"\n this.declinationQuaternion = Quaternion.fromAxisAngle([0, 0, 1], - deg2rad(wmmResult.decl));\n\n AbsolutePosition.removeEventListener(this.absolutePositionProviderId);\n this.absolutePositionProviderId = null;\n this.compute();\n }\n\n static webkitCompassToHeading(_webkitCompassHeading, _beta, _gamma) {\n const webkitCompassHeading = deg2rad(_webkitCompassHeading);\n const beta = deg2rad(_beta);\n const gamma = deg2rad(_gamma);\n\n const c1 = Math.cos(webkitCompassHeading / 2);\n const c2 = Math.cos(beta / 2);\n const c3 = Math.cos(gamma / 2);\n const s1 = Math.sin(webkitCompassHeading / 2);\n const s2 = Math.sin(beta / 2);\n const s3 = Math.sin(gamma / 2);\n\n const qw = c1 * c2 * c3 - s1 * s2 * s3;\n const qz = s1 * c2 * c3 + c1 * s2 * s3;\n\n return rad2deg(-2 * Math.atan(qz / qw));\n }\n}\n\nexport default new AbsoluteAttitudeFromBrowser();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\n\nimport Accelerometer from '../imu/Accelerometer.js';\n\n/**\n * Inclination provider gives the inclination of the device using Imu Sensor\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass InclinationFromAcc extends Provider {\n\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationFromAcc';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Accelerometer.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n onAccelerometerEvent = accelerometerEvent => {\n const acc = accelerometerEvent.data.values;\n\n const screenOrientation = window.orientation || 0;\n\n const sizeAcc = Math.sqrt(acc[0] * acc[0] + acc[1] * acc[1] + acc[2] * acc[2]);\n const accNormalized = [acc[0] / sizeAcc, acc[1] / sizeAcc, acc[2] / sizeAcc];\n\n const q = [accNormalized[2] + 1, accNormalized[1], -accNormalized[0], 0];\n const qSize = Math.sqrt(q[0] * q[0] + q[1] * q[1] + q[2] * q[2]);\n const qNormalized = [q[0] / qSize, q[1] / qSize, q[2] / qSize, 0];\n\n let inclination;\n if (screenOrientation === 0) {\n inclination = Math.asin(2 * qNormalized[1] * qNormalized[0]);\n } else if (screenOrientation === 90) {\n inclination = -Math.asin(2 * qNormalized[2] * qNormalized[0]);\n } else if (screenOrientation === -90) {\n inclination = Math.asin(2 * qNormalized[2] * qNormalized[0]);\n } else if (screenOrientation === 180) {\n inclination = -Math.asin(2 * qNormalized[1] * qNormalized[0]);\n }\n\n this.notify(this.createEvent(\n EventType.Inclination,\n inclination,\n [accelerometerEvent]\n ));\n };\n}\n\nexport default new InclinationFromAcc();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitudeFromInertial from '../attitude/relative/RelativeAttitudeFromInertial.js';\n\n\n/**\n * Inclination provider gives the inclination of the device using Relative Attitude\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass InclinationFromRelativeAttitude extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationFromRelativeAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitudeFromInertial.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = RelativeAttitudeFromInertial.addEventListener(\n events => {\n const attitudeEvent = events[0];\n const inclination = this.constructor.enuQuatToInclination(\n attitudeEvent.data.quaternion\n );\n this.notify(this.createEvent(\n EventType.Inclination,\n inclination,\n [attitudeEvent]\n ));\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n RelativeAttitudeFromInertial.removeEventListener(this.providerId);\n }\n\n static enuQuatToInclination(q) {\n const screenOrientation = window.orientation || 0;\n\n if (screenOrientation === 0) {\n return Math.asin(2 * (q[2] * q[3] + q[1] * q[0]));\n } else if (screenOrientation === 90) {\n return Math.asin(2 * (q[1] * q[3] - q[2] * q[0]));\n } else if (screenOrientation === -90) {\n return Math.asin(2 * (q[2] * q[0] - q[1] * q[3]));\n }\n // else if (screenOrientation === 180)\n return -Math.asin(2 * (q[2] * q[3] + q[1] * q[0]));\n }\n}\n\nexport default new InclinationFromRelativeAttitude();\n","import { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport InclinationFromAcc from './InclinationFromAcc.js';\nimport InclinationFromRelativeAttitude from './InclinationFromRelativeAttitude.js';\n\n/**\n * Inclination provider gives the inclination of the device using Imu Sensor\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass Inclination extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationProvider';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n InclinationFromAcc.availability,\n InclinationFromRelativeAttitude.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n const startInclinationFromAcc = () => {\n this.provider = InclinationFromAcc;\n this.providerId = this.provider.addEventListener(\n events => this.notify(events[0].clone()),\n error => this.notifyError(error)\n );\n };\n\n if (InclinationFromRelativeAttitude.availability) {\n this.provider = InclinationFromRelativeAttitude;\n this.providerId = this.provider.addEventListener(\n events => this.notify(events[0].clone()),\n () => {\n InclinationFromRelativeAttitude.removeEventListener(this.providerId);\n startInclinationFromAcc();\n }\n );\n } else {\n startInclinationFromAcc();\n }\n }\n\n /**\n * @override\n */\n stop() {\n if (this.provider) {\n this.provider.removeEventListener(this.providerId);\n }\n }\n}\n\nexport default new Inclination();\n","/* eslint-disable max-statements */\nimport { AbsoluteHeading, Attitude } from '@wemap/geo';\nimport { deg2rad, diffAngle, Quaternion } from '@wemap/maths';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AbsoluteAttitudeFromBrowser from './AbsoluteAttitudeFromBrowser.js';\nimport RelativeAttitude from '../relative/RelativeAttitude.js';\nimport Inclination from '../../inclination/Inclination.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport HighRotationsDetector from '../../imu/HighRotationsDetector.js';\n\n/**\n * Absolute attitude provider gives the device attitude in East-North-Up (ENU) frame\n */\nclass AbsoluteAttitude extends Provider {\n\n /** @type {number} */\n static REL_ABS_DIVERGENCE_ANGLE_THRESHOLD = deg2rad(25);\n\n /** @type {number} in seconds */\n static REL_ABS_DIVERGENCE_TIME_THRESHOLD = 2.5;\n\n /** @type {number} */\n static REL_ABS_DIVERGENCE_INCLINATION_THRESHOLD = deg2rad(15);\n\n /** @type {boolean} */\n _attitudeFromBrowserErrored = false;\n\n /** @type {boolean} */\n _attitudeFromRelativeErrored = false;\n\n /*\n * RELATIVE\n */\n\n /** @type {Attitude} */\n _relativeAttitude = null;\n\n /** @type {number} in radians/s */\n _relativeAccuracy = 0;\n\n /** @type {ProviderEvent<Attitude|AbsoluteHeading>} */\n _lastForcedHeadingEvent;\n\n /** @type {number[]} quaternion offset from relative to absolute */\n _relAbsQuat;\n\n /** @type {boolean} */\n _wasHighRotationInProgress = false;\n\n /** @type {?number} */\n _timeFirstDivergence = null;\n\n\n constructor() {\n super();\n\n this._attitudeFromBrowserErrored = false;\n this._attitudeFromRelativeErrored = false;\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsoluteAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n AbsoluteAttitudeFromBrowser.availability,\n RelativeAttitude.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n this.fromBrowserProviderId = AbsoluteAttitudeFromBrowser.addEventListener(\n events => this._onAttitudeFromBrowser(events[0]),\n error => {\n this._attitudeFromBrowserErrored = true;\n this.onError(error);\n }\n );\n\n this.relativeAttitudeProviderId = RelativeAttitude.addEventListener(\n events => this._onRelativeAttitudeEvent(events[0]),\n error => {\n this._attitudeFromRelativeErrored = true;\n this.onError(error);\n }\n );\n\n this.inclinationProviderId = Inclination.addEventListener();\n\n this.highRotationDetectorId = HighRotationsDetector.addEventListener();\n }\n\n /**\n * @override\n */\n stop() {\n AbsoluteAttitudeFromBrowser.removeEventListener(this.fromBrowserProviderId);\n RelativeAttitude.removeEventListener(this.relativeAttitudeProviderId);\n Inclination.removeEventListener(this.inclinationProviderId);\n HighRotationsDetector.removeEventListener(this.highRotationDetectorId);\n }\n\n onError(error) {\n if (this._attitudeFromBrowserErrored && this._attitudeFromRelativeErrored) {\n this.notifyError(error);\n }\n }\n\n\n /**\n * @param {ProviderEvent<Attitude|AbsoluteHeading>} absoluteHeadingEvent\n */\n _forceHeadingForRelative = (absoluteHeadingEvent) => {\n\n if (this.lastEvent && absoluteHeadingEvent.data.accuracy > this.lastEvent.data.accuracy) {\n return;\n }\n\n\n /**\n * @param {Attitude} relativeAttitude\n */\n const calcForceHeading = (relativeAttitude) => {\n const currentRelativeHeading = relativeAttitude.heading;\n\n this._relAbsQuat = Quaternion.fromAxisAngle(\n [0, 0, 1],\n currentRelativeHeading - absoluteHeadingEvent.data.heading\n );\n\n this._relativeAccuracy = 0;\n this._lastForcedHeadingEvent = absoluteHeadingEvent;\n };\n\n // If relativeAttitude does not exist yet, wait the next\n if (this._relativeAttitude) {\n calcForceHeading(this._relativeAttitude);\n return;\n }\n\n // If this._relativeAttitude does not exist, wait the first value\n // /!\\ This works only if the relative attitude event is provided rapidly.\n const providerId = RelativeAttitude.addEventListener(\n events => {\n calcForceHeading(events[0].data);\n RelativeAttitude.removeEventListener(providerId);\n }\n );\n\n };\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _onRelativeAttitudeEvent(event) {\n\n const { quaternion, accuracy, time } = event.data;\n\n // Calculate relative accuracy\n if (this._relativeAttitude) {\n this._relativeAccuracy += (time - this._relativeAttitude.time) * accuracy;\n }\n\n // Keep the relative attitude event for the calculation of relAbsQuat\n // /!\\ Keep this even if forced heading is not set /!\\\n this._relativeAttitude = event.data;\n\n\n if (!this._lastForcedHeadingEvent) {\n return;\n }\n\n const accuracyWithRelative = Math.min(\n this._lastForcedHeadingEvent.data.accuracy + this._relativeAccuracy,\n Math.PI\n );\n\n const highRotationInProgress = HighRotationsDetector.isInProgress();\n\n let magnetometerNeedCalibrationEvent = null;\n let divergenceDetected = false;\n\n if (this._eventFromBrowser) {\n\n const {\n accuracy: accuracyWithAbsolute,\n heading: headingFromAbsolute\n } = this._eventFromBrowser.data;\n\n if (this._wasHighRotationInProgress && !highRotationInProgress) {\n // Update heading for relative if it the end of high rotations\n // (probably due to a magnetometer calibratiton)\n this._forceHeadingForRelative(this._eventFromBrowser);\n\n } else if (accuracyWithAbsolute < accuracyWithRelative) {\n // Update heading for relative if:\n // (1) accuracy from absolute is better than relative\n // (2) heading divergence is greater than REL_ABS_DIVERGENCE_THRESHOLD\n const relativeQuaternion = Quaternion.multiply(this._relAbsQuat, quaternion);\n const relativeAttitude = new Attitude(relativeQuaternion);\n const angle = Math.abs(diffAngle(relativeAttitude.heading, headingFromAbsolute));\n const inclination = Inclination.lastEvent.data;\n\n\n if (angle > AbsoluteAttitude.REL_ABS_DIVERGENCE_ANGLE_THRESHOLD\n && Math.abs(inclination - Math.PI / 4) > AbsoluteAttitude.REL_ABS_DIVERGENCE_INCLINATION_THRESHOLD\n ) {\n divergenceDetected = true;\n\n // Be sure before forcing heading\n if (this._timeFirstDivergence !== null\n && time - this._timeFirstDivergence > AbsoluteAttitude.REL_ABS_DIVERGENCE_TIME_THRESHOLD) {\n\n this._forceHeadingForRelative(this._eventFromBrowser);\n magnetometerNeedCalibrationEvent = this.createEvent(\n EventType.MagnetometerNeedCalibration,\n {\n angle\n }, [event, this._lastForcedHeadingEvent]\n );\n this._timeFirstDivergence = null;\n } else if (this._timeFirstDivergence === null) {\n this._timeFirstDivergence = time;\n }\n\n }\n }\n\n }\n\n if (!divergenceDetected) {\n this._timeFirstDivergence = null;\n }\n\n this._wasHighRotationInProgress = highRotationInProgress;\n\n const absoluteQuat = Quaternion.multiply(this._relAbsQuat, quaternion);\n const attitude = new Attitude(absoluteQuat, time, accuracyWithRelative);\n\n const eventsToNotify = [\n this.createEvent(\n EventType.AbsoluteAttitude,\n attitude,\n [event, this._lastForcedHeadingEvent]\n )\n ];\n if (magnetometerNeedCalibrationEvent) {\n eventsToNotify.push(magnetometerNeedCalibrationEvent);\n }\n\n this.notify(...eventsToNotify);\n }\n\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _onAttitudeFromBrowser(event) {\n this._eventFromBrowser = event;\n\n if (!this._lastForcedHeadingEvent) {\n this._forceHeadingForRelative(event);\n return;\n }\n\n // Absolute attitude from browser is not used anymore due to magnetometer inaccuracy on pitch and roll\n }\n\n /**\n * @override\n * @param {AbsoluteHeading|Attitude|ProviderEvent} data\n */\n feed(data) {\n\n if (data instanceof AbsoluteHeading) {\n\n if (data.time === null) {\n throw Error('the time of the absolute heading is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the absolute heading is not defined');\n }\n\n this._forceHeadingForRelative(new ProviderEvent(EventType.AbsoluteHeading, data));\n\n } else if (data instanceof Attitude) {\n\n if (data.time === null) {\n throw Error('the time of the attitude is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the attitude is not defined');\n }\n\n this._forceHeadingForRelative(new ProviderEvent(EventType.AbsoluteHeading, data));\n\n } else if (data instanceof ProviderEvent) {\n\n if (data.dataType !== EventType.AbsoluteHeading\n || !(data.data instanceof AbsoluteHeading)) {\n throw Error('the provider event is not an AbsoluteHeading');\n }\n\n this._forceHeadingForRelative(data);\n\n } else {\n throw new Error('data is nor an AbsoluteHeading or an Attitude object');\n }\n }\n}\n\nexport default new AbsoluteAttitude();\n","import EventType from '../../events/EventType.js';\nimport ProviderEvent from '../../events/ProviderEvent.js';\nimport AbsoluteAttitude from '../attitude/absolute/AbsoluteAttitude.js';\nimport Provider from '../Provider.js';\n\nclass MagnetometerCalibrationDetector extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'MagnetometerCalibrationDetector';\n }\n\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.MagnetometerNeedCalibration];\n }\n\n /**\n * @override\n */\n get _availability() {\n return AbsoluteAttitude.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = AbsoluteAttitude.addEventListener(\n events => this._parseAbsoluteAttitudeEvents(events),\n error => this.notifyError(error),\n false\n );\n }\n\n /**\n * @override\n */\n stop() {\n AbsoluteAttitude.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n * @param {ProviderEvent[]} absoluteAttitudeEvents\n */\n _parseAbsoluteAttitudeEvents = absoluteAttitudeEvents => {\n\n if (absoluteAttitudeEvents.length < 2) {\n return;\n }\n\n const magnetometerNeedCalibrationEvent = absoluteAttitudeEvents[1];\n if (magnetometerNeedCalibrationEvent.dataType !== EventType.MagnetometerNeedCalibration) {\n return;\n }\n\n this.notify(magnetometerNeedCalibrationEvent);\n }\n}\n\nexport default new MagnetometerCalibrationDetector();\n","class IpResolveServerError extends Error {\n\n static DEFAULT_MESSAGE = 'IP Resolver failed';\n\n constructor(message) {\n super(message || IpResolveServerError.DEFAULT_MESSAGE);\n }\n}\n\nexport default IpResolveServerError;\n","import { UserPosition } from '@wemap/geo';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../../../events/EventType.js';\nimport Provider from '../../Provider.js';\nimport IpResolveServerError from '../../../errors/IpResolveServerError.js';\n\n/**\n * GnssWifiProvider is a provider based on navigator.geolocation.\n * This API does not allow us to know if the position returned is provided\n * by Wifi Fingerprinting algorithms or by GNSS. That is why the name is\n * \"GnssWifi\".\n */\nclass Ip extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'IP';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n start() {\n\n fetch('https://ipinfo.io/geo?token=24a7ca2f3b489d')\n .then((response) => {\n if (!response) {\n this.notifyError(new IpResolveServerError());\n return;\n }\n\n const timestamp = TimeUtils.preciseTime() / 1e3;\n\n const latLngStr = response.loc.split(',');\n const position = new UserPosition(\n parseFloat(latLngStr[0]),\n parseFloat(latLngStr[1]),\n null,\n null,\n timestamp\n );\n\n this.notify(this.createEvent(EventType.AbsolutePosition, position));\n });\n }\n\n /**\n * @override\n */\n stop() {\n\n }\n\n}\n\nexport default new Ip();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport ArCore from '../position/relative/ArCore.js';\n\nclass Barcode extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Barcode';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Barcode];\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n ArCore.enableBarcodeScanner();\n\n this.providerId = ArCore.addEventListener(\n events => {\n const barcodeEvent = events.find(event => event.dataType === EventType.Barcode);\n if (barcodeEvent) {\n this.notify(barcodeEvent);\n }\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.disableBarcodeScanner();\n ArCore.removeEventListener(this.providerId);\n }\n}\n\nexport default new Barcode();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport { ArCore } from '../../Providers.js';\nimport ProviderState from '../ProviderState.js';\n\nclass CameraNative extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'CameraNative';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.CameraNative];\n }\n\n /**\n * @override\n */\n get _availability() {\n return new Promise((resolve, reject) => {\n ArCore.availability\n .then(output => resolve(output))\n .catch(() => reject('Providers will not use the camera.'));\n });\n }\n\n /**\n * @override\n */\n start() {\n\n if (ArCore.state !== ProviderState.STOPPPED) {\n this.notify(this.createEvent(EventType.CameraNative, 'started'));\n }\n this.providerId = ArCore.addMonitoringListener(\n () => this.notify(this.createEvent(EventType.CameraNative, 'started')),\n () => this.notify(this.createEvent(EventType.CameraNative, 'stopped'))\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeMonitoringListener(this.providerId);\n }\n}\n\nexport default new CameraNative();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport ArCore from '../position/relative/ArCore.js';\n\nclass CameraProjectionMatrix extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'CameraProjectionMatrix';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.CameraProjectionMatrix];\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = ArCore.addEventListener(\n events => {\n const projMatrixEvent = events.find(event => event.dataType === EventType.CameraProjectionMatrix);\n if (projMatrixEvent) {\n this.notify(projMatrixEvent);\n }\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeEventListener(this.providerId);\n }\n}\n\nexport default new CameraProjectionMatrix();\n","/* eslint-disable max-len */\n\nexport { default as Imu } from './providers/imu/Imu.js';\nexport { default as Accelerometer } from './providers/imu/Accelerometer.js';\nexport { default as Gyroscope } from './providers/imu/Gyroscope.js';\nexport { default as HighRotationsDetector } from './providers/imu/HighRotationsDetector.js';\nexport { default as MagnetometerCalibrationDetector } from './providers/imu/MagnetometerCalibrationDetector.js';\n\nexport { default as RelativeAttitudeFromBrowser } from './providers/attitude/relative/RelativeAttitudeFromBrowser.js';\nexport { default as RelativeAttitudeFromEkf } from './providers/attitude/relative/RelativeAttitudeFromEkf.js';\nexport { default as RelativeAttitudeFromInertial } from './providers/attitude/relative/RelativeAttitudeFromInertial.js';\nexport { default as RelativeAttitude } from './providers/attitude/relative/RelativeAttitude.js';\n\nexport { default as AbsoluteAttitudeFromBrowser } from './providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js';\nexport { default as AbsoluteAttitude } from './providers/attitude/absolute/AbsoluteAttitude.js';\n\nexport { default as TurnDetector } from './providers/attitude/TurnDectector.js';\n\nexport { default as InclinationFromAcc } from './providers/inclination/InclinationFromAcc.js';\nexport { default as InclinationFromRelativeAttitude } from './providers/inclination/InclinationFromRelativeAttitude.js';\nexport { default as Inclination } from './providers/inclination/Inclination.js';\n\nexport { default as StepDetector } from './providers/steps/StepDetector.js';\nexport { default as StraightLineDetector } from './providers/steps/StraightLineDetector.js';\n\nexport { default as ArCore } from './providers/position/relative/ArCore.js';\nexport { default as Pdr } from './providers/position/relative/Pdr.js';\nexport { default as GeoRelativePositionFromArCore } from './providers/position/relative/GeoRelativePositionFromArCore.js';\nexport { default as GeoRelativePosition } from './providers/position/relative/GeoRelativePosition.js';\n\nexport { default as GnssWifi } from './providers/position/absolute/GnssWifi.js';\nexport { default as Ip } from './providers/position/absolute/Ip.js';\nexport { default as AbsolutePosition } from './providers/position/absolute/AbsolutePosition.js';\n\nexport { default as Vps } from './providers/vision/Vps.js';\n\nexport { default as Barcode } from './providers/others/Barcode.js';\nexport { default as CameraNative } from './providers/others/CameraNative.js';\nexport { default as CameraProjectionMatrix } from './providers/others/CameraProjectionMatrix.js';\n","\nimport {\n Attitude, AbsoluteHeading, UserPosition, Network\n} from '@wemap/geo';\nimport { Itinerary } from '@wemap/routers';\n\nimport EventType from './events/EventType.js';\nimport {\n AbsoluteAttitude, AbsolutePosition, Barcode, CameraNative,\n CameraProjectionMatrix, Inclination, MagnetometerCalibrationDetector, RelativeAttitude\n} from './Providers.js';\nimport ProvidersLoggerOld from './events/ProvidersLoggerOld.js';\nimport MapMatchingHandler from './mapmatching/MapMatchingHandler.js';\n\nclass ProvidersInterface {\n\n static idListeners = new Map();\n\n /**\n * @param {EventType} eventType\n * @param {Function} onEvent\n * @param {Function} onError\n * @param {Boolean} watchOnly if true, addEventListener does not start any provider, it just watches for events\n * @returns {Number}\n */\n static addEventListener(eventType, onEvent, onError, watchOnly = false) {\n const provider = this._getProviderFromEventType(eventType);\n const id = provider.addEventListener(events => onEvent(events[0].data), onError, !watchOnly);\n this.idListeners.set(id, provider);\n return id;\n }\n\n /**\n * @see addEventListener\n * @param {Number} id\n */\n static removeEventListener(id) {\n const provider = this.idListeners.get(id);\n if (provider) {\n return provider.removeEventListener(id);\n }\n return null;\n }\n\n\n /**\n * @param {EventType} eventType\n * @param {Object} data\n */\n static feed(eventType, data) {\n this._checkEventTypeDataConsistency(eventType, data);\n if (eventType === EventType.Network) {\n MapMatchingHandler.network = data;\n return;\n }\n if (eventType === EventType.Itinerary) {\n MapMatchingHandler.itinerary = data;\n return;\n }\n this._getProviderFromEventType(eventType).feed(data, eventType);\n }\n\n /**\n * @param {EventType} eventType\n */\n static getLastKnown(eventType) {\n const { lastEvent } = this._getProviderFromEventType(eventType);\n return lastEvent ? lastEvent.data : null;\n }\n\n /**\n * @param {EventType} eventType\n * @returns {Provider}\n */\n static _getProviderFromEventType(eventType) {\n\n switch (eventType) {\n case EventType.AbsoluteAttitude:\n case EventType.AbsoluteHeading:\n return AbsoluteAttitude;\n\n case EventType.AbsolutePosition:\n case EventType.ForceVps:\n return AbsolutePosition;\n\n case EventType.RelativeAttitude:\n return RelativeAttitude;\n\n case EventType.Inclination:\n return Inclination;\n\n case EventType.CameraNative:\n return CameraNative;\n\n case EventType.Barcode:\n return Barcode;\n\n case EventType.CameraProjectionMatrix:\n return CameraProjectionMatrix;\n\n case EventType.MagnetometerNeedCalibration:\n return MagnetometerCalibrationDetector;\n\n default:\n throw new Error(`Unable to deal with this event type: ${eventType}`);\n }\n }\n\n static _checkEventTypeDataConsistency(eventType, data) {\n const errorFn = expectedType =>\n new Error(`Event type (${eventType}) is not an instance of ${expectedType}`);\n\n switch (eventType) {\n case EventType.AbsoluteAttitude:\n if (!(data instanceof Attitude)) {\n throw errorFn('Attitude');\n }\n break;\n case EventType.AbsoluteHeading:\n if (!(data instanceof AbsoluteHeading)) {\n throw errorFn('AbsoluteHeading');\n }\n break;\n case EventType.AbsolutePosition:\n if (!(data instanceof UserPosition)) {\n throw errorFn('UserPosition');\n }\n break;\n case EventType.Network:\n if (!(data instanceof Network || data === null)) {\n throw errorFn('Network');\n }\n break;\n case EventType.Itinerary:\n if (!(data instanceof Itinerary || data === null)) {\n throw errorFn('Itinerary');\n }\n break;\n case EventType.ForceVps:\n break;\n default:\n throw new Error(`Unable to deal with this event type: ${eventType}`);\n }\n }\n\n /**\n * @param {Boolean} enabled\n */\n static set logger(enabled) {\n ProvidersLoggerOld.enabled = enabled;\n }\n\n static get mapMatchingMaxDistance() {\n return MapMatchingHandler.maxDistance;\n }\n\n static set mapMatchingMaxDistance(maxDistance) {\n MapMatchingHandler.maxDistance = maxDistance;\n }\n\n static get mapMatchingMinDistance() {\n return MapMatchingHandler.minDistance;\n }\n\n static set mapMatchingMinDistance(minDistance) {\n MapMatchingHandler.minDistance = minDistance;\n }\n\n static get mapMatchingMaxAngleBearing() {\n return MapMatchingHandler.maxAngleBearing;\n }\n\n static set mapMatchingMaxAngleBearing(maxAngleBearing) {\n MapMatchingHandler.maxAngleBearing = maxAngleBearing;\n }\n}\n\nexport default ProvidersInterface;\n","/* eslint-disable max-statements */\nimport { UserPosition } from '@wemap/geo';\n\nclass PositionSmoother {\n\n\n // Generated positions by second\n static DEFAULT_FREQUENCY = 60;\n\n // flyby (in second)\n static DEFAULT_FLYBY_TIME = 1;\n\n\n /**\n * @param {Function} callback\n * @param {Number} frequency in Hz\n */\n constructor(callback, frequency = this.constructor.DEFAULT_FREQUENCY) {\n this.callback = callback;\n this.positionsQueue = [];\n this.frequency = frequency;\n }\n\n /**\n * @param {UserPosition} newPosition\n * @param {Number} flybyTime in seconds\n */\n feed(newPosition, flybyTime = this.constructor.DEFAULT_FLYBY_TIME) {\n\n if (!(newPosition instanceof UserPosition)) {\n throw new TypeError('newPosition is not instance of UserPosition');\n }\n\n if (newPosition.time === null) {\n throw new Error('newPosition does not have time property');\n }\n\n let previousPosition;\n if (this.positionsQueue.length !== 0) {\n previousPosition = this.positionsQueue[0];\n this.positionsQueue = [];\n } else {\n previousPosition = this.previousPosition;\n }\n\n if (previousPosition) {\n\n const refTimestamp = newPosition.time;\n const distance = previousPosition.distanceTo(newPosition);\n const azimuth = previousPosition.bearingTo(newPosition);\n\n let i = 1;\n const nSamples = this.frequency * flybyTime + 1;\n\n let newPositionLevel = null;\n if (newPosition.level !== null) {\n newPositionLevel = newPosition.level.clone();\n }\n\n while (i < nSamples + 1) {\n const smoothedPosition = previousPosition.destinationPoint(distance * i / nSamples, azimuth);\n smoothedPosition.time = refTimestamp + (i - 1) / this.frequency;\n smoothedPosition.level = newPositionLevel;\n smoothedPosition.bearing = newPosition.bearing;\n smoothedPosition.accuracy = Math.max(\n smoothedPosition.accuracy + (newPosition.accuracy - smoothedPosition.accuracy) * i / nSamples,\n 0\n );\n this.positionsQueue.push(smoothedPosition);\n i++;\n }\n\n if (this.timeoutNotify) {\n clearTimeout(this.timeoutNotify);\n }\n } else {\n this.positionsQueue.push(newPosition.clone());\n }\n\n this.previousPosition = newPosition;\n this._notifyNext();\n }\n\n _notifyNext = () => {\n this.callback(this.positionsQueue.shift());\n if (this.positionsQueue.length !== 0) {\n this.timeoutNotify = setTimeout(this._notifyNext, 1e3 / this.frequency);\n } else {\n delete this.timeoutNotify;\n }\n }\n\n clear() {\n clearTimeout(this.timeoutNotify);\n delete this.timeoutNotify;\n this.positionsQueue = [];\n }\n}\n\nexport default PositionSmoother;\n","/* eslint-disable max-statements */\nimport { Attitude } from '@wemap/geo';\nimport { deg2rad, diffAngle, Quaternion } from '@wemap/maths';\n\nclass AttitudeSmoother {\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_JUMP_THRESHOLD = deg2rad(180);\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_CONVERGENCE = deg2rad(10);\n\n /** @type {number} in radians/s */\n static HIGH_JUMP_THRESHOLD = deg2rad(20);\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_HIGH_JUMP_CONVERGENCE = deg2rad(100);\n\n /** @type {number} in radians */\n static PITCH_UNCERTAINITY_HEADING_THRESHOLD = deg2rad(5);\n\n /** @type {Function} */\n _callback;\n\n /** @type {object?} */\n _smoothing = null;\n\n /**\n * @param {Function} callback\n */\n constructor(callback) {\n this._callback = callback;\n }\n\n /**\n * @param {Attitude} attitude\n */\n feed(newAttitude) {\n\n if (!(newAttitude instanceof Attitude)) {\n throw new TypeError('newAttitude is not instance of Attitude');\n }\n\n if (newAttitude.time === null) {\n throw new Error('newAttitude does not have time property');\n }\n\n const { _previousAttitude: previousAttitude } = this;\n this._previousAttitude = newAttitude;\n\n if (!previousAttitude) {\n this._callback(newAttitude);\n return;\n }\n\n /*\n * Comparison between two successive Attitude from the \"feed\" function\n */\n if (AttitudeSmoother.isJump(previousAttitude, newAttitude)) {\n\n const fromAttitude = this._smoothing === null\n ? previousAttitude\n : this._smoothing.interpAttitude(previousAttitude);\n\n const fromHeading = fromAttitude.heading;\n const toHeading = newAttitude.heading;\n const diffAngleHeading = diffAngle(toHeading, fromHeading);\n\n const isHighJump = Math.abs(diffAngleHeading) < AttitudeSmoother.HIGH_JUMP_THRESHOLD;\n const rotationSpeedConvergence = isHighJump\n ? AttitudeSmoother.ROTATION_SPEED_CONVERGENCE\n : AttitudeSmoother.ROTATION_SPEED_HIGH_JUMP_CONVERGENCE;\n\n const fromTime = fromAttitude.time;\n const timeToConsume = Math.abs(diffAngleHeading) / rotationSpeedConvergence;\n const multiplier = diffAngleHeading < 0 ? -1 : 1;\n\n this._smoothing = {\n toTime: fromTime + timeToConsume,\n\n /**\n * @param {Attitude} attitude\n */\n interpAttitude: attitude => {\n const angle = rotationSpeedConvergence * (attitude.time - fromTime);\n const interpHeading = fromHeading + angle * multiplier;\n const offsetQuat = Quaternion.fromAxisAngle([0, 0, 1], toHeading - interpHeading);\n const interpQuat = Quaternion.multiply(offsetQuat, attitude.quaternion);\n return new Attitude(interpQuat, attitude.time, attitude.accuracy);\n }\n };\n }\n\n if (this._smoothing !== null) {\n if (newAttitude.time >= this._smoothing.toTime) {\n // This means that is the last epoch for smoothing\n this._smoothing = null;\n } else {\n const interpAttitude = this._smoothing.interpAttitude(newAttitude);\n this._callback(interpAttitude);\n return;\n }\n }\n\n this._callback(newAttitude);\n }\n\n /**\n * @param {Attitude} previousAttitude\n * @param {Attitude} newAttitude\n * @returns {boolean}\n */\n static isJump(previousAttitude, newAttitude) {\n const fromHeading = previousAttitude.heading;\n const toHeading = newAttitude.heading;\n const diffAngleHeading = diffAngle(toHeading, fromHeading);\n const diffTime = newAttitude.time - previousAttitude.time;\n\n /**\n * Heading is calculated from two different formulas in function of the pitch angle.\n * Do not consider a jump if attitude is close to the change of the methods\n * @see MathsRotations#getHeadingFromQuaternion()\n */\n const [qw, qx, qy, qz] = newAttitude.quaternion;\n const distToPitchThreshold = Math.abs(Math.asin(2 * (qw * qx + qy * qz)) - Math.PI / 4);\n if (distToPitchThreshold < AttitudeSmoother.PITCH_UNCERTAINITY_HEADING_THRESHOLD) {\n return false;\n }\n\n return Math.abs(diffAngleHeading) > AttitudeSmoother.ROTATION_SPEED_JUMP_THRESHOLD * diffTime;\n }\n\n}\n\nexport default AttitudeSmoother;\n"],"names":["ProvidersLoggerOld","Imu","Gyroscope","Constants","inputModeCorrespondance","routingModeCorrespondance","Accelerometer","RelativeAttitudeFromInertial","RelativeAttitudeFromEkf","RelativeAttitudeFromBrowser","HighRotationsDetector","ArCore","RelativeAttitude","GeoConstants","StepDetector","StraightLineDetector","AbsolutePosition","AbsoluteAttitudeFromBrowser","AbsoluteAttitude","GeoRelativePosition","Pdr","GeoRelativePositionFromArCore","TimeUtils.preciseTime","GnssWifi","Vps","MapMatchingHandler","InclinationFromAcc","InclinationFromRelativeAttitude","Inclination","CameraNative","Barcode","CameraProjectionMatrix","MagnetometerCalibrationDetector"],"mappings":"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"}
1
+ {"version":3,"file":"wemap-providers.es.js","sources":["../src/events/EventType.js","../src/events/ProviderEvent.js","../src/providers/ProviderState.js","../src/events/ProvidersLoggerOld.js","../src/errors/ContainsIgnoredProviderError.js","../src/ProvidersOptions.js","../src/providers/Provider.js","../src/errors/AskImuOnDesktopError.js","../src/providers/imu/Imu.js","../src/errors/MissingSensorError.js","../src/errors/MissingAccelerometerError.js","../src/providers/imu/Accelerometer.js","../src/errors/MissingGyroscopeError.js","../src/providers/imu/Gyroscope.js","../src/providers/imu/HighRotationsDetector.js","../src/errors/MissingMagnetometerError.js","../../routers/src/model/LevelChange.js","../../routers/src/model/Step.js","../../routers/src/Constants.js","../../routers/src/model/Leg.js","../../routers/src/Utils.js","../../routers/src/model/Itinerary.js","../../routers/src/wemap/WemapRouterOptions.js","../../routers/src/wemap/WemapStepsGeneration.js","../../routers/src/remote/cityway/CitywayRemoteRouter.js","../../routers/src/remote/idfm/IdfmRemoteRouter.js","../../routers/src/remote/osrm/OsrmRemoteRouter.js","../../../node_modules/@mapbox/polyline/src/polyline.js","../../routers/src/remote/otp/OtpRemoteRouter.js","../src/providers/attitude/EkfAttitude.js","../src/providers/attitude/relative/RelativeAttitudeFromEkf.js","../src/providers/attitude/relative/RelativeAttitudeFromBrowser.js","../src/providers/attitude/relative/RelativeAttitudeFromInertial.js","../src/errors/MissingArCoreError.js","../src/errors/MissingNativeInterfaceError.js","../src/providers/position/relative/ArCore.js","../src/providers/attitude/relative/RelativeAttitude.js","../src/providers/attitude/TurnDectector.js","../src/providers/Constants.js","../src/providers/steps/StepDetectionMinMaxPeaks2.js","../src/providers/steps/StepDetector.js","../src/providers/steps/StraightLineDetector.js","../src/mapmatching/MapMatchingHandler.js","../src/errors/GeolocationApiMissingError.js","../src/errors/GeolocationPermissionDeniedError.js","../src/errors/GeolocationPositionUnavailableError.js","../src/providers/position/absolute/GnssWifi.js","../src/providers/position/relative/GeoRelativePositionFromArCore.js","../src/providers/position/relative/Pdr.js","../src/providers/position/relative/GeoRelativePosition.js","../../utils/src/TimeUtils.js","../src/providers/vision/Vps.js","../src/providers/position/absolute/AbsolutePosition.js","../src/providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js","../src/providers/inclination/InclinationFromAcc.js","../src/providers/inclination/InclinationFromRelativeAttitude.js","../src/providers/inclination/Inclination.js","../src/providers/attitude/absolute/AbsoluteAttitude.js","../src/providers/imu/MagnetometerCalibrationDetector.js","../src/errors/IpResolveServerError.js","../src/providers/position/absolute/Ip.js","../src/providers/others/Barcode.js","../src/providers/others/CameraNative.js","../src/providers/others/CameraProjectionMatrix.js","../src/Providers.js","../src/ProvidersInterface.js","../src/smoothers/PositionSmoother.js","../src/smoothers/AttitudeSmoother.js"],"sourcesContent":["/**\n * Event data types handled by {@link ProviderEvent}\n */\nexport default {\n Unknown: 'UNKNOWN',\n\n MagneticField: 'MAGNETIC_FIELD',\n AngularRate: 'ANGULAR_RATE',\n Acceleration: 'ACCELERATION',\n MagnetometerNeedCalibration: 'MAGNETOMETER_NEED_CALIBRATION',\n\n RelativeAttitude: 'RELATIVE_ATTITUDE',\n AbsoluteAttitude: 'ABSOLUTE_ATTITUDE',\n Attitude: 'ATTITUDE',\n\n Inclination: 'INCLINATION',\n AbsoluteHeading: 'ABSOLUTE_HEADING',\n Turn: 'TURN',\n HighRotation: 'HIGH_ROTATION',\n\n RelativePosition: 'RELATIVE_POSITION',\n GeoRelativePosition: 'GEO_RELATIVE_POSITION',\n AbsolutePosition: 'ABSOLUTE_POSITION',\n\n Step: 'STEP',\n StraightLine: 'STRAIGHT_LINE',\n\n Pressure: 'PRESSURE',\n BluetoothSignals: 'BLUETOOTH_SIGNALS',\n WifiSignals: 'WIFI_SIGNALS',\n ScanId: 'SCAN_ID',\n Barcode: 'BARCODE',\n CameraProjectionMatrix: 'CAMERA_PROJECTION_MATRIX',\n CameraNative: 'CAMERA_NATIVE',\n\n Itinerary: 'ITINERARY',\n Network: 'NETWORK',\n\n ForceVps: 'FORCE_VPS'\n};\n","import EventType from './EventType.js';\n\n/**\n * A provider event is an event which can be triggered by device sensors\n * or can be computed from raw providers.\n *\n * @template T\n */\nclass ProviderEvent {\n\n dataType = EventType.Unknown;\n providersStack = [];\n\n /** @type {T} */\n data = null;\n\n /**\n * Create a Provider Event with the minimum information\n * @param {EventType} dataType the type of event\n * @param {Object} data the event data\n */\n constructor(dataType, data) {\n this.dataType = dataType;\n this.data = data;\n }\n\n /**\n * @return {ProviderEvent<T>}\n */\n clone() {\n const evt = new ProviderEvent(this.dataType, this.data);\n evt.providersStack = this.providersStack.slice(0);\n return evt;\n }\n}\n\nexport default ProviderEvent;\n","export default {\n STARTING: 0,\n STARTED: 1,\n STOPPPED: 2\n};\n","import Logger from '@wemap/logger';\n\nclass ProvidersLoggerOld {\n\n _enabled = false;\n\n currentId = 0;\n objectsIdMap = new WeakMap();\n\n pushEvents = {};\n pushEventsRef = {};\n\n interval;\n initDate;\n\n\n get enabled() {\n return this._enabled;\n }\n\n set enabled(_newVal) {\n this._enabled = _newVal;\n }\n\n initializeInterval() {\n\n if (this.interval) {\n return;\n }\n\n this.interval = setInterval(() => {\n\n for (const [key, value] of Object.entries(this.pushEvents)) {\n Logger.debug('Received ' + value + ' notifications from ' + this.pushEventsRef[key].pname + ' last second');\n }\n\n this.pushEvents = {};\n this.pushEventsRef = {};\n }, 1000);\n }\n\n getObjectId(object) {\n if (!this.objectsIdMap.has(object)) {\n this.objectsIdMap.set(object, ++this.currentId);\n }\n return this.objectsIdMap.get(object);\n }\n\n addEvent(object, method) {\n\n if (!this.enabled) {\n return;\n }\n\n if (!this.initDate) {\n this.initDate = Date.now();\n }\n\n this.initializeInterval();\n\n const objectId = this.getObjectId(object);\n const objectClassName = object.pname;\n\n Logger.debug(objectClassName + '[' + objectId + '].' + method);\n }\n\n incrementNotifications(object) {\n\n if (!this.enabled) {\n return;\n }\n\n const objectId = this.getObjectId(object);\n\n let counter = this.pushEvents[objectId];\n if (!counter) {\n counter = 0;\n this.pushEventsRef[objectId] = object;\n }\n this.pushEvents[objectId] = counter + 1;\n }\n\n}\nexport default new ProvidersLoggerOld();\n","class ContainsIgnoredProviderError extends Error {\n\n static DEFAULT_MESSAGE = 'Contains ignored provider';\n\n constructor(message) {\n super(message || ContainsIgnoredProviderError.DEFAULT_MESSAGE);\n }\n}\n\nexport default ContainsIgnoredProviderError;\n","const ProvidersOptions = {\n\n /**\n * Does provider will use map to\n */\n useMapMatching: true,\n\n /**\n * Providers listed here will not be used by the system\n * List of {@link Provider#pname}\n */\n ignoreProviders: [],\n\n /**\n * Some providers are not used by default (VPS, QRCodeScanner) because they\n * require data from an optional external service or because they drain more\n * battery. They can be added to this list to be used\n * List of {@link Provider#pname}\n */\n optionalProviders: [],\n\n /**\n * Define the list of EventType that are optionals\n * List of {@link EventType}\n */\n optionalEvents: [],\n\n stopOnError: true,\n\n checkAvailabilityOnStart: true,\n\n stepdetectionlocker: true,\n\n smoother: true,\n\n get hasVps() {\n return this.optionalProviders.includes('Vps');\n }\n};\n\nexport default ProvidersOptions;\n","import EventType from '../events/EventType.js';\nimport ProviderEvent from '../events/ProviderEvent.js';\nimport ProvidersLoggerOld from '../events/ProvidersLoggerOld.js';\nimport ContainsIgnoredProviderError from '../errors/ContainsIgnoredProviderError.js';\nimport ProvidersOptions from '../ProvidersOptions.js';\nimport ProviderState from './ProviderState.js';\n\n\n/**\n * A provider is a meta class to define an entity which can be\n * started / stopped and provides a data of {@link ProviderEvent#DataType}\n */\nclass Provider {\n\n /** @type {number} */\n static _callbackUniqueId = 0;\n\n /** @type {number} */\n static _uniqueId = 1;\n\n\n /** @type {number} */\n id;\n\n /** @type {number} */\n state = ProviderState.STOPPPED;\n\n /** @type {ProviderEvent[]} */\n _lastEvents = null;\n\n _eventsCallbacks = [];\n _monitoringCallbacks = [];\n\n /**\n * Provider constructor\n */\n constructor() {\n\n if (this.constructor === Provider) {\n throw new Error('Can\\'t instantiate Provider directly');\n }\n\n this.id = Provider._uniqueId++;\n\n ProvidersLoggerOld.addEvent(this, 'constructor');\n }\n\n /**\n * Get the provider name\n * @type {String} the provider name\n */\n static get pname() {\n return 'Unknown';\n }\n\n /** @type {String} */\n get pname() {\n return this.constructor.pname;\n }\n\n /**\n * Get the list of events type which can be returned by the provider\n * @returns {EventType[]} the list of events type\n * @public\n * @abstract\n */\n get eventsType() {\n return [];\n }\n\n /**\n * @type {Promise} returns an availability promise\n */\n get availability() {\n if (ProvidersOptions.ignoreProviders.includes(this.pname)) {\n return Promise.reject(new ContainsIgnoredProviderError());\n }\n\n return this._availability;\n }\n\n /** @type {Promise} */\n get _availability() {\n return Promise.resolve();\n }\n\n /**\n * Create an event from current provider\n * @param {String} dataType type of ProviderEvent (from EventType)\n * @param {Object} data data exported to ProviderEvent\n * @returns {ProviderEvent}\n * @protected\n */\n static createEvent(dataType, data, fromEvents = []) {\n const event = new ProviderEvent(dataType, data);\n const newStack = fromEvents.reduce((acc, _event) => acc.concat(_event.providersStack), []);\n // Remove duplicates and keep lasts\n event.providersStack = [...new Set(newStack.reverse())].reverse();\n return event;\n }\n\n /**\n * Create an event from current provider\n * @param {EventType} dataType type of ProviderEvent\n * @param {Object} data data exported to ProviderEvent\n * @param {ProviderEvent[]} fromEvents events used for the creation of the new one\n * @returns {ProviderEvent}\n * @protected\n */\n createEvent(dataType, data, fromEvents) {\n return this.constructor.createEvent(dataType, data, fromEvents);\n }\n\n get hasNativeInterface() {\n return Boolean(this.nativeInterface);\n }\n\n get nativeInterface() {\n return typeof window !== 'undefined' ? (window.__nativeProviders || null) : null;\n }\n\n get useCameraNatively() {\n return false;\n }\n\n /**\n * Description of the function\n * @name onEventsFunction\n * @function\n * @param {ProviderEvent[]} events the array of provider events\n */\n\n /**\n *\n * @param {onEventsFunction} onEvents\n * @param {Function} onError\n * @param {Boolean} startIfNecessary\n * @returns {Number}\n */\n addEventListener(onEvents = () => {}, onError = () => {}, startIfNecessary = true) {\n const id = ++Provider._callbackUniqueId;\n\n /**\n * Build callback\n */\n this._eventsCallbacks.push({\n id,\n onEvents,\n onError,\n optional: !startIfNecessary\n });\n\n\n // The caller just want to have callbacks without starting the provider,\n // the routine can be stopped here\n if (!startIfNecessary) {\n return id;\n }\n\n\n // If the provider is already started do not go further\n if (this.state !== ProviderState.STOPPPED) {\n return id;\n }\n this.state = ProviderState.STARTING;\n\n // Check availability on start if defined in options\n let availabilityPromise = Promise.resolve();\n if (ProvidersOptions.checkAvailabilityOnStart) {\n availabilityPromise = this.availability;\n }\n\n availabilityPromise\n .then(() => {\n\n ProvidersLoggerOld.addEvent(this, 'start');\n // Call the child start function\n this.start();\n\n this.state = ProviderState.STARTED;\n\n this._monitoringCallbacks.forEach(({ onStarted }) => onStarted());\n })\n .catch(e => {\n this.state = ProviderState.STOPPPED;\n this.notifyError(e);\n })\n // notifyError can throw an error if onStop is not defined\n .catch(() => {});\n\n return id;\n }\n\n /**\n *\n * @param {Number} callbackUniqueId\n */\n removeEventListener(callbackUniqueId) {\n\n // Search the caller object in callbacks list\n const callback = this._eventsCallbacks.find(_callback => _callback.id === callbackUniqueId);\n if (!callback) {\n // The callback object is not found. Maybe it is already stopped.\n return;\n }\n\n // Remove the current callback from the list of the callbacks\n this._eventsCallbacks = this._eventsCallbacks.filter(_callback => _callback !== callback);\n\n // If this callback was optional, do not go further to stop the provider\n if (callback.optional) {\n return;\n }\n\n // If there is callbacks that are not optionals for start, do not stop the provider\n if (this._eventsCallbacks.find(_callback => !_callback.optional)) {\n return;\n }\n\n // If the provider is already stopped, do not stop it again.\n // This condition can be true if checkAvailabilityOnStart is true and returns an error\n if (this.state === ProviderState.STOPPPED) {\n return;\n }\n\n ProvidersLoggerOld.addEvent(this, 'stop');\n // Call the child stop function\n this.stop();\n\n this.state = ProviderState.STOPPPED;\n\n this._monitoringCallbacks.forEach(({ onStopped }) => onStopped());\n }\n\n\n /**\n *\n * @param {Function} onStarted\n * @param {Function} onStopped\n * @returns {Number}\n */\n addMonitoringListener(onStarted = () => {}, onStopped = () => {}) {\n const id = ++this.constructor._callbackUniqueId;\n this._monitoringCallbacks.push({\n id,\n onStarted,\n onStopped\n });\n return id;\n }\n\n /**\n *\n * @param {Number} callbackUniqueId\n */\n removeMonitoringListener(callbackUniqueId) {\n this._monitoringCallbacks = this._monitoringCallbacks.filter(\n _callback => _callback.id !== callbackUniqueId\n );\n }\n\n /**\n * @abstract\n */\n start() {\n throw new Error('Provider \"' + this.pname + '\" does not @override start()');\n }\n\n /**\n * @abstract\n */\n stop() {\n throw new Error('Provider \"' + this.pname + '\" does not @override stop()');\n }\n\n\n /**\n * Notify the subscriber defined in {@link addEventListener}\n * @param {ProviderEvent[]} events events to send to subscriber\n */\n notify(...events) {\n // Logging\n ProvidersLoggerOld.incrementNotifications(this);\n\n // Add current provider to the list of providers for this event.\n events.forEach(event => event.providersStack.unshift(this.pname));\n\n // Notify callbacks\n this._eventsCallbacks.forEach(({ onEvents }) => onEvents(events));\n\n // Keep a trace of the last events.\n this._lastEvents = events;\n }\n\n /**\n * Notify the subscriber defined in {@link addEventListener}\n * @param {Error} error The error raised\n */\n notifyError(error) {\n this._eventsCallbacks.forEach(({\n id, onError\n }) => {\n if (ProvidersOptions.stopOnError) {\n this.removeEventListener(id);\n }\n onError(error);\n });\n }\n\n /** @type {ProviderEvent} */\n get lastEvent() {\n return this._lastEvents ? this._lastEvents[0] : null;\n }\n\n /** @type {ProviderEvent[]} */\n get lastEvents() {\n return this._lastEvents;\n }\n\n /**\n * Input data from external interface\n * @param {ProviderEvent} event\n * @param {EventType} eventType\n */\n // eslint-disable-next-line no-unused-vars\n feed(event, eventType) {\n throw new Error('Not implemented');\n }\n}\n\nexport default Provider;\n","class AskImuOnDesktopError extends Error {\n\n static DEFAULT_MESSAGE = 'It seems that you ask for IMU events on a desktop browser';\n\n constructor(message) {\n super(message || AskImuOnDesktopError.DEFAULT_MESSAGE);\n }\n}\n\nexport default AskImuOnDesktopError;\n","import { deg2rad } from '@wemap/maths';\nimport {\n Browser, BrowserUtils\n} from '@wemap/utils';\n\nimport Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport AskImuOnDesktopError from '../../errors/AskImuOnDesktopError.js';\n\n/**\n * Imu (Inertial Measurement Unit) provider retrieve acceleration data\n * and/or angular rate data from inertial sensors.\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via devicemotion)\n * Safari iOS (v12.0): YES (via devicemotion)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/DeviceMotionEvent}\n * Firefox Android (v65.0.1): YES (via devicemotion)\n *\n * -----------------------------------\n */\nclass Imu extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'IMU';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AngularRate, EventType.Acceleration];\n }\n\n /**\n * @override\n */\n static get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n const subscribe = () => window.addEventListener('devicemotion', this.parseDeviceMotionEvent, true);\n\n if (typeof (DeviceMotionEvent) !== 'undefined' && typeof (DeviceMotionEvent.requestPermission) === 'function') {\n DeviceMotionEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n }\n\n /**\n * @override\n */\n stop() {\n window.removeEventListener('devicemotion', this.parseDeviceMotionEvent, true);\n }\n\n /**\n * devicemotion callback\n * @param {DeviceMotionEvent} e device motion event\n * @returns {ProviderEvent[]} an array of provider events\n * @private\n */\n parseDeviceMotionEvent = e => {\n const events = [];\n\n const timestamp = e.timeStamp / 1e3;\n\n let acc;\n if (e.accelerationIncludingGravity) {\n const {\n x, y, z\n } = e.accelerationIncludingGravity;\n\n if (typeof x === 'number' && typeof y === 'number' && typeof z === 'number') {\n acc = [x, y, z];\n\n if (BrowserUtils.name === Browser.SAFARI\n || BrowserUtils.name === Browser.IOS_WEBVIEW) {\n acc[0] *= -1;\n acc[1] *= -1;\n acc[2] *= -1;\n }\n }\n }\n\n if (acc) {\n events.push(this.createEvent(EventType.Acceleration, {\n timestamp,\n values: acc\n }));\n }\n\n let gyr;\n if (e.rotationRate) {\n const {\n alpha, beta, gamma\n } = e.rotationRate;\n\n if (typeof alpha === 'number' && typeof beta === 'number' && typeof gamma === 'number') {\n gyr = [deg2rad(alpha), deg2rad(beta), deg2rad(gamma)];\n }\n }\n\n if (gyr) {\n events.push(this.createEvent(EventType.AngularRate, {\n timestamp,\n values: gyr\n }));\n }\n\n if (events.length !== 0) {\n this.notify(...events);\n }\n }\n\n}\n\nexport default new Imu();\n","class MissingSensorError extends Error {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve events, a sensor is missing';\n\n constructor(message) {\n super(message || MissingSensorError.DEFAULT_MESSAGE);\n }\n\n from(fromMessage) {\n this.message += ' from ' + fromMessage;\n return this;\n }\n}\n\nexport default MissingSensorError;\n","import MissingSensorError from './MissingSensorError.js';\nclass MissingAccelerometerError extends MissingSensorError {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve Acceleration data';\n\n constructor(message) {\n super(message || MissingAccelerometerError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingAccelerometerError;\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport MissingAccelerometerError from '../../errors/MissingAccelerometerError.js';\nimport Imu from './Imu.js';\n\nclass Accelerometer extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Accelerometer';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Acceleration];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Imu.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Imu.addEventListener(\n events => this.parseImuEvents(events),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Imu.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n parseImuEvents = events => {\n\n const accelerationEvent = events.find(event => event.dataType === EventType.Acceleration);\n if (!accelerationEvent) {\n this.notifyError(new MissingAccelerometerError().from('devicemotion'));\n return;\n }\n this.notify(accelerationEvent.clone());\n }\n\n}\n\nexport default new Accelerometer();\n","import MissingSensorError from './MissingSensorError.js';\nclass MissingGyroscopeError extends MissingSensorError {\n\n static DEFAULT_MESSAGE = 'Impossible to retrieve Angular Rate data';\n\n constructor(message) {\n super(message || MissingSensorError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingGyroscopeError;\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport MissingGyroscopeError from '../../errors/MissingGyroscopeError.js';\nimport Imu from './Imu.js';\n\nclass Gyroscope extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Gyroscope';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AngularRate];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Imu.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Imu.addEventListener(\n events => this.parseImuEvents(events),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Imu.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n parseImuEvents = events => {\n\n const gyroscopeEvent = events.find(event => event.dataType === EventType.AngularRate);\n if (!gyroscopeEvent) {\n this.notifyError(new MissingGyroscopeError().from('devicemotion'));\n return;\n }\n this.notify(gyroscopeEvent.clone());\n }\n\n}\n\nexport default new Gyroscope();\n","import { Vector3 } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport Provider from '../Provider.js';\nimport Gyroscope from './Gyroscope.js';\n\nclass HighRotationsDetector extends Provider {\n\n // in radians by second\n static THRESHOLD = 10;\n\n /** @type {number} in seconds */\n static DELAY_CONSIDERATION = 3;\n\n /**\n * @override\n */\n static get pname() {\n return 'HighRotationsDetector';\n }\n\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.HighRotation];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Gyroscope.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Gyroscope.addEventListener(\n events => this._parseGyroscopeEvent(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Gyroscope.removeEventListener(this.providerId);\n }\n\n isInProgress() {\n if (!this.lastEvent || !Gyroscope.lastEvent) {\n return false;\n }\n\n const diffTime = Gyroscope.lastEvent.data.timestamp - this.lastEvent.data.timestamp;\n return diffTime < HighRotationsDetector.DELAY_CONSIDERATION;\n }\n\n /**\n * @private\n */\n _parseGyroscopeEvent = gyroscopeEvent => {\n\n const { values, timestamp } = gyroscopeEvent.data;\n const speed = Vector3.norm(values);\n if (speed > HighRotationsDetector.THRESHOLD) {\n this.notify(this.createEvent(EventType.HighRotation, { timestamp }, [gyroscopeEvent]));\n }\n\n }\n}\n\nexport default new HighRotationsDetector();\n","import MissingSensorError from './MissingSensorError.js';\n\nclass MissingMagnetometerError extends MissingSensorError {\n constructor(message) {\n super(message);\n }\n}\n\nexport default MissingMagnetometerError;\n","class LevelChange {\n\n /** @type {!string} [up|down] */\n direction;\n\n /** @type {!number} [-2, -1, 1, ...] */\n difference;\n\n /** @type {?string} [elevator|conveyor|stairs] */\n type = null;\n\n /**\n * @param {LevelChange} obj1\n * @param {LevelChange} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n return obj1.difference === obj2.difference\n && obj1.direction === obj2.direction\n && obj1.type === obj2.type;\n }\n\n /**\n * @param {LevelChange} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return LevelChange.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n return {\n direction: this.direction,\n difference: this.difference,\n type: this.type\n };\n }\n\n /**\n * @param {object} json\n * @returns {LevelChange}\n */\n static fromJson(json) {\n const levelChange = new LevelChange();\n levelChange.direction = json.direction;\n levelChange.difference = json.difference;\n levelChange.type = json.type;\n return levelChange;\n }\n}\n\nexport default LevelChange;\n","import { Coordinates } from '@wemap/geo';\n\nimport LevelChange from './LevelChange.js';\n\nclass Step {\n\n /** @type {!boolean} */\n firstStep = false;\n\n /** @type {!boolean} */\n lastStep = false;\n\n /** @type {!number} */\n number;\n\n /** @type {!Coordinates} */\n coords = [];\n\n\n /** @type {!number} */\n angle;\n\n /** @type {!number} */\n previousBearing;\n\n /** @type {!number} */\n nextBearing;\n\n\n /** @type {!number} */\n distance;\n\n /** @type {?number} */\n duration = null;\n\n /** @type {?string} */\n name = null;\n\n\n /** @type {?LevelChange} */\n levelChange = null;\n\n /** @type {?{?subwayEntrance: boolean, ?subwayEntranceRef: string}} */\n extras = {};\n\n /** @type {!number} */\n _idCoordsInLeg = null;\n\n /**\n * @param {Step} obj1\n * @param {Step} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n return obj1.firstStep === obj2.firstStep\n && obj1.lastStep === obj2.lastStep\n && obj1.number === obj2.number\n && obj1.coords.equalsTo(obj2.coords)\n && obj1.angle === obj2.angle\n && obj1.previousBearing === obj2.previousBearing\n && obj1.nextBearing === obj2.nextBearing\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.name === obj2.name\n && (\n obj1.levelChange === obj2.levelChange\n || obj1.levelChange !== null && obj1.levelChange.equalsTo(obj2.levelChange)\n )\n && (\n obj1.extras === obj2.extras\n || (\n obj1.extras !== null\n && obj1.extras.subwayEntrance === obj2.extras.subwayEntrance\n && obj1.extras.subwayEntranceRef === obj2.extras.subwayEntranceRef\n )\n )\n && obj1._idCoordsInLeg === obj2._idCoordsInLeg;\n }\n\n /**\n * @param {Step} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Step.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n number: this.number,\n coords: this.coords.toCompressedJson(),\n angle: this.angle,\n previousBearing: this.previousBearing,\n nextBearing: this.nextBearing,\n distance: this.distance,\n _idCoordsInLeg: this._idCoordsInLeg\n };\n if (this.firstStep) {\n output.firstStep = true;\n }\n if (this.lastStep) {\n output.lastStep = true;\n }\n if (this.duration !== null) {\n output.duration = this.duration;\n }\n if (this.name !== null) {\n output.name = this.name;\n }\n if (this.levelChange !== null) {\n output.levelChange = this.levelChange.toJson();\n }\n if (this.extras && Object.keys(this.extras).length !== 0) {\n output.extras = this.extras;\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Step}\n */\n static fromJson(json) {\n const step = new Step();\n step.number = json.number;\n step.coords = Coordinates.fromCompressedJson(json.coords);\n step.angle = json.angle;\n step.previousBearing = json.previousBearing;\n step.nextBearing = json.nextBearing;\n step.distance = json.distance;\n step._idCoordsInLeg = json._idCoordsInLeg;\n if (typeof json.firstStep === 'boolean') {\n step.firstStep = json.firstStep;\n }\n if (typeof json.lastStep === 'boolean') {\n step.lastStep = json.lastStep;\n }\n if (typeof json.duration === 'number') {\n step.duration = json.duration;\n }\n if (typeof json.name === 'string') {\n step.name = json.name;\n }\n if (typeof json.levelChange === 'object') {\n step.levelChange = LevelChange.fromJson(json.levelChange);\n }\n if (typeof json.extras === 'object') {\n step.extras = json.extras;\n }\n return step;\n }\n}\n\nexport default Step;\n","const Constants = {};\n\nConstants.ROUTING_MODE = {\n AIRPLANE: 'AIRPLANE',\n BOAT: 'BOAT',\n BIKE: 'BIKE',\n BUS: 'BUS',\n CAR: 'CAR',\n FERRY: 'FERRY',\n FUNICULAR: 'FUNICULAR',\n METRO: 'METRO',\n MOTO: 'MOTO',\n TRAIN: 'TRAIN',\n TAXI: 'TAXI',\n TRAM: 'TRAM',\n WALK: 'WALK',\n MULTI: 'MULTI',\n UNKNOWN: 'UNKNOWN'\n};\n\nConstants.PUBLIC_TRANSPORT = [\n Constants.ROUTING_MODE.AIRPLANE,\n Constants.ROUTING_MODE.BOAT,\n Constants.ROUTING_MODE.BUS,\n Constants.ROUTING_MODE.FERRY,\n Constants.ROUTING_MODE.FUNICULAR,\n Constants.ROUTING_MODE.METRO,\n Constants.ROUTING_MODE.TRAIN,\n Constants.ROUTING_MODE.TRAM\n];\n\nexport default Constants;\n","import { Coordinates, Network } from '@wemap/geo';\n\nimport Step from './Step.js';\nimport Constants from '../Constants.js';\n\nclass Leg {\n\n /** @type {!string} can be values in Constants.ROUTING_MODE */\n mode;\n\n /** @type {!number} */\n distance;\n\n /** @type {!number} */\n duration;\n\n /** @type {?number} */\n startTime = null;\n\n /** @type {?number} */\n endTime = null;\n\n /** @type {!{name: ?string, coords: !Coordinates}} */\n from;\n\n /** @type {!{name: ?string, coords: !Coordinates}} */\n to;\n\n /** @type {!Coordinates[]} */\n coords;\n\n /** @type {?{name: !string, routeColor: ?string, routeTextColor: ?string, directionName: ?string}} */\n transportInfo = null;\n\n /** @type {?(Step[])} */\n steps = null;\n\n isPublicTransport() {\n return Constants.PUBLIC_TRANSPORT.includes(this.mode);\n }\n\n /**\n * @returns {Network}\n */\n toNetwork() {\n return Network.fromCoordinates([this.coords]);\n }\n\n\n /**\n * @param {Leg} obj1\n * @param {Leg} obj2\n * @returns {Boolean}\n */\n // eslint-disable-next-line complexity\n static equalsTo(obj1, obj2) {\n const intermediate = obj1.mode === obj2.mode\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.from.name === obj2.from.name\n && obj1.from.coords.equalsTo(obj2.from.coords)\n && obj1.to.name === obj2.to.name\n && obj1.to.coords.equalsTo(obj2.to.coords)\n && obj1.coords.length === obj2.coords.length\n && (\n obj1.steps === obj2.steps\n || obj1.steps.length === obj2.steps.length\n );\n\n if (!intermediate) {\n return false;\n }\n\n let i;\n for (i = 0; i < obj1.coords.length; i++) {\n if (!obj1.coords[i].equalsTo(obj2.coords[i])) {\n return false;\n }\n }\n if (obj1.steps) {\n for (i = 0; i < obj1.steps.length; i++) {\n if (!obj1.steps[i].equalsTo(obj2.steps[i])) {\n return false;\n }\n }\n }\n\n if (obj1.transportInfo !== obj2.transportInfo) {\n if (obj1.transportInfo === null) {\n return false;\n }\n if (\n obj1.transportInfo.name !== obj2.transportInfo.name\n || obj1.transportInfo.routeColor !== obj2.transportInfo.routeColor\n || obj1.transportInfo.routeTextColor !== obj2.transportInfo.routeTextColor\n || obj1.transportInfo.directionName !== obj2.transportInfo.directionName\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @param {Leg} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Leg.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n mode: this.mode,\n from: { coords: this.from.coords.toCompressedJson() },\n to: { coords: this.to.coords.toCompressedJson() },\n distance: this.distance,\n duration: this.duration,\n coords: this.coords.map(coords => coords.toCompressedJson())\n };\n if (this.startTime !== null) {\n output.startTime = this.startTime;\n }\n if (this.endTime !== null) {\n output.endTime = this.endTime;\n }\n if (this.from.name !== null) {\n output.from.name = this.from.name;\n }\n if (this.to.name !== null) {\n output.to.name = this.to.name;\n }\n if (this.transportInfo !== null) {\n output.transportInfo = this.transportInfo;\n }\n if (this.steps !== null && this.steps.length > 0) {\n output.steps = this.steps.map(step => step.toJson());\n }\n return output;\n }\n\n\n /**\n * @param {object} json\n * @returns {Leg}\n */\n static fromJson(json) {\n const leg = new Leg();\n leg.mode = json.mode;\n leg.distance = json.distance;\n leg.duration = json.duration;\n\n if (typeof json.startTime === 'number') {\n leg.startTime = json.startTime;\n }\n if (typeof json.endTime === 'number') {\n leg.endTime = json.endTime;\n }\n\n leg.from = {\n coords: Coordinates.fromCompressedJson(json.from.coords),\n name: typeof json.from.name === 'string' ? json.from.name : null\n };\n leg.to = {\n coords: Coordinates.fromCompressedJson(json.to.coords),\n name: typeof json.to.name === 'string' ? json.to.name : null\n };\n\n leg.coords = json.coords.map(Coordinates.fromCompressedJson);\n\n if (typeof json.transportInfo === 'object') {\n leg.transportInfo = json.transportInfo;\n }\n if (typeof json.steps === 'object') {\n leg.steps = json.steps.map(Step.fromJson);\n }\n return leg;\n }\n\n}\n\nexport default Leg;\n","\nimport RouterResponse from './model/RouterResponse.js';\n\n/**\n * Get route duration\n * @param {Number} speed in km/h\n * @returns {Number} duration in seconds\n */\nexport function getDurationFromLength(length, speed = 5) {\n return length / (speed * 1000 / 3600);\n}\n\n/* eslint-disable max-statements */\n/* eslint-disable max-depth */\n/**\n * @param {RouterResponse} routerResponse\n * @param {Number} levelFactor\n */\nexport function multiplyRouterResponseLevel(routerResponse, levelFactor) {\n if (routerResponse.from.level) {\n routerResponse.from.level.multiplyBy(levelFactor);\n }\n if (routerResponse.to.level) {\n routerResponse.to.level.multiplyBy(levelFactor);\n }\n for (const itinerary of routerResponse.itineraries) {\n if (itinerary.from.level) {\n itinerary.from.level.multiplyBy(levelFactor);\n }\n if (itinerary.to.level) {\n itinerary.to.level.multiplyBy(levelFactor);\n }\n\n for (const leg of itinerary.legs) {\n if (leg.from.coords.level) {\n leg.from.coords.level.multiplyBy(levelFactor);\n }\n if (leg.to.coords.level) {\n leg.to.coords.level.multiplyBy(levelFactor);\n }\n for (const coords of leg.coords) {\n if (coords.level) {\n coords.level.multiplyBy(levelFactor);\n }\n }\n if (leg.steps) {\n for (const step of leg.steps) {\n if (step.coords.level) {\n step.coords.level.multiplyBy(levelFactor);\n }\n }\n }\n }\n\n if (itinerary._coords) {\n for (const coords of itinerary._coords) {\n if (coords.level) {\n coords.level.multiplyBy(levelFactor);\n }\n }\n }\n }\n}\n","/* eslint-disable max-statements */\nimport { Coordinates, Network } from '@wemap/geo';\nimport Leg from './Leg.js';\nimport Step from './Step.js';\nimport Constants from '../Constants.js';\nimport { getDurationFromLength } from '../Utils.js';\n\n/**\n * Main attributes are:\n * nodes: the ordered list of Node\n * edges: the ordered list of Edge\n * start: the start point (Coordinates)\n * end: the end point (Coordinates)\n * length: the route length\n */\nclass Itinerary {\n\n /** @type {!Coordinates} */\n from;\n\n /** @type {!Coordinates} */\n to;\n\n /** @type {!number} */\n distance;\n\n /** @type {!number} */\n duration;\n\n /** @type {!string} can be WALK, BIKE, CAR, PT */\n _mode;\n\n /** @type {?number} */\n startTime = null;\n\n /** @type {?number} */\n endTime = null;\n\n /** @type {!(Leg[])} */\n legs = [];\n\n /** @type {?Coordinates[]} */\n _coords = null;\n\n set coords(_) {\n throw new Error('Itinerary.coords cannot be set. They are calculated from Itinerary.legs.');\n }\n\n /** @type {!(Coordinates[])} */\n get coords() {\n if (!this._coords) {\n // Returns the coordinates contained in all legs and remove duplicates between array\n this._coords = this.legs.reduce((acc, val) => {\n const isDuplicate = acc.length && val.coords.length && acc[acc.length - 1].equalsTo(val.coords[0]);\n acc.push(...val.coords.slice(isDuplicate ? 1 : 0));\n return acc;\n }, []);\n }\n return this._coords;\n }\n\n set steps(_) {\n throw new Error('Itinerary.step cannot be set. They are calculated from Itinerary.legs.');\n }\n\n /** @type {!(Step[])} */\n get steps() {\n return this.legs.map(leg => leg.steps).flat();\n }\n\n set mode(_) {\n throw new Error('Itinerary.mode cannot be set. They are calculated from Itinerary.legs.');\n }\n\n get mode() {\n if (!this._mode) {\n let isPublicTransport = false;\n let isBicycle = false;\n let isDriving = false;\n\n this.legs.forEach((leg) => {\n isPublicTransport = isPublicTransport || Constants.PUBLIC_TRANSPORT.includes(leg.mode);\n isBicycle = isBicycle || leg.mode === Constants.ROUTING_MODE.BIKE;\n isDriving = isDriving || leg.mode === Constants.ROUTING_MODE.CAR;\n });\n\n if (isPublicTransport) {\n this._mode = 'PT';\n } else if (isDriving) {\n this._mode = 'CAR';\n } else if (isBicycle) {\n this._mode = 'BIKE';\n } else {\n this._mode = 'WALK';\n }\n }\n\n return this._mode;\n\n }\n\n /**\n * @returns {Network}\n */\n toNetwork() {\n return Network.fromCoordinates([this.coords]);\n }\n\n /**\n * @param {Itinerary[]} itineraries\n * @returns {Itinerary}\n */\n static fromItineraries(...itineraries) {\n const itinerary = new Itinerary();\n itinerary.from = itineraries[0].from;\n itinerary.to = itineraries[itineraries.length - 1].to;\n itinerary.distance = 0;\n itinerary.duration = 0;\n itinerary.legs = [];\n\n itineraries.forEach(_itinerary => {\n itinerary.distance += _itinerary.distance;\n itinerary.duration += _itinerary.duration;\n itinerary.legs.push(..._itinerary.legs);\n itinerary.legs.forEach(leg => {\n leg.steps[0].firstStep = false;\n leg.steps[leg.steps.length - 1].lastStep = false;\n });\n });\n\n itinerary.legs[0].steps[0].firstStep = true;\n const lastLeg = itinerary.legs[itinerary.legs.length - 1];\n lastLeg.steps[lastLeg.steps.length - 1].lastStep = true;\n\n return itinerary;\n }\n\n /**\n * Convert lat/lng/level points to Itinerary\n * @param {number[][]} points 2D points array of lat/lng/level (level is optional)\n * @param {Coordinates} from\n * @param {Coordinates} to\n * @param {string} mode\n * @returns {Itinerary}\n */\n static fromOrderedPointsArray(points, start, end) {\n\n const pointToCoordinates = point => new Coordinates(point[0], point[1], null, point[2]);\n\n return this.fromOrderedCoordinates(\n points.map(pointToCoordinates),\n pointToCoordinates(start),\n pointToCoordinates(end)\n );\n }\n\n /**\n * Convert ordered Coordinates to Itinerary\n * @param {Coordinates[]} points\n * @param {Coordinates} from\n * @param {Coordinates} to\n * @param {string} mode\n * @returns {Itinerary}\n */\n static fromOrderedCoordinates(points, from, to, mode = 'WALK') {\n\n const itinerary = new Itinerary();\n itinerary.from = from;\n itinerary.to = to;\n\n const leg = new Leg();\n leg.mode = mode;\n leg.from = { name: null, coords: from };\n leg.to = { name: null, coords: to };\n\n leg.coords = points;\n leg.distance = points.reduce((acc, coords, idx, arr) => {\n if (idx !== 0) {\n return acc + arr[idx - 1].distanceTo(coords);\n }\n return acc;\n }, 0);\n leg.duration = getDurationFromLength(leg.distance);\n itinerary.legs.push(leg);\n\n itinerary.distance = leg.distance;\n itinerary.duration = leg.duration;\n\n return itinerary;\n }\n\n\n /**\n * @param {Itinerary} obj1\n * @param {Itinerary} obj2\n * @returns {Boolean}\n */\n static equalsTo(obj1, obj2) {\n const intermediate = obj1.from.equalsTo(obj2.from)\n && obj1.to.equalsTo(obj2.to)\n && obj1.distance === obj2.distance\n && obj1.duration === obj2.duration\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.legs.length === obj2.legs.length;\n\n if (!intermediate) {\n return false;\n }\n\n for (let i = 0; i < obj1.legs.length; i++) {\n if (!obj1.legs[i].equalsTo(obj2.legs[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @param {Itinerary} obj\n * @returns {Boolean}\n */\n equalsTo(obj) {\n return Itinerary.equalsTo(this, obj);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n const output = {\n from: this.from.toCompressedJson(),\n to: this.to.toCompressedJson(),\n distance: this.distance,\n duration: this.duration,\n mode: this.mode,\n legs: this.legs.map(leg => leg.toJson())\n };\n if (this.startTime !== null) {\n output.startTime = this.startTime;\n }\n if (this.endTime !== null) {\n output.endTime = this.endTime;\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Itinerary}\n */\n static fromJson(json) {\n const itinerary = new Itinerary();\n itinerary.from = Coordinates.fromCompressedJson(json.from);\n itinerary.to = Coordinates.fromCompressedJson(json.to);\n itinerary.distance = json.distance;\n itinerary.duration = json.duration;\n itinerary.legs = json.legs.map(Leg.fromJson);\n if (typeof json.startTime === 'number') {\n itinerary.startTime = json.startTime;\n }\n if (typeof json.endTime === 'number') {\n itinerary.endTime = json.endTime;\n }\n return itinerary;\n }\n}\nexport default Itinerary;\n","import { GraphRouterOptions } from '@wemap/geo';\nimport { OsmElement } from '@wemap/osm';\n\nclass WemapRouterOptions extends GraphRouterOptions {\n\n /** @type {WemapRouterOptions} */\n static DEFAULT = new WemapRouterOptions();\n\n /**\n * @returns {WemapRouterOptions}\n */\n static get WITHOUT_STAIRS() {\n const options = new WemapRouterOptions();\n options.acceptEdgeFn = edge => edge.builtFrom.tags.highway !== 'steps';\n return options;\n }\n\n /**\n * Get route duration\n * @param {Number} speed in km/h\n */\n static getDurationFromLength(length, speed = 5) {\n return length / (speed * 1000 / 3600);\n }\n\n /** @type {function(GraphEdge<OsmElement>):boolean} */\n weightEdgeFn = edge => edge.builtFrom.isElevator ? 30 : WemapRouterOptions.getDurationFromLength(edge.length);\n\n\n}\n\nexport default WemapRouterOptions;\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { Coordinates, Level, GraphItinerary, GraphNode, GraphUtils } from '@wemap/geo';\nimport { diffAngle, deg2rad } from '@wemap/maths';\nimport { OsmElement } from '@wemap/osm';\n\nimport LevelChange from '../model/LevelChange.js';\nimport Step from '../model/Step.js';\n\nconst SKIP_STEP_ANGLE_MAX = deg2rad(20);\n\nclass WemapStepsGeneration {\n\n /**\n * @param {GraphItinerary<OsmElement>} itinerary\n * @returns {Step[]}\n */\n static fromGraphItinerary(itinerary) {\n\n const steps = [];\n\n const { start, end, nodes, edges } = itinerary;\n\n let currentStep, previousStep;\n let previousBearing = start.bearingTo(nodes[0].coords);\n\n for (let i = 0; i < nodes.length - 1; i++) {\n\n const isFirstStep = !currentStep;\n\n const node = nodes[i];\n const nextNode = nodes[i + 1];\n const edge = edges[i];\n\n const bearing = edge.bearing;\n const angle = diffAngle(previousBearing, bearing + Math.PI);\n\n let splitByAngle = Math.abs(diffAngle(Math.PI, angle)) >= SKIP_STEP_ANGLE_MAX;\n\n const splitByLevel = edge.level && edge.level.isRange\n && node.coords.level && !node.coords.level.isRange;\n splitByAngle = splitByAngle && !(node.coords.level && node.coords.level.isRange);\n\n const splitStepCondition = splitByAngle || splitByLevel;\n\n const isSubwayEntrance = node ? node.builtFrom.tags.railway === 'subway_entrance' : false;\n\n // New step creation\n if (isFirstStep || splitStepCondition || isSubwayEntrance) {\n\n previousStep = currentStep;\n\n currentStep = new Step();\n currentStep.coords = node.coords;\n currentStep.number = steps.length + 1;\n currentStep.angle = angle;\n currentStep.previousBearing = previousBearing;\n currentStep.nextBearing = bearing;\n currentStep.name = edge.builtFrom.tags.name || null;\n currentStep.distance = 0;\n currentStep.duration = 0;\n\n if (isSubwayEntrance) {\n currentStep.extras.subwayEntrance = true;\n currentStep.name = node.builtFrom.tags.name;\n if (node.builtFrom.tags.ref) {\n currentStep.extras.subwayEntranceRef = node.builtFrom.tags.ref;\n }\n }\n\n if (splitByLevel) {\n currentStep.levelChange = WemapStepsGeneration.levelChangefromTwoNodes(node, nextNode);\n }\n\n steps.push(currentStep);\n\n if (!previousStep) {\n currentStep.firstStep = true;\n }\n }\n\n currentStep.distance += edge.length;\n currentStep.duration += itinerary.edgesWeights[i];\n previousBearing = bearing;\n }\n\n const lastNode = nodes[nodes.length - 1];\n\n // Create a last step if end is not on the network\n if (!Coordinates.equalsTo(lastNode.coords, end)) {\n const lastStep = new Step();\n lastStep.coords = lastNode.coords;\n lastStep.number = steps.length + 1;\n lastStep.previousBearing = previousBearing;\n lastStep.distance = lastNode.coords.distanceTo(end);\n lastStep.nextBearing = lastNode.coords.bearingTo(end);\n lastStep.angle = diffAngle(lastStep.previousBearing, lastStep.nextBearing + Math.PI);\n steps.push(lastStep);\n }\n\n steps[steps.length - 1].lastStep = true;\n\n return steps;\n }\n\n /**\n * @param {GraphNode<OsmElement>} firstNode\n * @param {GraphNode<OsmElement>} secondNode\n * @returns {LevelChange}\n */\n static levelChangefromTwoNodes(firstNode, secondNode) {\n\n const levelChange = new LevelChange();\n\n const edge = GraphUtils.getEdgeByNodes(firstNode.edges, firstNode, secondNode);\n\n if (edge.builtFrom.isElevator) {\n levelChange.type = 'elevator';\n } else if (edge.builtFrom.isConveying) {\n levelChange.type = 'conveyor';\n } else if (edge.builtFrom.areStairs) {\n levelChange.type = 'stairs';\n }\n\n levelChange.difference = Level.diff(firstNode.coords.level, secondNode.coords.level);\n levelChange.direction = levelChange.difference > 0 ? 'up' : 'down';\n\n return levelChange;\n }\n}\nexport default WemapStepsGeneration;\n","/* eslint-disable max-depth */\n/* eslint-disable max-statements */\nimport { Coordinates } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport RemoteRouter from '../RemoteRouter.js';\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata, dateWithTimeZone } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'Car');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'Walk');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'Bike');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'PT');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'PT');\n\n\n/**\n * List of all routing modes supported by the API\n */\nconst routingModeCorrespondance = new Map();\nroutingModeCorrespondance.set('WALK', Constants.ROUTING_MODE.WALK);\nroutingModeCorrespondance.set('BICYCLE', Constants.ROUTING_MODE.BIKE);\nroutingModeCorrespondance.set('TRAMWAY', Constants.ROUTING_MODE.TRAM);\nroutingModeCorrespondance.set('METRO', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('FUNICULAR', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('BUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('COACH', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SCHOOL', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('BUS_PMR', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('MINIBUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TROLLEY_BUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TAXIBUS', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SHUTTLE', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('TRAIN', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('HST', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('LOCAL_TRAIN', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('AIR', Constants.ROUTING_MODE.AIRPLANE);\nroutingModeCorrespondance.set('FERRY', Constants.ROUTING_MODE.BOAT);\nroutingModeCorrespondance.set('TAXI', Constants.ROUTING_MODE.UNKNOWN);\nroutingModeCorrespondance.set('CAR_POOL', Constants.ROUTING_MODE.UNKNOWN);\nroutingModeCorrespondance.set('PRIVATE_VEHICLE', Constants.ROUTING_MODE.CAR);\nroutingModeCorrespondance.set('SCOOTER', Constants.ROUTING_MODE.MOTO);\n\n/**\n * List of all plan trip supported by the API\n * Routing mode UNKNOWN means that the itinerary will not be parsed by the router\n */\nconst planTripType = new Map();\nplanTripType.set(0, Constants.ROUTING_MODE.BUS);\nplanTripType.set(1, Constants.ROUTING_MODE.WALK);\nplanTripType.set(2, Constants.ROUTING_MODE.BIKE);\nplanTripType.set(3, Constants.ROUTING_MODE.CAR);\nplanTripType.set(4, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(5, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(6, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(7, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(8, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(9, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(10, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(11, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(12, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(13, Constants.ROUTING_MODE.UNKNOWN);\nplanTripType.set(14, Constants.ROUTING_MODE.UNKNOWN);\n\n\n/**\n * Singleton.\n */\nclass CitywayRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'cityway';\n }\n\n\n /**\n * @override\n * @throws {RoutingModeCorrespondanceNotFound}\n * @throws {RemoteRouterServerUnreachable}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n const res = await (fetch(url).catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }));\n\n const jsonResponse = await res.json().catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n });\n return this.createRouterResponseFromJson(jsonResponse);\n }\n\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n const citywayMode = inputModeCorrespondance.get(mode);\n if (!citywayMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n const fromPlace = `DepartureLatitude=${waypoints[0].latitude}&DepartureLongitude=${waypoints[0].longitude}`;\n const toPlace = `ArrivalLatitude=${waypoints[1].latitude}&ArrivalLongitude=${waypoints[1].longitude}`;\n const queryMode = `TripModes=${citywayMode}`;\n\n const url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}&${queryMode}`;\n\n return `${url.origin}${url.pathname}${search}`;\n }\n\n /**\n * Generate multi itineraries from Cityway JSON\n * @param {object} json JSON file provided by Cityway.\n * @returns {?RouterResponse}\n * @example https://preprod.api.lia2.cityway.fr/journeyplanner/api/opt/PlanTrips/json?DepartureLatitude=49.51509388236216&DepartureLongitude=0.09341749619366316&ArrivalLatitude=49.5067090188444&ArrivalLongitude=0.1694842115417831&DepartureType=COORDINATES&ArrivalType=COORDINATES\n */\n createRouterResponseFromJson(json) {\n\n if (json.StatusCode !== 200 || !json.Data || !json.Data.length) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n\n // Do not know if it the best approach, but it works...\n const allJsonTrips = json.Data.reduce((acc, dataObj) => {\n acc.push(...dataObj.response.trips.Trip.map(trip => ({\n ...trip,\n ...(dataObj.hasOwnProperty('PlanTripType') ? { PlanTripType: dataObj.PlanTripType } : {})\n })));\n return acc;\n }, []);\n\n // eslint-disable-next-line no-labels\n itineraryLoop:\n for (const trip of allJsonTrips) {\n\n if (trip.hasOwnProperty('PlanTripType') && planTripType.get(trip.PlanTripType) === Constants.ROUTING_MODE.UNKNOWN) {\n continue;\n }\n\n const itinerary = new Itinerary();\n\n itinerary.duration = this.parseDuration(trip.Duration);\n itinerary.startTime = this.jsonDateToTimestamp(trip.Departure.Time);\n itinerary.from = this.jsonToCoordinates(trip.Departure.Site.Position);\n itinerary.endTime = this.jsonDateToTimestamp(trip.Arrival.Time);\n itinerary.to = this.jsonToCoordinates(trip.Arrival.Site.Position);\n\n for (const jsonSection of trip.sections.Section) {\n\n const jsonLeg = jsonSection.Leg ? jsonSection.Leg : jsonSection.PTRide;\n\n const leg = new Leg();\n\n leg.mode = routingModeCorrespondance.get(jsonLeg.TransportMode);\n leg.duration = this.parseDuration(jsonLeg.Duration);\n leg.startTime = this.jsonDateToTimestamp(jsonLeg.Departure.Time);\n leg.endTime = this.jsonDateToTimestamp(jsonLeg.Arrival.Time);\n leg.coords = [];\n\n if (leg.mode === Constants.ROUTING_MODE.UNKNOWN) {\n // eslint-disable-next-line\n continue itineraryLoop;\n }\n\n if (leg.mode === Constants.ROUTING_MODE.WALK\n || leg.mode === Constants.ROUTING_MODE.BIKE\n || leg.mode === Constants.ROUTING_MODE.CAR) {\n\n leg.from = {\n name: jsonLeg.Departure.Site.Name,\n coords: this.jsonToCoordinates(jsonLeg.Departure.Site.Position)\n };\n leg.to = {\n name: jsonLeg.Arrival.Site.Name,\n coords: this.jsonToCoordinates(jsonLeg.Arrival.Site.Position)\n };\n\n leg.steps = [];\n for (const jsonPathLink of jsonLeg.pathLinks.PathLink) {\n const step = new Step();\n let stepCoords;\n if (jsonPathLink.Geometry) {\n stepCoords = this.parseWKTGeometry(jsonPathLink.Geometry);\n } else {\n stepCoords = [leg.from.coords, leg.to.coords];\n }\n step.coords = stepCoords[0];\n step._idCoordsInLeg = leg.coords.length;\n stepCoords.forEach((coords, idx) => {\n if (\n idx !== 0\n || leg.coords.length === 0\n || !leg.coords[leg.coords.length - 1].equalsTo(coords)\n ) {\n leg.coords.push(coords);\n }\n });\n\n\n step.name = jsonPathLink.Departure.Site.Name;\n step.levelChange = null;\n\n step.distance = jsonPathLink.Distance;\n\n leg.steps.push(step);\n }\n\n } else if (Constants.PUBLIC_TRANSPORT.includes(leg.mode)) {\n\n leg.from = {\n name: jsonLeg.Departure.StopPlace.Name,\n coords: this.jsonToCoordinates(jsonLeg.Departure.StopPlace.Position)\n };\n leg.to = {\n name: jsonLeg.Arrival.StopPlace.Name,\n coords: this.jsonToCoordinates(jsonLeg.Arrival.StopPlace.Position)\n };\n\n let transportName = jsonLeg.Line.Number;\n if (leg.mode === Constants.ROUTING_MODE.TRAM && transportName.toLowerCase().includes('tram')) {\n // In order to remove the \"TRAM \" prefix.\n transportName = transportName.substr(5);\n }\n\n leg.transportInfo = {\n name: transportName,\n routeColor: jsonLeg.Line.Color,\n routeTextColor: jsonLeg.Line.TextColor,\n directionName: jsonLeg.Destination\n };\n\n for (const jsonStep of jsonLeg.steps.Step) {\n const stepCoords = this.parseWKTGeometry(jsonStep.Geometry);\n stepCoords.forEach((coords, idx) => {\n if (\n idx !== 0\n || leg.coords.length === 0\n || !leg.coords[leg.coords.length - 1].equalsTo(coords)\n ) {\n leg.coords.push(coords);\n }\n });\n }\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = jsonLeg.Line.Name;\n legStep.levelChange = null;\n legStep.distance = jsonLeg.Distance;\n leg.steps = [legStep];\n } else {\n Logger.warn(`[CitywayParser] Unknown leg mode: ${jsonLeg.TransportMode}`);\n }\n\n leg.distance = leg.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n itinerary.legs.push(leg);\n\n }\n\n routerResponse.itineraries.push(itinerary);\n\n itinerary.distance = itinerary.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n routerResponse.from = routerResponse.itineraries[0].from;\n routerResponse.to = routerResponse.itineraries[routerResponse.itineraries.length - 1].to;\n\n return routerResponse;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(json.Lat, json.Long);\n }\n\n /**\n * @param {string} jsonDate\n * @returns {number}\n */\n jsonDateToTimestamp(jsonDate) {\n const [dateStr, timeStr] = jsonDate.split(' ');\n const [dayStr, monthStr, yearStr] = dateStr.split('/');\n const [hoursStr, minutesStr, secondsStr] = timeStr.split(':');\n\n return dateWithTimeZone(\n Number(yearStr),\n Number(monthStr) - 1,\n Number(dayStr),\n Number(hoursStr),\n Number(minutesStr),\n Number(secondsStr)\n ).getTime();\n }\n\n /**\n * @param {string} wktGeometry\n * @returns {Coordinates[]}\n */\n parseWKTGeometry(wktGeometry) {\n const tmpCoordsStr = wktGeometry.match(/LINESTRING \\((.*)\\)/i);\n const tmpCoordsPt = wktGeometry.match(/POINT \\((.*)\\)/i);\n if (!tmpCoordsStr && !tmpCoordsPt) {\n return null;\n }\n\n if (tmpCoordsPt) {\n const [lng, lat] = tmpCoordsPt[1].split(' ');\n return [new Coordinates(Number(lat), Number(lng))];\n }\n\n return tmpCoordsStr[1].split(',').map(str => {\n const sp = str.trim().split(' ');\n return new Coordinates(Number(sp[1]), Number(sp[0]));\n });\n }\n\n /**\n * @param {string} iso8601Duration\n * @see https://stackoverflow.com/a/29153059/2239938\n */\n parseDuration(iso8601Duration) {\n const iso8601DurationRegex = /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\n var matches = iso8601Duration.match(iso8601DurationRegex);\n\n // const sign = typeof matches[1] === 'undefined' ? '+' : '-',\n const years = typeof matches[2] === 'undefined' ? 0 : Number(matches[2]);\n const months = typeof matches[3] === 'undefined' ? 0 : Number(matches[3]);\n const weeks = typeof matches[4] === 'undefined' ? 0 : Number(matches[4]);\n const days = typeof matches[5] === 'undefined' ? 0 : Number(matches[5]);\n const hours = typeof matches[6] === 'undefined' ? 0 : Number(matches[6]);\n const minutes = typeof matches[7] === 'undefined' ? 0 : Number(matches[7]);\n const seconds = typeof matches[8] === 'undefined' ? 0 : Number(matches[8]);\n\n return seconds\n + minutes * 60\n + hours * 3600\n + days * 86400\n + weeks * (86400 * 7)\n + months * (86400 * 30)\n + years * (86400 * 365.25);\n }\n}\n\nexport default new CitywayRemoteRouter();\n","/* eslint-disable max-statements */\nimport { Coordinates, Utils as GeoUtils } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata, dateWithTimeZone } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\nimport IdfmRemoteRouterTokenError from './IdfmRemoteRouterTokenError.js';\n\n/**\n * List of all modes supported by the API\n * http://doc.navitia.io/#physical-mode\n */\n\nconst routingModeCorrespondance = new Map();\nroutingModeCorrespondance.set('Air', Constants.ROUTING_MODE.AIRPLANE);\nroutingModeCorrespondance.set('Boat', Constants.ROUTING_MODE.BOAT);\nroutingModeCorrespondance.set('Bus', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('BusRapidTransit', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Coach', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Ferry', Constants.ROUTING_MODE.FERRY);\nroutingModeCorrespondance.set('Funicular', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('LocalTrain', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('LongDistanceTrain', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('Metro', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('Métro', Constants.ROUTING_MODE.METRO);\nroutingModeCorrespondance.set('RailShuttle', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('RapidTransit', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('Shuttle', Constants.ROUTING_MODE.BUS);\nroutingModeCorrespondance.set('SuspendedCableCar', Constants.ROUTING_MODE.FUNICULAR);\nroutingModeCorrespondance.set('Taxi', Constants.ROUTING_MODE.TAXI);\nroutingModeCorrespondance.set('Train', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('RER', Constants.ROUTING_MODE.TRAIN);\nroutingModeCorrespondance.set('Tramway', Constants.ROUTING_MODE.TRAM);\nroutingModeCorrespondance.set('walking', Constants.ROUTING_MODE.WALK);\nroutingModeCorrespondance.set('bike', Constants.ROUTING_MODE.BIKE);\n\n/**\n * List of transports modes\n */\nconst TRANSPORT_IDS = [\n 'physical_mode:Air',\n 'physical_mode:Boat',\n 'physical_mode:Bus',\n 'physical_mode:BusRapidTransit',\n 'physical_mode:Coach',\n 'physical_mode:Ferry',\n 'physical_mode:Funicular',\n 'physical_mode:LocalTrain',\n 'physical_mode:LongDistanceTrain',\n 'physical_mode:Metro',\n 'physical_mode:RailShuttle',\n 'physical_mode:RapidTransit',\n 'physical_mode:Shuttle',\n 'physical_mode:SuspendedCableCar',\n 'physical_mode:Taxi',\n 'physical_mode:Train',\n 'physical_mode:Tramway'\n];\n\nconst clientId = '539eec73-3bb5-4327-bb5e-a52672658592';\nconst clientSecret = '899f4bb9-f1d5-45d3-9f67-530827bb6734';\n\n/**\n * Get last item of a given array\n * @param {Array} array\n * @returns {any}\n */\nfunction last(array) {\n return array[array.length - 1];\n}\n\n/**\n * Singleton.\n */\nclass IdfmRemoteRouter extends RemoteRouter {\n\n isLogged = false;\n token = null;\n expiresAt = null;\n\n /**\n * @override\n */\n get rname() {\n return 'idfm';\n }\n\n /**\n * @override\n * @throws {IdfmRemoteRouterTokenError}\n * @throws {RemoteRouterServerUnreachable}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n if (!this.canRequestService()) {\n await this._connect();\n }\n\n const url = this.getURL(endpointUrl, mode, waypoints);\n\n const res = await (fetch(url, {\n method: 'GET',\n headers: { Authorization: 'Bearer ' + this.token }\n }).catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }));\n\n\n const jsonResponse = await res.json().catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n });\n\n // When IDFM failed to calculate an itinerary (ie. start or end\n // point is far from network), it respond a 404 with an error message\n // or a 200 with an error message\n if (jsonResponse && jsonResponse.error) {\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n routerResponse.from = waypoints[0];\n routerResponse.to = waypoints[1];\n routerResponse.error = jsonResponse.error.message || 'no details.';\n return routerResponse;\n }\n\n return this.createRouterResponseFromJson(jsonResponse);\n }\n\n /**\n * @throws {IdfmRemoteRouterTokenError}\n */\n async _connect() {\n\n const details = {\n 'grant_type': 'client_credentials',\n 'scope': 'read-data',\n 'client_id': clientId,\n 'client_secret': clientSecret\n };\n\n const data = new URLSearchParams();\n for (const property in details) {\n if (details.hasOwnProperty(property)) {\n const encodedKey = encodeURIComponent(property);\n const encodedValue = encodeURIComponent(details[property]);\n data.append(encodedKey, encodedValue);\n }\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'\n });\n\n const res = await fetch('https://idfm.getwemap.com/api/oauth/token', {\n method: 'POST',\n body: data,\n headers\n });\n if (res.status !== 200) {\n throw new IdfmRemoteRouterTokenError();\n }\n const response = await res.json();\n\n if (response.access_token) {\n this.token = response.access_token;\n this.isLogged = true;\n this.expiresAt = new Date(new Date().getTime() + response.expires_in * 1000);\n }\n }\n\n canRequestService() {\n return this.token && this.expiresAt && this.expiresAt - new Date() > 0;\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n */\n getURL(endpointUrl, mode, waypoints) {\n\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n\n const fromPlace = `from=${waypoints[0].longitude};${waypoints[0].latitude}`;\n const toPlace = `to=${waypoints[1].longitude};${waypoints[1].latitude}`;\n\n let url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}`;\n\n let query = '';\n switch (mode) {\n case Constants.ROUTING_MODE.WALK:\n query = this.getWalkingQuery();\n break;\n case Constants.ROUTING_MODE.BIKE:\n query = this.getBikeQuery();\n break;\n case Constants.ROUTING_MODE.CAR:\n query = this.getCarQuery();\n break;\n default:\n break;\n }\n\n url = `${url.origin}${url.pathname}${search}${query}`;\n\n return url;\n }\n\n getCarQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowCar = 'first_section_mode[]=walking&first_section_mode[]=car&last_section_mode[]=walking&last_section_mode[]=car';\n\n return `&${forbiddenTransport}&${allowCar}`;\n }\n\n getWalkingQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowWalking = 'first_section_mode[]=walking&last_section_mode[]=walking';\n\n return `&${forbiddenTransport}&${allowWalking}`;\n }\n\n getBikeQuery() {\n const forbiddenTransport = TRANSPORT_IDS.map((id) => `forbidden_uris[]=${id}`).join('&');\n const allowBike = 'first_section_mode[]=bike&last_section_mode[]=bike';\n\n return `&${forbiddenTransport}&${allowBike}`;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(Number(json.lat), Number(json.lon));\n }\n\n getSectionCoords(section) {\n const from = section.from.stop_point ? this.jsonToCoordinates(section.from.stop_point.coord) : this.jsonToCoordinates(section.from.address.coord);\n const to = section.to.stop_point ? this.jsonToCoordinates(section.to.stop_point.coord) : this.jsonToCoordinates(section.to.address.coord);\n\n return {\n from,\n to\n };\n }\n\n /**\n * Since the IDFM API does not provide coords for each step, we need to compute them\n * We trim the coordinates of the leg with the distance of each step and keep the last result as the coords of the step\n * @param {Leg} leg\n */\n findStepsCoord(leg) {\n const { steps, coords } = leg;\n\n const duplicatedCoords = [...coords];\n let previousStep = steps[0];\n let accumulatedIndex = 0;\n\n for (const [idx, step] of steps.entries()) {\n let newCoords;\n\n if (idx === 0) {\n step._idCoordsInLeg = 0;\n newCoords = coords[0];\n } else if (idx === steps.length - 1) {\n step._idCoordsInLeg = coords.length - 1;\n newCoords = last(coords);\n } else if (duplicatedCoords.length === 1) {\n accumulatedIndex++;\n\n step._idCoordsInLeg = accumulatedIndex;\n\n newCoords = duplicatedCoords[0];\n\n coords[step._idCoordsInLeg] = newCoords;\n } else {\n const result = GeoUtils.trimRoute(duplicatedCoords, duplicatedCoords[0], previousStep.distance);\n accumulatedIndex += result.length - 1;\n\n duplicatedCoords.splice(0, result.length - 1);\n\n step._idCoordsInLeg = accumulatedIndex;\n\n newCoords = last(result);\n\n coords[step._idCoordsInLeg] = newCoords;\n }\n\n step.coords = newCoords;\n\n previousStep = step;\n }\n }\n\n /**\n * @param {string} stringDate (e.g. 20211117T104516)\n * @returns {number}\n */\n dateStringToTimestamp(stringDate, timeZone) {\n const yearStr = stringDate.substr(0, 4);\n const monthStr = stringDate.substr(4, 2);\n const dayStr = stringDate.substr(6, 2);\n const hoursStr = stringDate.substr(9, 2);\n const minutesStr = stringDate.substr(11, 2);\n const secondsStr = stringDate.substr(13, 2);\n\n return dateWithTimeZone(\n Number(yearStr),\n Number(monthStr) - 1,\n Number(dayStr),\n Number(hoursStr),\n Number(minutesStr),\n Number(secondsStr),\n timeZone\n ).getTime();\n }\n\n /**\n * Generate multi itineraries from OTP JSON\n * @param {object} json JSON file provided by OTP.\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json) {\n\n if (!json || !json.journeys) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = this.getSectionCoords(json.journeys[0].sections[0]).from;\n routerResponse.to = this.getSectionCoords(last(json.journeys[0].sections)).to;\n\n const timeZone = json.context.timezone;\n\n for (const jsonItinerary of json.journeys) {\n\n const itinerary = new Itinerary();\n\n itinerary.duration = jsonItinerary.duration;\n itinerary.startTime = this.dateStringToTimestamp(jsonItinerary.departure_date_time, timeZone);\n itinerary.endTime = this.dateStringToTimestamp(jsonItinerary.arrival_date_time, timeZone);\n itinerary.from = routerResponse.from;\n itinerary.to = routerResponse.to;\n itinerary.distance = 0;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonSection of jsonItinerary.sections) {\n\n if (jsonSection.type === 'waiting' || jsonSection.type === 'transfer') {\n continue;\n }\n\n const leg = new Leg();\n let existingCoords = [];\n const { from, to } = this.getSectionCoords(jsonSection);\n\n leg.distance = 0;\n leg.mode = routingModeCorrespondance.get(jsonSection.mode);\n leg.duration = jsonSection.duration;\n leg.startTime = this.dateStringToTimestamp(jsonSection.departure_date_time, timeZone);\n leg.endTime = this.dateStringToTimestamp(jsonSection.arrival_date_time, timeZone);\n\n leg.from = {\n name: jsonSection.from.name,\n coords: from\n };\n\n leg.to = {\n name: jsonSection.to.name,\n coords: to\n };\n\n // A section can have multiple same coordinates, we need to remove them\n leg.coords = jsonSection.geojson.coordinates.reduce((acc, [lon, lat]) => {\n if (!existingCoords.includes(`${lon}-${lat}`)) {\n existingCoords = existingCoords.concat(`${lon}-${lat}`);\n acc.push(new Coordinates(lat, lon));\n }\n\n return acc;\n }, []);\n\n leg.steps = [];\n\n if (jsonSection.path) {\n for (const jsonPathLink of jsonSection.path) {\n const step = new Step();\n\n step.levelChange = null;\n\n step.name = jsonPathLink.name;\n step.distance = jsonPathLink.length;\n\n leg.distance += step.distance;\n leg.steps.push(step);\n }\n\n this.findStepsCoord(leg);\n }\n\n if (jsonSection.type === 'public_transport') {\n leg.transportInfo = {\n name: jsonSection.display_informations.code,\n routeColor: jsonSection.display_informations.color,\n routeTextColor: jsonSection.display_informations.text_color,\n directionName: jsonSection.display_informations.direction\n };\n\n leg.mode = routingModeCorrespondance.get(jsonSection.display_informations.physical_mode);\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = leg.transportInfo.directionName;\n legStep.levelChange = null;\n legStep.distance = jsonSection.geojson.properties[0].length;\n\n leg.steps = [legStep];\n }\n\n itinerary.distance += leg.distance;\n\n itinerary.legs.push(leg);\n\n }\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n return routerResponse;\n }\n}\n\nexport default new IdfmRemoteRouter();\n","/* eslint-disable max-statements */\n\nimport { Level, Coordinates } from '@wemap/geo';\nimport { rad2deg, positiveMod } from '@wemap/maths';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport { generateStepsMetadata } from '../RemoteRouterUtils.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Leg from '../../model/Leg.js';\nimport Step from '../../model/Step.js';\nimport LevelChange from '../../model/LevelChange.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport Constants from '../../Constants.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'driving');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'walking');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'bike');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'bus');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'walking');\n\n\n/**\n * Singleton.\n */\nclass OsrmRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'osrm';\n }\n\n /**\n * @override\n * @throws {RemoteRouterServerUnreachable}\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n\n const res = await (fetch(url).catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }));\n\n const jsonResponse = await res.json().catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n });\n\n return this.createRouterResponseFromJson(jsonResponse, waypoints[0], waypoints[1]);\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n\n const osrmMode = inputModeCorrespondance.get(mode);\n if (!osrmMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n\n let url = endpointUrl + '/route/v1/' + osrmMode + '/';\n url += waypoints.map(waypoint => [waypoint.longitude + ',' + waypoint.latitude]).join(';');\n url += '?geometries=geojson&overview=full&steps=true';\n\n return url;\n }\n\n /**\n * @param {Coordinates} coordinates\n * @returns {object}\n */\n coordinatesToJson(coordinates) {\n const output = [coordinates.lng, coordinates.lat];\n if (coordinates.level) {\n output.push(coordinates.level.toString());\n }\n return output;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n const output = new Coordinates(json[1], json[0]);\n if (json.length > 2) {\n output.level = Level.fromString(json[2]);\n }\n return output;\n }\n\n nodesToJsonCoords(nodes) {\n return nodes.map(node => this.coordinatesToJson(node.coords));\n }\n\n\n getModifierFromAngle(_angle) {\n\n const angle = positiveMod(rad2deg(_angle), 360);\n\n if (angle > 0 && angle < 60) {\n return 'sharp right';\n }\n if (angle >= 60 && angle < 140) {\n return 'right';\n }\n if (angle >= 140 && angle < 160) {\n return 'slight right';\n }\n if (angle >= 160 && angle <= 200) {\n return 'straight';\n }\n if (angle > 200 && angle <= 220) {\n return 'slight left';\n }\n if (angle > 220 && angle <= 300) {\n return 'left';\n }\n if (angle > 300 && angle < 360) {\n return 'sharp left';\n }\n return 'u turn';\n }\n\n\n noRouteFoundJson(message) {\n return {\n 'code': 'NoRoute',\n message\n };\n }\n\n /**\n * @param {Itinerary} itinerary\n * @returns {object}\n */\n itineraryToOsrmJson(itinerary) {\n\n const lastLegId = itinerary.legs.length - 1;\n\n const jsonLegs = itinerary.legs.map(({ distance, duration, coords, steps }, idLeg) => {\n\n const lastStepId = steps.length - 1;\n\n return {\n distance,\n duration,\n steps: steps.map((step, idStep, arr) => {\n\n let type = idStep === 0 && idLeg === 0 ? 'depart' : 'turn';\n type = idStep === lastStepId && idLeg === lastLegId ? 'arrive' : type;\n\n const stepCoordsIdx = coords.findIndex(p => p.equalsTo(step.coords));\n const nextStepCoordsIdx = idStep === lastStepId\n ? stepCoordsIdx\n : coords.findIndex(p => p.equalsTo(arr[idStep + 1].coords));\n\n const jsonStep = {\n geometry: {\n type: 'LineString',\n coordinates: coords.slice(stepCoordsIdx, nextStepCoordsIdx + 1).map(this.coordinatesToJson)\n },\n distance: step.distance,\n duration: step.duration,\n name: step.name,\n maneuver: {\n bearing_before: rad2deg(step.previousBearing),\n bearing_after: rad2deg(step.nextBearing),\n location: this.coordinatesToJson(step.coords),\n modifier: this.getModifierFromAngle(step.angle),\n type\n }\n };\n if (step.levelChange !== null) {\n jsonStep.levelChange = step.levelChange.toJson();\n }\n if (typeof step.extras === 'object' && Object.keys(step.extras).length !== 0) {\n jsonStep.extras = step.extras;\n }\n\n return jsonStep;\n })\n };\n });\n\n return {\n 'code': 'Ok',\n 'routes': [\n {\n 'geometry': {\n 'type': 'LineString',\n 'coordinates': itinerary.coords.map(this.coordinatesToJson)\n },\n 'legs': jsonLegs,\n 'distance': itinerary.distance,\n 'duration': itinerary.duration,\n 'weight_name': 'routability',\n 'weight': 0\n }\n ],\n 'waypoints': []\n };\n }\n\n /**\n * @param {object} jsonSteps\n * @param {Coordinates[]} legCoords\n * @returns {Step[]}\n */\n parseJsonSteps(jsonSteps, legCoords) {\n\n if (!jsonSteps) {\n return [];\n }\n\n return jsonSteps.map(jsonStep => {\n\n const step = new Step();\n step.coords = this.jsonToCoordinates(jsonStep.maneuver.location);\n\n // Sometimes, OSRM step does not have the same coordinates than a point in legCoords.\n // ex: first step of https://routing.getwemap.com/route/v1/walking/2.33222164147,48.87084765712;2.3320734,48.8730212?geometries=geojson&overview=full&steps=true\n // That is why we look for the closest point.\n const distances = legCoords.map(coords => coords.distanceTo(step.coords));\n const idStepCoordsInLeg = distances.indexOf(Math.min(...distances));\n if (idStepCoordsInLeg < 0) {\n throw new Error('Osrm Parser: Cannot find step coords in leg coordinates');\n }\n step._idCoordsInLeg = idStepCoordsInLeg;\n\n step.name = jsonStep.name;\n step.levelChange = jsonStep.levelChange ? LevelChange.fromJson(jsonStep.levelChange) : null;\n\n step.distance = jsonStep.distance;\n step.duration = jsonStep.duration;\n\n if (jsonStep.extras && jsonStep.extras.subwayEntrance) {\n step.extras.subwayEntrance = true;\n if (jsonStep.extras.subwayEntranceRef) {\n step.extras.subwayEntranceRef = jsonStep.extras.subwayEntranceRef;\n }\n }\n\n return step;\n });\n }\n\n /**\n * Generate multi itineraries from OSRM JSON\n * @param {object} json JSON file provided by OSRM.\n * @param {Coordinates} from itinerary start\n * @param {Coordinates} to itinerary end\n * @param {?string} routingMode [walking|driving|bicycle]\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json, from, to, routingMode = 'walking') {\n const { routes: jsonRoutes } = json;\n\n if (!jsonRoutes) {\n return null;\n }\n\n const routingModeCorrespondance = new Map();\n routingModeCorrespondance.set('walking', 'WALK');\n routingModeCorrespondance.set('driving', 'CAR');\n routingModeCorrespondance.set('bicycle', 'BIKE');\n const mode = routingModeCorrespondance.get(routingMode) || null;\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = from;\n routerResponse.to = to;\n\n for (const jsonItinerary of jsonRoutes) {\n\n const itinerary = new Itinerary();\n\n // itinerary.coords = jsonItinerary.geometry.coordinates.map(jsonToCoordinates);\n itinerary.distance = jsonItinerary.distance;\n itinerary.duration = jsonItinerary.duration;\n itinerary.from = from;\n itinerary.to = to;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonLeg of jsonItinerary.legs) {\n\n const leg = new Leg();\n\n leg.mode = mode;\n leg.distance = jsonLeg.distance;\n leg.duration = jsonLeg.duration;\n\n leg.coords = jsonLeg.steps\n .map(step => step.geometry.coordinates.map(this.jsonToCoordinates))\n .flat()\n // Remove duplicates\n .filter((coords, idx, arr) => idx === 0 || !arr[idx - 1].equalsTo(coords));\n\n leg.from = {\n name: null,\n coords: leg.coords[0]\n };\n leg.to = {\n name: null,\n coords: leg.coords[leg.coords.length - 1]\n };\n\n leg.steps = this.parseJsonSteps(jsonLeg.steps, leg.coords);\n\n itinerary.legs.push(leg);\n }\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n\n }\n\n return routerResponse;\n }\n}\n\nexport default new OsrmRemoteRouter();\n","'use strict';\n\n/**\n * Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm)\n *\n * Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js)\n * by [Mark McClure](http://facstaff.unca.edu/mcmcclur/)\n *\n * @module polyline\n */\n\nvar polyline = {};\n\nfunction py2_round(value) {\n // Google's polyline algorithm uses the same rounding strategy as Python 2, which is different from JS for negative values\n return Math.floor(Math.abs(value) + 0.5) * (value >= 0 ? 1 : -1);\n}\n\nfunction encode(current, previous, factor) {\n current = py2_round(current * factor);\n previous = py2_round(previous * factor);\n var coordinate = current - previous;\n coordinate <<= 1;\n if (current - previous < 0) {\n coordinate = ~coordinate;\n }\n var output = '';\n while (coordinate >= 0x20) {\n output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63);\n coordinate >>= 5;\n }\n output += String.fromCharCode(coordinate + 63);\n return output;\n}\n\n/**\n * Decodes to a [latitude, longitude] coordinates array.\n *\n * This is adapted from the implementation in Project-OSRM.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Array}\n *\n * @see https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js\n */\npolyline.decode = function(str, precision) {\n var index = 0,\n lat = 0,\n lng = 0,\n coordinates = [],\n shift = 0,\n result = 0,\n byte = null,\n latitude_change,\n longitude_change,\n factor = Math.pow(10, Number.isInteger(precision) ? precision : 5);\n\n // Coordinates have variable length when encoded, so just keep\n // track of whether we've hit the end of the string. In each\n // loop iteration, a single coordinate is decoded.\n while (index < str.length) {\n\n // Reset shift, result, and byte\n byte = null;\n shift = 0;\n result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result |= (byte & 0x1f) << shift;\n shift += 5;\n } while (byte >= 0x20);\n\n latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n shift = result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result |= (byte & 0x1f) << shift;\n shift += 5;\n } while (byte >= 0x20);\n\n longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n lat += latitude_change;\n lng += longitude_change;\n\n coordinates.push([lat / factor, lng / factor]);\n }\n\n return coordinates;\n};\n\n/**\n * Encodes the given [latitude, longitude] coordinates array.\n *\n * @param {Array.<Array.<Number>>} coordinates\n * @param {Number} precision\n * @returns {String}\n */\npolyline.encode = function(coordinates, precision) {\n if (!coordinates.length) { return ''; }\n\n var factor = Math.pow(10, Number.isInteger(precision) ? precision : 5),\n output = encode(coordinates[0][0], 0, factor) + encode(coordinates[0][1], 0, factor);\n\n for (var i = 1; i < coordinates.length; i++) {\n var a = coordinates[i], b = coordinates[i - 1];\n output += encode(a[0], b[0], factor);\n output += encode(a[1], b[1], factor);\n }\n\n return output;\n};\n\nfunction flipped(coords) {\n var flipped = [];\n for (var i = 0; i < coords.length; i++) {\n var coord = coords[i].slice();\n flipped.push([coord[1], coord[0]]);\n }\n return flipped;\n}\n\n/**\n * Encodes a GeoJSON LineString feature/geometry.\n *\n * @param {Object} geojson\n * @param {Number} precision\n * @returns {String}\n */\npolyline.fromGeoJSON = function(geojson, precision) {\n if (geojson && geojson.type === 'Feature') {\n geojson = geojson.geometry;\n }\n if (!geojson || geojson.type !== 'LineString') {\n throw new Error('Input must be a GeoJSON LineString');\n }\n return polyline.encode(flipped(geojson.coordinates), precision);\n};\n\n/**\n * Decodes to a GeoJSON LineString geometry.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Object}\n */\npolyline.toGeoJSON = function(str, precision) {\n var coords = polyline.decode(str, precision);\n return {\n type: 'LineString',\n coordinates: flipped(coords)\n };\n};\n\nif (typeof module === 'object' && module.exports) {\n module.exports = polyline;\n}\n","/* eslint-disable max-statements */\nimport Polyline from '@mapbox/polyline';\n\nimport { Coordinates } from '@wemap/geo';\nimport Logger from '@wemap/logger';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport RouterResponse from '../../model/RouterResponse.js';\nimport Step from '../../model/Step.js';\nimport { generateStepsMetadata } from '../RemoteRouterUtils.js';\nimport Constants from '../../Constants.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport RoutingModeCorrespondanceNotFound from '../RoutingModeCorrespondanceNotFound.js';\nimport RemoteRouterServerUnreachable from '../RemoteRouterServerUnreachable.js';\n\n/**\n * Input mode correspondance\n */\nconst inputModeCorrespondance = new Map();\ninputModeCorrespondance.set(Constants.ROUTING_MODE.CAR, 'CAR');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.WALK, 'WALK');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BIKE, 'BICYCLE');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.BUS, 'WALK,TRANSIT');\ninputModeCorrespondance.set(Constants.ROUTING_MODE.MULTI, 'WALK,TRANSIT');\n\n/**\n * Singleton.\n */\nclass OtpRemoteRouter extends RemoteRouter {\n\n /**\n * @override\n */\n get rname() {\n return 'otp';\n }\n\n /**\n * @override\n * @throws {RemoteRouterServerUnreachable}\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n async getItineraries(endpointUrl, mode, waypoints) {\n const url = this.getURL(endpointUrl, mode, waypoints);\n const res = await (fetch(url).catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n }));\n\n const jsonResponse = await res.json().catch(() => {\n throw new RemoteRouterServerUnreachable(this.rname, url);\n });\n return this.createRouterResponseFromJson(jsonResponse);\n }\n\n /**\n * @param {string} endpointUrl\n * @param {string} mode\n * @param {Array<Coordinates>} waypoints\n * @throws {RoutingModeCorrespondanceNotFound}\n */\n getURL(endpointUrl, mode, waypoints) {\n\n const otpMode = inputModeCorrespondance.get(mode);\n if (!otpMode) {\n throw new RoutingModeCorrespondanceNotFound(this.rname, mode);\n }\n\n if (waypoints.length > 2) {\n Logger.warn(`${this.rname} router uses only the first 2 waypoints (asked ${waypoints.length})`);\n }\n\n const fromPlace = `fromPlace=${waypoints[0].latitude},${waypoints[0].longitude}`;\n const toPlace = `toPlace=${waypoints[1].latitude},${waypoints[1].longitude}`;\n const queryMode = `mode=${otpMode}`;\n\n const url = new URL(endpointUrl);\n let { search } = url;\n search = (search ? `${search}&` : '?') + `${fromPlace}&${toPlace}&${queryMode}`;\n\n return `${url.origin}${url.pathname}${search}`;\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json) {\n return new Coordinates(json.lat, json.lon);\n }\n\n /**\n * @param {object} jsonSteps\n * @param {Coordinates[]} legCoords\n * @returns {Step[]}\n */\n parseJsonSteps(jsonSteps, legCoords) {\n\n if (!jsonSteps) {\n return [];\n }\n\n return jsonSteps.map(jsonStep => {\n\n const step = new Step();\n const stepCoords = this.jsonToCoordinates(jsonStep);\n\n // OTP step does not have the same coordinates than a point in legCoords.\n // That is why we look for the closest point.\n const distances = legCoords.map(coords => coords.distanceTo(stepCoords));\n const idStepCoordsInLeg = distances.indexOf(Math.min(...distances));\n if (idStepCoordsInLeg < 0) {\n throw new Error('OTP Parser: Cannot find closest step');\n }\n step.coords = legCoords[idStepCoordsInLeg];\n step._idCoordsInLeg = idStepCoordsInLeg;\n\n step.name = jsonStep.streetName;\n step.levelChange = null;\n\n step.distance = jsonStep.distance;\n\n return step;\n });\n }\n\n /**\n * Generate multi itineraries from OTP JSON\n * @param {object} json JSON file provided by OTP.\n * @returns {?RouterResponse}\n */\n createRouterResponseFromJson(json) {\n\n const { plan: jsonPlan } = json;\n\n if (!jsonPlan) {\n return null;\n }\n\n const routerResponse = new RouterResponse();\n routerResponse.routerName = this.rname;\n\n routerResponse.from = this.jsonToCoordinates(jsonPlan.from);\n routerResponse.to = this.jsonToCoordinates(jsonPlan.to);\n\n for (const jsonItinerary of jsonPlan.itineraries) {\n\n const itinerary = new Itinerary();\n\n itinerary.duration = jsonItinerary.duration;\n itinerary.startTime = jsonItinerary.startTime;\n itinerary.endTime = jsonItinerary.endTime;\n itinerary.from = routerResponse.from;\n itinerary.to = routerResponse.to;\n\n routerResponse.itineraries.push(itinerary);\n\n for (const jsonLeg of jsonItinerary.legs) {\n\n const leg = new Leg();\n\n leg.mode = jsonLeg.mode;\n leg.duration = jsonLeg.duration;\n leg.startTime = jsonLeg.startTime;\n leg.endTime = jsonLeg.endTime;\n leg.from = {\n name: jsonLeg.from.name,\n coords: this.jsonToCoordinates(jsonLeg.from)\n };\n leg.to = {\n name: jsonLeg.to.name,\n coords: this.jsonToCoordinates(jsonLeg.to)\n };\n leg.coords = Polyline.decode(jsonLeg.legGeometry.points).map(([lat, lon]) => new Coordinates(lat, lon));\n\n leg.steps = this.parseJsonSteps(jsonLeg.steps, leg.coords);\n\n if (leg.mode === 'BUS' || leg.mode === 'TRAM') {\n leg.transportInfo = {\n name: jsonLeg.route,\n routeColor: jsonLeg.routeColor,\n routeTextColor: jsonLeg.routeTextColor,\n directionName: jsonLeg.headsign\n };\n\n const legStep = new Step();\n legStep.coords = leg.coords[0];\n legStep._idCoordsInLeg = 0;\n legStep.name = jsonLeg.headsign;\n legStep.levelChange = null;\n legStep.distance = jsonLeg.distance;\n leg.steps = [legStep];\n }\n\n // jsonLeg.distance is not reliable when compared to the array of leg coords.\n // leg.distance = jsonLeg.distance;\n leg.distance = leg.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n itinerary.legs.push(leg);\n\n }\n\n itinerary.distance = itinerary.coords.reduce((acc, coords, idx, arr) => {\n if (idx === 0) {\n return acc;\n }\n return acc + arr[idx - 1].distanceTo(coords);\n }, 0);\n\n // All legs have to be parsed before computing steps metadata\n generateStepsMetadata(itinerary);\n }\n\n return routerResponse;\n }\n}\n\nexport default new OtpRemoteRouter();\n\n","import {\n Matrix, Matrix3, Matrix4, Quaternion, Vector, Vector3\n} from '@wemap/maths';\n\n\nconst DEFAULT_RELATIVE_NOISES = {\n acc: 0.5,\n gyr: 0.3\n};\n\nconst DEFAULT_ABSOLUTE_NOISES = {\n acc: 0.5,\n gyr: 0.3,\n yc: 2\n};\n\nclass EkfAttitude {\n\n constructor(accRef = [0, 0, 1], ycRef = [-1, 0, 0]) {\n\n this.accRef = accRef;\n this.cRef = ycRef;\n\n this.P = Matrix.diag(Array(4).fill(0.1 ** 2));\n\n this.quaternion = null;\n\n\n this.noises = {\n relative: null,\n absolute: null\n };\n this.setRelativeNoises(DEFAULT_RELATIVE_NOISES);\n this.setAbsoluteNoises(DEFAULT_ABSOLUTE_NOISES);\n }\n\n setRelativeNoises(relativeNoises) {\n this.noises.relative = {\n accelerometer: Matrix.diag(Array(3).fill(relativeNoises.acc ** 2)),\n gyroscope: Matrix.diag(Array(3).fill(relativeNoises.gyr ** 2))\n };\n }\n\n\n setAbsoluteNoises(absoluteNoises) {\n this.noises.absolute = {\n accelerometer: Matrix.diag(Array(3).fill(absoluteNoises.acc ** 2)),\n gyroscope: Matrix.diag(Array(3).fill(absoluteNoises.gyr ** 2)),\n yc: Matrix.diag(Array(3).fill(absoluteNoises.yc ** 2))\n };\n }\n\n /**\n * Try to initialize filter.\n * To initialize, we need at least current acceleration (acc)\n */\n tryInitialize(acc, mag) {\n\n const accNormalized = Vector3.normalize(acc);\n\n if (mag) {\n const magNormalized = Vector3.normalize(mag);\n\n const H = Vector3.normalize(Vector3.cross(magNormalized, accNormalized));\n const M = Vector3.cross(accNormalized, H);\n\n const R = [\n [H[0], M[0], accNormalized[0]],\n [H[1], M[1], accNormalized[1]],\n [H[2], M[2], accNormalized[2]]\n ];\n\n this.quaternion = Quaternion.fromMatrix3(R);\n\n } else {\n\n const r = Vector3.dot(accNormalized, this.accRef) + 1;\n const v = Vector3.cross(accNormalized, this.accRef);\n\n let quaternion = [r, v[0], v[1], v[2]];\n quaternion = Quaternion.normalize(quaternion);\n\n this.quaternion = quaternion;\n }\n\n return this.quaternion;\n }\n\n update(diffTime, acc, gyr, mag) {\n\n if (!this.quaternion) {\n return this.tryInitialize(acc, mag);\n }\n\n let q = this.quaternion;\n\n /* ------------\n * ESTIMATION\n * ------------*/\n\n const qArray = q;\n const gyrInt = Vector3.multiplyScalar(gyr, 0.5 * diffTime);\n const F = this.computeC([1, gyrInt[0], gyrInt[1], gyrInt[2]]);\n const qAPriori = Matrix.multiplyVector(F, q);\n const E1 = Matrix.diag([qArray[0], qArray[0], qArray[0]]);\n const eSkew = Matrix3.skew([qArray[1], qArray[2], qArray[3]]);\n\n const qPart = [-1 * qArray[1], -1 * qArray[2], -1 * qArray[3]];\n const E = Matrix.concatRow([qPart], Matrix3.add(eSkew, E1));\n\n const Qk = Matrix.multiplyScalar(\n Matrix.multiply(\n Matrix.multiply(E, this.noises[mag ? 'absolute' : 'relative'].gyroscope),\n Matrix.transpose(E)\n ),\n (diffTime / 2) ** 2\n );\n\n const pAPriori = Matrix4.add(\n Matrix.multiply(\n Matrix.multiply(F, this.P),\n Matrix.transpose(F)\n ),\n Qk\n );\n\n /* ------------\n * CORRECTION\n * ------------*/\n\n const accNormalized = Vector3.normalize(acc);\n let dz, K, H;\n\n if (mag) {\n\n const magNormalized = Vector3.normalize(mag);\n const yc = Vector3.cross(accNormalized, magNormalized);\n const ycNormalized = Vector3.normalize(yc);\n\n const dzYc = Vector3.subtract(ycNormalized, Quaternion.rotate(qAPriori, this.cRef));\n const dzAcc = Vector3.subtract(accNormalized, Quaternion.rotate(qAPriori, this.accRef));\n dz = Vector.concat(dzYc, dzAcc);\n\n const HYc = this.jacobianES(qAPriori, this.cRef);\n const HAcc = this.jacobianES(qAPriori, this.accRef);\n H = Matrix.concatRow(HYc, HAcc);\n\n const RYc = Matrix.concatLine(this.noises.absolute.yc, Matrix3.zeros);\n const RAcc = Matrix.concatLine(Matrix3.zeros, this.noises.absolute.accelerometer);\n const R = Matrix.concatRow(RYc, RAcc);\n\n K = Matrix.multiply(\n Matrix.multiply(pAPriori, Matrix.transpose(H)),\n Matrix.inverse(\n Matrix.add(\n Matrix.multiply(\n Matrix.multiply(H, pAPriori),\n Matrix.transpose(H)\n ),\n R\n )\n )\n );\n } else {\n dz = Vector3.subtract(accNormalized, Quaternion.rotate(qAPriori, this.accRef));\n H = this.jacobianES(qAPriori, this.accRef);\n const R = this.noises.relative.accelerometer;\n\n K = Matrix.multiply(\n Matrix.multiply(pAPriori, Matrix.transpose(H)),\n Matrix3.inverse(\n Matrix3.add(\n Matrix.multiply(\n Matrix.multiply(H, pAPriori),\n Matrix.transpose(H)\n ),\n R\n )\n )\n );\n }\n\n q = Quaternion.add(\n qAPriori,\n Matrix.multiplyVector(K, dz)\n );\n const P = Matrix.multiply(\n Matrix4.subtract(\n Matrix4.identity,\n Matrix.multiply(K, H)\n ),\n pAPriori\n );\n\n q = Quaternion.normalize(q);\n this.quaternion = q;\n this.P = P;\n\n return q;\n }\n\n computeC(b) {\n return [\n [b[0], -b[1], -b[2], -b[3]],\n [b[1], b[0], b[3], -b[2]],\n [b[2], -b[3], b[0], b[1]],\n [b[3], b[2], -b[1], b[0]]\n ];\n }\n\n jacobianES(q, v) {\n\n const [qw, qx, qy, qz] = q;\n const [vx, vy, vz] = v;\n\n return [\n [2 * qz * vy - 2 * qy * vz, 2 * qy * vy + 2 * qz * vz, 2 * qx * vy - 2 * qw * vz - 4 * qy * vx, 2 * qw * vy + 2 * qx * vz - 4 * qz * vx],\n [2 * qx * vz - 2 * qz * vx, 2 * qw * vz - 4 * qx * vy + 2 * qy * vx, 2 * qx * vx + 2 * qz * vz, 2 * qy * vz - 2 * qw * vx - 4 * qz * vy],\n [2 * qy * vx - 2 * qx * vy, 2 * qz * vx - 4 * qx * vz - 2 * qw * vy, 2 * qw * vx - 4 * qy * vz + 2 * qz * vy, 2 * qx * vx + 2 * qy * vy]\n ];\n }\n}\n\nexport default EkfAttitude;\n","import { Attitude } from '@wemap/geo';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport EkfAttitude from '../EkfAttitude.js';\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\n\nimport Accelerometer from '../../imu/Accelerometer.js';\nimport Gyroscope from '../../imu/Gyroscope.js';\n\n\n/**\n * Relative attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation\n * The provider does not work until an offset is given.\n */\nclass RelativeAttitudeFromEkf extends Provider {\n\n lastTimestamp = 0;\n\n /**\n * @override\n */\n constructor(context) {\n super(context);\n this.ekfAttitude = new EkfAttitude();\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromEkf';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n Accelerometer.availability,\n Gyroscope.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n this.accelerometerProviderId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.gyroscopeProviderId = Gyroscope.addEventListener(\n events => (this.gyroscopeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.accelerometerProviderId);\n Gyroscope.removeEventListener(this.gyroscopeProviderId);\n }\n\n /**\n * @private\n */\n onAccelerometerEvent = accelerationEvent => {\n\n if (!this.gyroscopeEvent) {\n return;\n }\n\n const {\n values: acceleration, timestamp\n } = accelerationEvent.data;\n\n // Handle timestamps and dt\n if (this.lastTimestamp === 0) {\n this.lastTimestamp = timestamp;\n return;\n }\n const diffTime = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n\n const quaternion = this.ekfAttitude.update(diffTime, acceleration, this.gyroscopeEvent.data.values);\n\n if (quaternion) {\n const attitude = new Attitude(quaternion,\n timestamp,\n RelativeAttitudeFromInertial.DEFAULT_DRIFT\n );\n this.notify(this.createEvent(\n EventType.RelativeAttitude,\n attitude,\n [accelerationEvent, this.gyroscopeEvent]));\n }\n };\n}\n\nexport default new RelativeAttitudeFromEkf();\n","import { Attitude } from '@wemap/geo';\nimport { Rotations } from '@wemap/maths';\nimport { BrowserUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AskImuOnDesktopError from '../../../errors/AskImuOnDesktopError.js';\nimport MissingSensorError from '../../../errors/MissingSensorError.js';\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\n\n\n/**\n * Relative attitude provider gives the device attitude in a custom frame (x-right, y-front, z-up) using\n * browser deviceorientation\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via deviceorientation but deviceorientation.alpha is unreliable! Sometimes it starts at 0°, sometimes at 270°)\n * Safari iOS (v12.0): YES (via deviceorientation)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/ondeviceorientation}\n * Firefox Android (v65.0.1): YES (via deviceorientation)\n *\n * -----------------------------------\n */\nclass RelativeAttitudeFromBrowser extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromBrowser';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n const subscribe = () => window.addEventListener('deviceorientation', this.onDeviceOrientationEvent, true);\n\n if (typeof (DeviceOrientationEvent) !== 'undefined' && typeof (DeviceOrientationEvent.requestPermission) === 'function') {\n DeviceOrientationEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n }\n\n /**\n * @override\n */\n stop() {\n window.removeEventListener('deviceorientation', this.onDeviceOrientationEvent, true);\n }\n\n\n onDeviceOrientationEvent = e => {\n\n if (typeof e.alpha !== 'number' || typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientation'));\n return;\n }\n\n const quaternion = Rotations.eulerToQuaternionZXYDegrees([e.alpha, e.beta, e.gamma]);\n const attitude = new Attitude(quaternion,\n e.timeStamp / 1e3,\n RelativeAttitudeFromInertial.DEFAULT_DRIFT\n );\n this.notify(this.createEvent(EventType.RelativeAttitude, attitude));\n };\n}\n\nexport default new RelativeAttitudeFromBrowser();\n","import { Attitude } from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport EventType from '../../../events/EventType.js';\nimport RelativeAttitudeFromEkf from './RelativeAttitudeFromEkf.js';\nimport RelativeAttitudeFromBrowser from './RelativeAttitudeFromBrowser.js';\nimport HighRotationsDetector from '../../imu/HighRotationsDetector.js';\n\n\nclass RelativeAttitudeFromInertial extends Provider {\n\n /**\n * default relative attitude drift in rad.second-1\n */\n DEFAULT_DRIFT = deg2rad(5) / 60;\n\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitudeFromInertial';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n RelativeAttitudeFromEkf.availability,\n RelativeAttitudeFromBrowser.availability,\n HighRotationsDetector.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n RelativeAttitudeFromEkf.availability\n .then(() => (this.provider = RelativeAttitudeFromEkf))\n .catch(() => (this.provider = RelativeAttitudeFromBrowser))\n .finally(() => {\n this.listenerId = this.provider.addEventListener(\n events => this._parseEvent(events[0]),\n error => this.notifyError(error)\n );\n this._highRotationsDetector = HighRotationsDetector.addEventListener(\n () => {},\n error => this.notifyError(error)\n );\n });\n }\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _parseEvent(event) {\n const relativeAttitudeEvent = event.clone();\n if (HighRotationsDetector.isInProgress()) {\n let accuracy = relativeAttitudeEvent.data.accuracy + (this.DEFAULT_DRIFT * 100);\n accuracy = Math.min(accuracy, Math.PI);\n relativeAttitudeEvent.data.accuracy = accuracy;\n }\n this.notify(relativeAttitudeEvent);\n }\n\n /**\n * @override\n */\n stop() {\n if (this.provider) {\n this.provider.removeEventListener(this.listenerId);\n this.provider = null;\n }\n HighRotationsDetector.removeEventListener(this._highRotationsDetector);\n }\n}\n\nexport default new RelativeAttitudeFromInertial();\n","class MissingArCoreError extends Error {\n\n static DEFAULT_MESSAGE = 'ARCore is missing';\n\n constructor(message) {\n super(message || MissingArCoreError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingArCoreError;\n","class MissingNativeInterfaceError extends Error {\n\n static DEFAULT_MESSAGE = 'Native interface is missing';\n\n constructor(message) {\n super(message || MissingNativeInterfaceError.DEFAULT_MESSAGE);\n }\n}\n\nexport default MissingNativeInterfaceError;\n","/* eslint-disable no-bitwise */\nimport {\n Attitude, RelativePosition\n} from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\nimport { TimeUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport MissingArCoreError from '../../../errors/MissingArCoreError.js';\nimport MissingNativeInterfaceError from '../../../errors/MissingNativeInterfaceError.js';\nimport ProviderState from '../../ProviderState.js';\nclass ArCore extends Provider {\n\n static Payload = {\n Pose: {\n ref: 2 ** 0,\n size: 7\n },\n Barcode: {\n ref: 2 ** 1,\n size: 1\n },\n ProjMat: {\n ref: 2 ** 2,\n size: 16\n },\n ImageRef: {\n ref: 2 ** 3,\n size: 1\n }\n };\n\n /**\n * default relative attitude drift in rad.second-1\n */\n static RELATIVE_ATTITUDE_DRIFT = deg2rad(3) / 60;\n\n previousPosition = [0, 0, 0];\n\n /**\n * @override\n */\n static get pname() {\n return 'ArCore';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude, EventType.RelativePosition, EventType.Barcode];\n }\n\n\n /**\n * @override\n */\n start() {\n if (this.nativeProvider) {\n this.nativeProvider.start();\n }\n\n this.pullDataLoop();\n }\n\n /**\n * @override\n */\n stop() {\n if (this.nativeProvider) {\n this.nativeProvider.stop();\n }\n }\n\n pullDataLoop = () => {\n\n if (this.state === ProviderState.STOPPPED) {\n return;\n }\n\n const payload = JSON.parse(this.nativeProvider.getInfo());\n if (payload.length > 1) {\n this.parsePayload(payload);\n }\n requestAnimationFrame(this.pullDataLoop);\n }\n\n parsePayload(payload) {\n\n const ref = payload[0];\n let bufferIndex = 1;\n\n const events = [];\n\n const time = TimeUtils.preciseTime() / 1e3;\n\n if (ref & ArCore.Payload.Pose.ref) {\n\n const attitude = new Attitude(\n payload.slice(bufferIndex, bufferIndex + 4),\n time,\n this.constructor.RELATIVE_ATTITUDE_DRIFT,\n );\n events.push(this.createEvent(EventType.RelativeAttitude, attitude));\n\n const newPosition = [payload[bufferIndex + 4], payload[bufferIndex + 5], payload[bufferIndex + 6]];\n const position = new RelativePosition(\n newPosition[0] - this.previousPosition[0],\n newPosition[1] - this.previousPosition[1],\n newPosition[2] - this.previousPosition[2],\n time,\n 1e-4\n );\n this.previousPosition = newPosition;\n events.push(this.createEvent(EventType.RelativePosition, position));\n\n bufferIndex += ArCore.Payload.Pose.size;\n }\n\n if (ref & ArCore.Payload.Barcode.ref) {\n events.push(this.createEvent(EventType.Barcode, payload[bufferIndex]));\n bufferIndex += ArCore.Payload.Barcode.size;\n }\n\n if (ref & ArCore.Payload.ProjMat.ref) {\n const projMatrix = payload.slice(bufferIndex, bufferIndex + ArCore.Payload.ProjMat.size);\n events.push(this.createEvent(EventType.CameraProjectionMatrix, projMatrix));\n bufferIndex += ArCore.Payload.ProjMat.size;\n }\n\n if (events.length !== 0) {\n this.notify(...events);\n }\n }\n\n\n get nativeProvider() {\n\n if (!this._nativeProvider) {\n\n if (!this.nativeInterface) {\n throw new MissingNativeInterfaceError();\n }\n\n this._nativeProvider = this.nativeInterface.getArCoreProvider();\n if (!this._nativeProvider) {\n throw new MissingArCoreError();\n }\n\n }\n\n return this._nativeProvider;\n }\n\n /**\n * @override\n */\n get _availability() {\n try {\n const nativeProvider = this.nativeProvider;\n\n if (!nativeProvider.checkAvailability()) {\n return Promise.reject(new MissingArCoreError());\n }\n\n } catch (e) {\n return Promise.reject(e);\n }\n\n return Promise.resolve();\n }\n\n enableBarcodeScanner() {\n try {\n this.nativeProvider.enableBarcodeScanner();\n } catch (e) {\n this.notifyError(e);\n }\n }\n\n disableBarcodeScanner() {\n try {\n this.nativeProvider.disableBarcodeScanner();\n } catch (e) {\n this.notifyError(e);\n }\n }\n\n /**\n * @override\n */\n static get useCameraNatively() {\n return true;\n }\n}\n\nexport default new ArCore();\n","import Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport ProviderState from '../../ProviderState.js';\n\nimport RelativeAttitudeFromInertial from './RelativeAttitudeFromInertial.js';\nimport ArCore from '../../position/relative/ArCore.js';\n\n/**\n * Relative attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation\n * The provider does not work until an offset is given.\n */\nclass RelativeAttitude extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'RelativeAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativeAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitudeFromInertial.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.arCoreMonitoringId = ArCore.addMonitoringListener(\n () => {\n this.listenArCore();\n this.unlistenInertial();\n }, () => {\n this.unlistenArCore();\n this.listenInertial();\n });\n\n if (ArCore.state === ProviderState.STARTED) {\n this.listenArCore();\n } else {\n this.listenInertial();\n }\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeMonitoringListener(this.arCoreMonitoringId);\n this.unlistenArCore();\n this.unlistenInertial();\n }\n\n\n listenInertial = () => {\n this.inertialProviderId = RelativeAttitudeFromInertial.addEventListener(\n events => this.notify(events[0].clone()),\n error => this.notifyError(error)\n );\n }\n\n unlistenInertial = () => {\n RelativeAttitudeFromInertial.removeEventListener(this.inertialProviderId);\n }\n\n listenArCore = () => {\n this.arCoreProviderId = ArCore.addEventListener(\n events => {\n const relativeAttitudeEvent = events.find(event => event.dataType === EventType.RelativeAttitude);\n if (relativeAttitudeEvent) {\n this.notify(relativeAttitudeEvent.clone());\n }\n },\n () => {},\n false\n );\n };\n\n unlistenArCore = () => {\n ArCore.removeEventListener(this.arCoreProviderId);\n }\n}\n\nexport default new RelativeAttitude();\n","import { std } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitude from './relative/RelativeAttitude.js';\nimport Provider from '../Provider.js';\n\nclass TurnDetector extends Provider {\n\n // in seconds\n static SLIDING_WINDOW_TIME = 0.3;\n\n static STD_THRESHOLD = 0.075;\n\n /** @type {number} in seconds */\n static CONSIDER_TURN_UNTIL = 1;\n\n /** @type {number[]} */\n slidingWindow = [];\n\n /**\n * @override\n */\n static get pname() {\n return 'TurnDetector';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Turn];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitude.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = RelativeAttitude.addEventListener(\n events => this._parseRelativeAttitude(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n RelativeAttitude.removeEventListener(this.providerId);\n }\n\n isTurning() {\n if (!this.lastEvent || !RelativeAttitude.lastEvent) {\n return false;\n }\n\n const diffTime = RelativeAttitude.lastEvent.data.time - this.lastEvent.data.timestamp;\n return diffTime < TurnDetector.CONSIDER_TURN_UNTIL;\n }\n\n /**\n * @private\n */\n _parseRelativeAttitude = relativeAttitudeEvent => {\n\n const { heading, time: timestamp } = relativeAttitudeEvent.data;\n\n this.slidingWindow = this.slidingWindow.filter(item => item[0] >= timestamp - TurnDetector.SLIDING_WINDOW_TIME);\n this.slidingWindow.push([timestamp, heading]);\n\n const stdVal = std(this.slidingWindow.map(item => item[1]));\n if (stdVal > TurnDetector.STD_THRESHOLD) {\n this.notify(this.createEvent(EventType.Turn, { timestamp }, [relativeAttitudeEvent]));\n }\n\n }\n}\n\nexport default new TurnDetector();\n","const Constants = {\n DEFAULT_ALTITUDE: 1.6\n};\n\nexport default Constants;\n","class StepDetectionMinMaxPeaks2 {\n\n // in seconds\n static WINDOW_TIME = 0.3;\n\n // in seconds\n static MIN_TIME_BETWEEN_STEPS = 0.4;\n\n // in Hz\n static MAX_FRENQUENCY = 4;\n static MIN_FRENQUENCY = 1;\n\n // in m.s-2\n static VERTICAL_ACC_POSITIVE_PEAK_THRESHOLD = 0.75;\n static VERTICAL_ACC_NEGATIVE_PEAK_THRESHOLD = -0.3;\n\n\n constructor() {\n this.slidingWindow = [];\n\n this.lastStepTimestamp = -StepDetectionMinMaxPeaks2.MIN_TIME_BETWEEN_STEPS;\n this.previousVerticalAcc = 0;\n this.influence = 0.2;\n }\n\n\n compute(timestamp, linearAcc, angularRate) {\n\n const verticalAcc = this.influence * (linearAcc[2] * 2) + (1 - this.influence) * this.previousVerticalAcc;\n this.previousVerticalAcc = verticalAcc;\n\n\n if (Math.sqrt(angularRate[0] ** 2 + angularRate[1] ** 2 + angularRate[2] ** 2) > 0.75) {\n return false;\n }\n\n if (this.lastStepTimestamp && this.lastStepTimestamp + StepDetectionMinMaxPeaks2.MIN_TIME_BETWEEN_STEPS > timestamp) {\n return false;\n }\n\n let maxValue = Number.MIN_SAFE_INTEGER;\n let minValue = Number.MAX_SAFE_INTEGER;\n\n this.slidingWindow.forEach(function(item, index, object) {\n if (item.timestamp < timestamp - StepDetectionMinMaxPeaks2.WINDOW_TIME) {\n object.splice(index, 1);\n } else {\n maxValue = Math.max(item.verticalAcc, maxValue);\n minValue = Math.min(item.verticalAcc, minValue);\n }\n });\n this.slidingWindow.push({\n timestamp: timestamp,\n verticalAcc: verticalAcc\n });\n\n\n if (maxValue > StepDetectionMinMaxPeaks2.VERTICAL_ACC_POSITIVE_PEAK_THRESHOLD\n && minValue < StepDetectionMinMaxPeaks2.VERTICAL_ACC_NEGATIVE_PEAK_THRESHOLD) {\n\n const timeInterval = this.lastStepTimestamp ? timestamp - this.lastStepTimestamp : 1;\n this.frequency = Math.min(Math.max((1 / timeInterval), StepDetectionMinMaxPeaks2.MIN_FRENQUENCY), StepDetectionMinMaxPeaks2.MAX_FRENQUENCY);\n\n this.lastStepTimestamp = timestamp;\n return true;\n }\n\n return false;\n }\n\n get lastStepSize() {\n\n if (!this.frequency) {\n return 0;\n }\n\n const kParamA = 0.45;\n const kParamB = 0.2;\n return kParamA + kParamB * this.frequency;\n }\n\n get speed() {\n return this.lastStepSize && this.frequency ? this.lastStepSize * this.frequency : 0;\n }\n\n mean(data) {\n let sum = 0.0, mean = 0.0;\n\n for (let i = 0; i < data.length; ++i) {\n sum += data[i].verticalAcc;\n }\n mean = sum / data.length;\n return mean;\n }\n\n stddev(data) {\n const theMean = this.mean(data);\n let standardDeviation = 0;\n for (let i = 0; i < data.length; ++i) {\n standardDeviation += (data[i].verticalAcc - theMean) ** 2;\n }\n\n return Math.sqrt(standardDeviation / data.length);\n }\n}\n\nexport default StepDetectionMinMaxPeaks2;\n","import { Constants as GeoConstants } from '@wemap/geo';\nimport { Quaternion } from '@wemap/maths';\n\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitudeFromInertial from '../attitude/relative/RelativeAttitudeFromInertial.js';\nimport Accelerometer from '../imu/Accelerometer.js';\nimport Gyroscope from '../imu/Gyroscope.js';\nimport Provider from '../Provider.js';\nimport StepDetectionMinMaxPeaks2 from './StepDetectionMinMaxPeaks2.js';\n\n\nclass StepDetector extends Provider {\n\n constructor() {\n super();\n this.stepDetector = new StepDetectionMinMaxPeaks2();\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'StepDetector';\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n Accelerometer.availability,\n Gyroscope.availability,\n RelativeAttitudeFromInertial.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n this.numOfSteps = 0;\n\n this.accelerometerProviderId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.gyroscopeProviderId = Gyroscope.addEventListener(\n events => (this.angularRateEvent = events[0]),\n error => this.notifyError(error)\n );\n\n this.attitudeProviderId = RelativeAttitudeFromInertial.addEventListener(\n events => (this.attitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.accelerometerProviderId);\n Gyroscope.removeEventListener(this.gyroscopeProviderId);\n RelativeAttitudeFromInertial.removeEventListener(this.attitudeProviderId);\n }\n\n onAccelerometerEvent(accelerationEvent) {\n\n if (!this.attitudeEvent || !this.angularRateEvent) {\n return;\n }\n\n const {\n values: acceleration, timestamp\n } = accelerationEvent.data;\n\n /**\n * Step Detection and Step Size Detection\n */\n const linearAcc = this.constructor.computeLinearAcceleration(\n this.attitudeEvent.data.quaternion, acceleration);\n const stepDetected = this.stepDetector.compute(timestamp, linearAcc, this.angularRateEvent.data.values);\n\n if (stepDetected) {\n const size = this.stepDetector.lastStepSize;\n this.numOfSteps++;\n this.notify(this.createEvent(\n EventType.Step, {\n size,\n number: this.numOfSteps\n },\n [accelerationEvent, this.angularRateEvent, this.attitudeEvent]\n ));\n }\n }\n\n // Linear acceleration in ENU\n static computeLinearAcceleration(quaternion, acc) {\n const linearAcc = Quaternion.rotate(Quaternion.inverse(quaternion), acc);\n linearAcc[2] -= GeoConstants.EARTH_GRAVITY;\n return linearAcc;\n }\n}\n\nexport default new StepDetector();\n","import Provider from '../Provider.js';\nimport StepDetector from './StepDetector.js';\nimport TurnDectector from '../attitude/TurnDectector.js';\nimport EventType from '../../events/EventType.js';\n\nclass StraightLineDetector extends Provider {\n\n /** @type {number} */\n static STEPS_CONSIDERED_FOR_STRAIGHT_LINE = 2;\n\n /** @type {number?} */\n _turnDetectorProviderId = null;\n\n /** @type {number?} */\n _stepDetectorProviderId = null;\n\n /** @type {number} */\n _countSteps = 0;\n\n /**\n * @override\n */\n static get pname() {\n return 'StraightLineDetector';\n }\n\n /**\n * @override\n */\n start() {\n this._turnDetectorProviderId = TurnDectector.addEventListener(this._onTurn);\n this._stepDetectorProviderId = StepDetector.addEventListener(this._onStep);\n }\n\n /**\n * @override\n */\n stop() {\n TurnDectector.removeEventListener(this._turnDetectorProviderId);\n StepDetector.removeEventListener(this._stepDetectorProviderId);\n }\n\n _onTurn = (event) => {\n if (this._countSteps >= StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE) {\n\n const fromEvents = [event];\n if (StepDetector.lastEvent !== null) {\n fromEvents.push(StepDetector.lastEvent);\n }\n\n this.notify(this.createEvent(EventType.StraightLine, false, fromEvents));\n\n }\n this._countSteps = 0;\n }\n\n _onStep = (event) => {\n this._countSteps++;\n\n if (this._countSteps === StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE) {\n\n const fromEvents = [event];\n if (TurnDectector.lastEvent !== null) {\n fromEvents.push(TurnDectector.lastEvent);\n }\n this.notify(this.createEvent(EventType.StraightLine, true, fromEvents));\n\n }\n\n }\n\n /**\n * @returns {boolean}\n */\n isStraight() {\n return this._countSteps >= StraightLineDetector.STEPS_CONSIDERED_FOR_STRAIGHT_LINE;\n }\n\n get numStepsDetectedFromLastTurn() {\n return this._countSteps;\n }\n}\n\nexport default new StraightLineDetector();\n","/* eslint-disable max-statements */\nimport {\n AbsoluteHeading, GraphEdge, MapMatching, Network, GraphProjection, UserPosition\n} from '@wemap/geo';\nimport { deg2rad, diffAngle, diffAngleLines } from '@wemap/maths';\nimport { Itinerary } from '@wemap/routers';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../events/EventType.js';\nimport ProviderEvent from '../events/ProviderEvent.js';\n\nimport AbsoluteAttitude from '../providers/attitude/absolute/AbsoluteAttitude.js';\nimport AbsoluteAttitudeFromBrowser from '../providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js';\nimport TurnDectector from '../providers/attitude/TurnDectector.js';\nimport Constants from '../providers/Constants.js';\nimport AbsolutePosition from '../providers/position/absolute/AbsolutePosition.js';\nimport Provider from '../providers/Provider.js';\nimport ProviderState from '../providers/ProviderState.js';\nimport StepDetector from '../providers/steps/StepDetector.js';\nimport StraightLineDetector from '../providers/steps/StraightLineDetector.js';\nimport ProvidersOptions from '../ProvidersOptions.js';\n\nclass MapMatchingHandler extends Provider {\n\n /** @type {number} in radians */\n static MM_MAX_ANGLE = deg2rad(30);\n\n /** @type {number} in meters */\n static MM_MAX_DIST = 30;\n\n /** @type {number} in meters */\n static MM_MIN_DIST = 0;\n\n /** @type {boolean} */\n static ORIENTATION_MATCHING = true;\n\n /** @type {boolean} */\n static USE_ITINERARY_START_AS_POSITION = true;\n\n /** @type {number} in meters */\n static MM_HUGE_JUMP_DISTANCE = 3;\n\n /** @type {number} */\n static MIN_STEPS_BETWEEN_ORIENTATION_MATCHING = 3;\n\n /** @type {number} */\n static MIN_STEPS_FOR_ORIENTATION_MATCHING = 5;\n\n /** @type {number} */\n static LAST_PROJECTIONS_WINDOW_SIZE = 3;\n\n /** @type {number} */\n static LAST_PROJECTIONS_EDGE_ANGLE_THRESHOLD = deg2rad(3);\n\n /** @type {MapMatching} */\n _mapMatching;\n\n /** @type {number} */\n _mapMatchingMinDistance;\n\n /** @type {boolean} */\n _internalProvidersStarted = false;\n\n /** @type {number?} */\n _straightLineDetectorProviderId;\n\n /** @type {number?} */\n _turnDetectorProviderId;\n\n /** @type {number?} */\n _stepDetectorProviderId;\n\n /** @type {GraphProjection[]} */\n _projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n\n /** @type {number} */\n _countStepsFromLastMatching = 0;\n\n /** @type {GraphProjection[]} */\n _lastProjections = [];\n\n\n constructor() {\n super();\n\n this._mapMatching = new MapMatching();\n this._mapMatching.maxDistance = MapMatchingHandler.MM_MAX_DIST;\n this._mapMatching.maxAngleBearing = MapMatchingHandler.MM_MAX_ANGLE;\n this._mapMatchingMinDistance = MapMatchingHandler.MM_MIN_DIST;\n }\n\n /**\n * @override\n */\n start() {\n if (this.network) {\n this._startInternalProviders();\n }\n }\n\n /**\n * @override\n */\n stop() {\n this._stopInternalProviders();\n }\n\n _manageStartStop = () => {\n if (this.network && !this._internalProvidersStarted) {\n this._startInternalProviders();\n } else if (!this.network && this._internalProvidersStarted) {\n this._stopInternalProviders();\n }\n }\n\n _startInternalProviders() {\n\n if (this.enabled && this._internalProvidersStarted) {\n return;\n }\n\n this._straightLineDetectorProviderId = StraightLineDetector.addEventListener();\n this._turnDetectorProviderId = TurnDectector.addEventListener();\n this._stepDetectorProviderId = StepDetector.addEventListener(() => (this._countStepsFromLastMatching++));\n\n this._internalProvidersStarted = true;\n }\n\n _stopInternalProviders() {\n\n if (this.enabled && !this._internalProvidersStarted) {\n return;\n }\n\n StraightLineDetector.removeEventListener(this._straightLineDetectorProviderId);\n TurnDectector.removeEventListener(this._turnDetectorProviderId);\n StepDetector.removeEventListener(this._stepDetectorProviderId);\n\n this._internalProvidersStarted = false;\n }\n\n get enabled() {\n return ProvidersOptions.useMapMatching;\n }\n\n /** @type {?Network} */\n get network() {\n return this._mapMatching.network;\n }\n\n /** @type {?Network} */\n set network(network) {\n\n this._mapMatching.network = network;\n this.notify(this.createEvent(EventType.Network, network));\n\n this._manageStartStop();\n\n if (this.canUseMapMatching()) {\n // TODO if necessary\n // this._notifyPositionFromNetworkInput(network);\n }\n }\n\n /** @type {?Itinerary} */\n set itinerary(itinerary) {\n\n this._mapMatching.network = itinerary ? itinerary.toNetwork() : null;\n this.notify(this.createEvent(EventType.Itinerary, itinerary));\n\n this._manageStartStop();\n\n if (this.canUseMapMatching()) {\n this._notifyPositionFromItineraryInput(itinerary);\n }\n }\n\n /**\n * @returns {boolean}\n */\n canUseMapMatching() {\n return this.enabled && this.network;\n }\n\n /**\n * @param {Itinerary} itinerary\n */\n _notifyPositionFromItineraryInput(itinerary) {\n\n if (!MapMatchingHandler.USE_ITINERARY_START_AS_POSITION || itinerary.start) {\n return;\n }\n\n const lastEvent = AbsolutePosition.lastEvent;\n const lastPosition = lastEvent ? lastEvent.data : null;\n\n const notify = (pos) => {\n const newEvent = lastEvent\n ? lastEvent.clone()\n : new ProviderEvent(EventType.AbsolutePosition);\n newEvent.data = pos;\n AbsolutePosition.notify(newEvent);\n };\n\n // In case of an itinerary, use itinerary start as new position,\n // but add the distance between lastPosition and itinerary start for the accuracy\n const newPosition = UserPosition.fromCoordinates(itinerary.from);\n\n if (lastPosition) {\n newPosition.alt = lastPosition.alt;\n newPosition.time = lastPosition.time;\n newPosition.accuracy = lastPosition.accuracy + newPosition.distanceTo(lastPosition);\n newPosition.bearing = lastPosition.bearing;\n } else if (itinerary.coords >= 2) {\n newPosition.alt = Constants.DEFAULT_ALTITUDE;\n newPosition.time = TimeUtils.preciseTime();\n newPosition.accuracy = 0;\n newPosition.bearing = itinerary.coords[0].bearingTo(itinerary.coords[1]);\n } else {\n return;\n }\n\n // if the distance between itinerary.start and itinerary.nodes[0] is less than MM_MAX_DIST,\n // projection.projection is itinerary.nodes[0]\n const projection = this.getProjection(newPosition, true);\n if (projection) {\n notify(projection.projection);\n // Do not notify for attitude projection because bearing has not been used.\n } else {\n // This means the first position is far from the network and the user has\n // to reach itinerary.nodes[0] before to continue\n notify(newPosition);\n }\n return;\n }\n\n /**\n * @param {ProviderEvent<UserPosition>} newPositionEvent\n */\n notifyPositionFromFeed(newPositionEvent) {\n\n const projection = this.getProjection(newPositionEvent.data, true, false);\n if (!projection) {\n AbsolutePosition.notify(newPositionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projection.projection,\n [newPositionEvent]\n ));\n }\n\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n */\n notifyPositionFromAbsolute(positionEvent) {\n\n const newPosition = positionEvent.data;\n\n let projectionWithBearing = null;\n if (newPosition.bearing !== null) {\n projectionWithBearing = this.getProjection(newPosition, true, true);\n }\n\n if (!projectionWithBearing) {\n // Verify if the newPosition is far enough from the network to be used by the system.\n const projectionWithoutBearing = this.getProjection(newPosition, true, false);\n if (!projectionWithoutBearing) {\n // In this case, the newPosition is far enough and can be used safely.\n AbsolutePosition.notify(positionEvent);\n }\n return;\n }\n\n // newPosition must not be used after this line\n\n const thisWillBeAHugeJump = projectionWithBearing.distanceFromNearestElement > MapMatchingHandler.MM_HUGE_JUMP_DISTANCE;\n\n // In case of a huge jump, be sure the user is in a straight line\n if (thisWillBeAHugeJump && !StraightLineDetector.isStraight()) {\n return;\n }\n\n // Detector to avoid big jumps in the wrong direction\n if (thisWillBeAHugeJump && this._detectWrongBigJump(projectionWithBearing)) {\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projectionWithBearing.projection,\n [positionEvent]\n ));\n\n this.tryOrientationMatching(projectionWithBearing);\n\n }\n\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n */\n notifyPositionFromRelative(positionEvent) {\n\n if (TurnDectector.isTurning()) {\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections = [];\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n const newPosition = positionEvent.data;\n const projection = this.getProjection(newPosition, true, true);\n\n if (projection) {\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections.push(projection);\n if (this._lastProjections.length > MapMatchingHandler.LAST_PROJECTIONS_WINDOW_SIZE) {\n this._lastProjections.shift();\n }\n\n const thisWillBeAHugeJump = projection.distanceFromNearestElement > MapMatchingHandler.MM_HUGE_JUMP_DISTANCE;\n\n // In case of a huge jump, be sure the user is in a straight line\n if (thisWillBeAHugeJump && !StraightLineDetector.isStraight()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n // Detector to avoid big jumps in the wrong direction\n if (thisWillBeAHugeJump && this._detectWrongBigJump(projection)) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n // Do not use projection if the neareast element is not the same direction than previous\n if (!this._areLastProjectionsInTheSameDirection()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projection.projection,\n [positionEvent]\n ));\n this.tryOrientationMatching(projection);\n\n } else {\n\n // Sometimes, the newPosition.bearing diverges due to the Absolute Attitude offset\n // and the Orientation Matching. So, we created this detector to check if projection\n // with bearing from \"AbsoluteAttitudeFromBrowser\" is better than the current bearing.\n // /!\\ This works only if the user is waking in the same direction than the smartphone orientation /!\\\n if (StraightLineDetector.isStraight()) {\n\n const testedPosition = newPosition.clone();\n testedPosition.bearing = AbsoluteAttitudeFromBrowser.lastEvent.data.heading;\n const projectionWithAbs = this.getProjection(testedPosition, true, true);\n\n if (projectionWithAbs) {\n\n this._projectionsWithAbsAndWithoutRelAttitudeInARow.push(projectionWithAbs);\n if (this._projectionsWithAbsAndWithoutRelAttitudeInARow.length < 3) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n this._lastProjections.push(projectionWithAbs);\n if (this._lastProjections.length > MapMatchingHandler.LAST_PROJECTIONS_WINDOW_SIZE) {\n this._lastProjections.shift();\n }\n\n\n if (!this._areLastProjectionsInTheSameDirection()) {\n AbsolutePosition.notify(positionEvent);\n return;\n }\n\n AbsolutePosition.notify(this.createEvent(\n EventType.AbsolutePosition,\n projectionWithAbs.projection,\n [positionEvent]\n ));\n\n this.tryOrientationMatching(projectionWithAbs);\n return;\n }\n }\n\n this._projectionsWithAbsAndWithoutRelAttitudeInARow = [];\n this._lastProjections = [];\n\n // If no projection found with both projection methods, simply use the newPosition.\n AbsolutePosition.notify(positionEvent);\n }\n\n }\n\n /**\n * @param {Projection} projection\n */\n _detectWrongBigJump(projection) {\n\n if (this.network instanceof Itinerary && AbsolutePosition.lastEvent) {\n const itinerary = this.network;\n const infoPrevious = itinerary.getInfo(AbsolutePosition.lastEvent.data);\n const infoProjection = itinerary.getInfo(projection.projection);\n if (infoPrevious\n && infoProjection\n && infoPrevious.traveledDistance > infoProjection.traveledDistance\n && (infoPrevious.traveledDistance - infoProjection.traveledDistance) > projection.origin.accuracy\n && projection.distanceFromNearestElement > projection.origin.accuracy\n && projection.origin.distanceTo(AbsolutePosition.lastEvent.data) < projection.origin.accuracy + AbsolutePosition.lastEvent.data.accuracy) {\n\n return true;\n }\n }\n\n return false;\n }\n\n _areLastProjectionsInTheSameDirection() {\n\n if (this._lastProjections.length === 0) {\n return false;\n }\n\n const firstProjection = this._lastProjections[0];\n return !this._lastProjections.some(projection =>\n !(projection.nearestElement instanceof GraphEdge)\n || (diffAngleLines(projection.nearestElement.bearing, firstProjection.nearestElement.bearing)\n > MapMatchingHandler.LAST_PROJECTIONS_EDGE_ANGLE_THRESHOLD)\n );\n }\n\n /**\n * @param {Projection} projection\n */\n tryOrientationMatching(projection) {\n\n if (!MapMatchingHandler.ORIENTATION_MATCHING) {\n return;\n }\n\n if (this.state !== ProviderState.STARTED\n || this._countStepsFromLastMatching < MapMatchingHandler.MIN_STEPS_BETWEEN_ORIENTATION_MATCHING\n || StraightLineDetector.numStepsDetectedFromLastTurn < MapMatchingHandler.MIN_STEPS_FOR_ORIENTATION_MATCHING) {\n return;\n }\n\n const { nearestElement, origin } = projection;\n if (!(nearestElement instanceof GraphEdge)) {\n return;\n }\n\n let matchingDirection;\n const matchingDirectionAngle1 = diffAngle(nearestElement.bearing, origin.bearing);\n const matchingDirectionAngle2 = diffAngle(nearestElement.bearing + Math.PI, origin.bearing);\n\n if (Math.abs(matchingDirectionAngle1) < Math.abs(matchingDirectionAngle2)) {\n matchingDirection = nearestElement.bearing;\n } else {\n matchingDirection = (nearestElement.bearing + Math.PI) % (2 * Math.PI);\n }\n\n const matchedHeading = new AbsoluteHeading(\n matchingDirection,\n origin.time,\n 0\n // Math.min(Math.abs(matchingDirectionAngle1), Math.abs(matchingDirectionAngle2))\n );\n\n AbsoluteAttitude._forceHeadingForRelative(\n new ProviderEvent(EventType.AbsoluteHeading, matchedHeading)\n );\n\n this._countStepsFromLastMatching = 0;\n }\n\n getProjection(position, useDistance, useBearing) {\n return this._mapMatching.getProjection(position, useDistance, useBearing);\n }\n\n get maxDistance() {\n return this._mapMatching.maxDistance;\n }\n\n set maxDistance(maxDistance) {\n this._mapMatching.maxDistance = maxDistance;\n }\n\n get minDistance() {\n return this._mapMatchingMinDistance;\n }\n\n set minDistance(minDistance) {\n this._mapMatchingMinDistance = minDistance;\n }\n\n get maxAngleBearing() {\n return this._mapMatching.maxAngleBearing;\n }\n\n set maxAngleBearing(maxAngleBearing) {\n this._mapMatching.maxAngleBearing = maxAngleBearing;\n }\n}\n\nexport default new MapMatchingHandler();\n","class GeolocationApiMissingError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation api is missing';\n\n constructor(message) {\n super(message || GeolocationApiMissingError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationApiMissingError;\n","class GeolocationPermissionDeniedError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation permission denied';\n\n constructor(message) {\n super(message || GeolocationPermissionDeniedError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationPermissionDeniedError;\n","class GeolocationPositionUnavailableError extends Error {\n\n static DEFAULT_MESSAGE = 'Geolocation position unavailable';\n\n constructor(message) {\n super(message || GeolocationPositionUnavailableError.DEFAULT_MESSAGE);\n }\n}\n\nexport default GeolocationPositionUnavailableError;\n","import { UserPosition } from '@wemap/geo';\nimport Logger from '@wemap/logger';\nimport { deg2rad } from '@wemap/maths';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../../../events/EventType.js';\nimport GeolocationApiMissingError from '../../../errors/GeolocationApiMissingError.js';\nimport Provider from '../../Provider.js';\nimport GeolocationPermissionDeniedError from '../../../errors/GeolocationPermissionDeniedError.js';\nimport GeolocationPositionUnavailableError from '../../../errors/GeolocationPositionUnavailableError.js';\nimport Constants from '../../Constants.js';\n\n\n/**\n * GnssWifiProvider is a provider based on navigator.geolocation.\n * This API does not allow us to know if the position returned is provided\n * by Wifi Fingerprinting algorithms or by GNSS. That is why the name is\n * \"GnssWifi\".\n */\nclass GnssWifi extends Provider {\n\n static POSITION_OPTIONS = {\n enableHighAccuracy: true,\n timeout: Infinity,\n maximumAge: 0\n };\n\n /**\n * @override\n */\n static get pname() {\n return 'GnssWifi';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return typeof (navigator) === 'object' && navigator.geolocation\n ? Promise.resolve()\n : Promise.reject(new GeolocationApiMissingError());\n }\n\n /**\n * @override\n */\n start() {\n\n this.geoLocationId = navigator.geolocation.watchPosition(\n this.onNewPosition,\n this.onPositionError,\n GnssWifi.POSITION_OPTIONS\n );\n\n }\n\n /**\n * @override\n */\n stop() {\n\n navigator.geolocation.clearWatch(this.geoLocationId);\n\n }\n\n /**\n * @private\n */\n onNewPosition = geolocation => {\n\n const { coords } = geolocation;\n if (!coords) {\n return;\n }\n\n let bearing;\n if (coords.heading) {\n bearing = deg2rad(coords.heading);\n }\n\n const timestamp = TimeUtils.unixTimestampToPreciseTime(geolocation.timestamp) / 1e3;\n\n const position = new UserPosition(\n coords.latitude,\n coords.longitude,\n Constants.DEFAULT_ALTITUDE,\n null,\n timestamp,\n coords.accuracy,\n bearing,\n this.pname);\n\n this.notify(this.createEvent(\n EventType.AbsolutePosition, position\n ));\n\n };\n\n onPositionError = error => {\n\n Logger.warn(`[Providers] watchPosition error: [${error.code}] ${error.message}`);\n\n let customError;\n switch (error.code) {\n case 1:\n customError = new GeolocationPermissionDeniedError(error.message);\n break;\n case 2:\n customError = new GeolocationPositionUnavailableError(error.message);\n break;\n default:\n customError = new Error(error.message);\n }\n\n this.notifyError(customError);\n };\n}\n\nexport default new GnssWifi();\n","import { GeoRelativePosition } from '@wemap/geo';\n\nimport EventType from '../../../events/EventType.js';\nimport AbsoluteAttitude from '../../attitude/absolute/AbsoluteAttitude.js';\nimport Provider from '../../Provider.js';\nimport ArCore from './ArCore.js';\n\nclass GeoRelativePositionFromArCore extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'GeoRelativePositionFromArCore';\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n\n this.arCoreProviderId = ArCore.addEventListener(\n this.onArCoreEvents,\n error => this.notifyError(error)\n );\n\n this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(\n events => (this.absoluteAttitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeEventListener(this.arCoreProviderId);\n AbsoluteAttitude.removeEventListener(this.absoluteAttitudeProviderId);\n }\n\n onArCoreEvents = events => {\n const relativeAttitudeEvent = events.find(event => event.dataType === EventType.RelativeAttitude);\n const relativePositionEvent = events.find(event => event.dataType === EventType.RelativePosition);\n\n if (relativeAttitudeEvent && relativePositionEvent && this.absoluteAttitudeEvent) {\n this.compute(relativePositionEvent, relativeAttitudeEvent, this.absoluteAttitudeEvent);\n }\n }\n\n compute(relativePositionEvent, relativeAttitudeEvent, absoluteAttitudeEvent) {\n const relativePosition = relativePositionEvent.data;\n const relativeAttitude = relativeAttitudeEvent.data;\n const absoluteAttitude = absoluteAttitudeEvent.data;\n\n const rotation = absoluteAttitude.heading - relativeAttitude.heading;\n\n /**\n * Here, we transform \"relativePosition\" which is defined in ArCore frame to a relative \"position\" defined in ENU frame\n */\n const east = Math.cos(rotation) * relativePosition.x - Math.sin(rotation) * relativePosition.z;\n const north = -Math.sin(rotation) * relativePosition.x - Math.cos(rotation) * relativePosition.z;\n const up = relativePosition.y;\n\n /**\n * Relative position is defined in ENU frame\n */\n const position = new GeoRelativePosition(\n east,\n north,\n up,\n relativePosition.time,\n 0,\n absoluteAttitude.heading\n );\n\n this.notify(this.createEvent(\n EventType.GeoRelativePosition,\n position,\n [relativePositionEvent, relativeAttitudeEvent, absoluteAttitudeEvent]\n ));\n }\n}\n\nexport default new GeoRelativePositionFromArCore();\n","import { GeoRelativePosition } from '@wemap/geo';\nimport { deg2rad } from '@wemap/maths';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport StepDetector from '../../steps/StepDetector.js';\nimport AbsoluteAttitude from '../../attitude/absolute/AbsoluteAttitude.js';\n\n\nclass Pdr extends Provider {\n\n // https://ieeexplore.ieee.org/document/7346766\n misalignment = [1, 0, 0, 0];\n misalignmentError = deg2rad(3);\n\n /**\n * @override\n */\n static get pname() {\n return 'PDR';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.RelativePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.all([\n StepDetector.availability,\n AbsoluteAttitude.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n\n this.stepDetectionProviderId = StepDetector.addEventListener(\n events => this.onStepEvent(events[0]),\n error => this.notifyError(error)\n );\n\n this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(\n events => (this.attitudeEvent = events[0]),\n error => this.notifyError(error)\n );\n\n }\n\n /**\n * @override\n */\n stop() {\n StepDetector.removeEventListener(this.stepDetectionProviderId);\n AbsoluteAttitude.removeEventListener(this.absoluteAttitudeProviderId);\n }\n\n /**\n * @private\n */\n onStepEvent = stepEvent => {\n\n if (!this.attitudeEvent) {\n return;\n }\n\n const stepSize = stepEvent.data.size;\n\n /**\n * There is three frames because (device heading != walking direction):\n *\n * Device frame (x-Device Right, y-Device Top, z-Device Front)\n * Navigation frame (x-Nav East, y-Nav North, z-Nav Up)\n * Earth local frame (x-East y-North z-Up)\n *\n *\n * For the PDR, in order to find the step direction,\n * we are looking for the rotation between the device frame and the navigation frame.\n * Attitude is the rotation from the device frame to the earth local frame.\n * Misalignment is the rotation from the navigation frame to the earth local frame\n */\n const deviceAttitude = this.attitudeEvent.data;\n\n /**\n * For optimisation, as we define misalignment to identity, we do not process the quat mulitply formula.\n */\n // const deviceInNavFrame = Quaternion.multiply(deviceAttitude.quaternion, this.misalignment);\n // const deviceDirection = new Attitude(deviceInNavFrame).heading;\n const deviceDirection = deviceAttitude.heading;\n\n /**\n * A bad accuracy from PDR is due to three things:\n * - Attitude accuracy\n * - Misalignement (device heading != walking direction)\n * - Step detection false positives / false negatives\n * Following formula only use attitude accuracy with cone formula\n */\n const deviceDirectionAccuracy = deviceAttitude.accuracy + this.misalignmentError;\n const accuracy = (stepSize / 2) * Math.sin(deviceDirectionAccuracy / 2);\n const timestamp = deviceAttitude.time;\n\n /**\n * Relative position is defined in ENU frame\n */\n const position = new GeoRelativePosition(\n stepSize * Math.sin(deviceDirection),\n stepSize * Math.cos(deviceDirection),\n 0,\n timestamp,\n accuracy,\n deviceDirection\n );\n\n this.notify(this.createEvent(\n EventType.GeoRelativePosition,\n position,\n [stepEvent, this.attitudeEvent]\n ));\n }\n\n}\n\nexport default new Pdr();\n","import { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport GeoRelativePositionFromArCore from './GeoRelativePositionFromArCore.js';\nimport Pdr from './Pdr.js';\n\n\nclass GeoRelativePosition extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'GeoRelativePosition';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.GeoRelativePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n Pdr.availability,\n GeoRelativePositionFromArCore.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n\n GeoRelativePositionFromArCore.availability\n .then(() => (this.geoRelativeProvider = GeoRelativePositionFromArCore))\n .catch(() => (this.geoRelativeProvider = Pdr))\n .finally(() => {\n this.providerId = this.geoRelativeProvider.addEventListener(\n events => {\n const event = events.find(_event => _event.dataType === EventType.GeoRelativePosition);\n if (event) {\n this.notify(event.clone());\n }\n },\n error => this.notifyError(error)\n );\n });\n }\n\n /**\n * @override\n */\n stop() {\n if (this.geoRelativeProvider) {\n this.geoRelativeProvider.removeEventListener(this.providerId);\n this.geoRelativeProvider = null;\n }\n }\n}\n\nexport default new GeoRelativePosition();\n","export function preciseTime() {\n if (typeof window !== 'undefined' && window.performance) {\n return window.performance.now();\n }\n const hrtime = process.hrtime();\n return Math.round((hrtime[0] * 1e3) + (hrtime[1] / 1e6));\n}\n\n/**\n * Return a value equivalent to performance now from a given unix timestamp\n * @param {Number} timestamp a unix timestamp\n * @returns timestamp relative to performance.now()\n */\nexport function unixTimestampToPreciseTime(timestamp) {\n return preciseTime() + timestamp - new Date().getTime();\n}\n\n/**\n * Return a value equivalent to a unix timestamp from a given performance now value\n * @param {Number} _preciseTime timestamp relative to performance.now()\n * @returns a unix timestamp\n */\nexport function preciseTimeToUnixTimestamp(_preciseTime) {\n return new Date().getTime() + _preciseTime - preciseTime();\n}\n","/* eslint-disable max-statements */\nimport { SharedCameras, CameraUtils, Camera } from '@wemap/camera';\nimport { Attitude, Level, UserPosition } from '@wemap/geo';\nimport Logger from '@wemap/logger';\nimport { deg2rad, Quaternion } from '@wemap/maths';\nimport { TimeUtils } from '../../../../utils/index.js';\n\nimport EventType from '../../events/EventType.js';\nimport ProviderEvent from '../../events/ProviderEvent.js';\nimport Provider from '../Provider.js';\nimport ProviderState from '../ProviderState.js';\n\nclass Vps extends Provider {\n\n // static SERVICE_URL = 'http://localhost:45678/';\n static SERVICE_URL = 'https://vps.maaap.it/';\n static MAP_ID = 'wemap';\n static MIN_TIME_BETWEEN_TWO_REQUESTS = 1000;\n\n /** @type {boolean} */\n _serverError = false;\n\n /** @type {boolean} */\n _cameraError = false;\n\n /** @type {Camera} */\n _camera = null;\n\n /**\n * @override\n */\n static get pname() {\n return 'Vps';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude, EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Promise.resolve();\n }\n\n /**\n * @override\n */\n start() {\n\n // 1. Add listeners on shared cameras to detect new cameras\n SharedCameras.on('added', this._onCameraDetected);\n SharedCameras.on('removed', this._onCameraRemoved);\n\n // 2. If a camera already exists, use it\n if (SharedCameras.list.length) {\n if (SharedCameras.list.length > 1) {\n Logger.warn('It seems that more than 1 camera has been detected'\n + ' for VPS. Taking the first...');\n }\n this._useCamera(SharedCameras.list[0].camera);\n }\n }\n\n /**\n * @override\n */\n stop() {\n SharedCameras.off('added', this._onCameraDetected);\n SharedCameras.off('removed', this._onCameraRemoved);\n\n this._camera = null;\n }\n\n\n _onCameraDetected = ({ camera }) => {\n if (this._camera) {\n Logger.warn('It seems that more than 1 camera has been detected'\n + ' for VPS. Taking the first...');\n }\n this._useCamera(camera);\n }\n\n _onCameraRemoved = () => {\n if (this._camera) {\n this._camera.off('started', this._internalStart);\n this._camera.off('stopped', this._internalStop);\n } else {\n Logger.warn('There is no previously detected camera but once has stopped');\n }\n this._camera = null;\n }\n\n /**\n * @param {Camera} camera\n */\n _useCamera(camera) {\n this._camera = camera;\n\n camera.on('started', this._internalStart);\n camera.on('stopped', this._internalStop);\n\n if (camera.state === Camera.State.STARTED) {\n this._internalStart();\n }\n }\n\n\n _internalStart = async () => {\n\n this._serverError = false;\n\n while (this.state !== ProviderState.STOPPPED) {\n\n if (this.lastEvent) {\n const diffTime = TimeUtils.preciseTime() - this.lastEvent.data.time * 1e3;\n const timeToWait = Math.max(0, Vps.MIN_TIME_BETWEEN_TWO_REQUESTS - diffTime);\n await new Promise(resolve => setTimeout(resolve, timeToWait));\n }\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n const url = Vps.SERVICE_URL + Vps.MAP_ID;\n\n // 1. Prepare the request\n if (!this._camera || this._camera.state !== Camera.State.STARTED) {\n break;\n }\n const payload = await this._prepareRequest();\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 2. Send the request\n const serverResponse = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }\n });\n\n if (this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 3. Parse the response\n const events = await this._parseResponse(serverResponse, url, payload.time);\n if (this._serverError || this.state === ProviderState.STOPPPED) {\n break;\n }\n\n // 4. Notify events\n if (events.length) {\n this.notify(...events);\n }\n }\n\n if (this.state !== ProviderState.STOPPPED) {\n this.stop();\n }\n }\n\n _internalStop = () => {\n // do nothing\n }\n\n\n /**\n * @returns {Object}\n */\n async _prepareRequest() {\n\n const camera = this._camera;\n\n // Retrieve the image\n const image = await camera.currentImage;\n const time = TimeUtils.preciseTime() / 1e3;\n // TODO: move the grayscale conversion in the currentImage getter\n CameraUtils.convertToGrayscale(image);\n const reducedImage = CameraUtils.reduceImageSize(image, 1280);\n // const reducedImage = CameraUtils.reduceImageSize(image, 720, 720);\n const { height, width } = reducedImage;\n const base64Image = CameraUtils.canvasToBase64(reducedImage);\n\n // Retrieve the calibration matrix\n const calibration = CameraUtils.createCameraCalibrationFromWidthHeightFov(\n width, height, deg2rad(camera.hardwareVerticalFov)\n );\n\n // Build the payload\n return {\n calibration,\n size: [width, height],\n image: base64Image,\n time\n };\n }\n\n /**\n * @param {Response} res\n * @param {String} url\n * @param {Number} requestTime\n * @returns {ProviderEvent[]}\n */\n async _parseResponse(res, url, requestTime) {\n if (res.status !== 200) {\n Logger.warn(`The VPS server (${url}) has encountered a problem`);\n this._serverError = true;\n return [];\n }\n\n const json = await res.json();\n if (json.error) {\n return [];\n }\n\n const { attitude, userPosition } = Vps._parseJsonResponse(json, requestTime);\n\n const events = [\n this.createEvent(EventType.AbsoluteAttitude, attitude),\n this.createEvent(EventType.AbsolutePosition, userPosition)\n ];\n\n return events;\n }\n\n\n static _parseJsonResponse(json, requestTime) {\n\n const quaternion = [\n json.attitude.w,\n json.attitude.x,\n json.attitude.y,\n json.attitude.z\n ];\n const quaternionNorm = Quaternion.norm(quaternion);\n quaternion[0] /= quaternionNorm;\n quaternion[1] /= quaternionNorm;\n quaternion[2] /= quaternionNorm;\n quaternion[3] /= quaternionNorm;\n\n const quaternionWithScreenRotation = Quaternion.multiply(\n Quaternion.fromAxisAngle([0, 0, 1], deg2rad(window.orientation || 0)), quaternion\n );\n\n const attitude = new Attitude(quaternionWithScreenRotation, requestTime, 0);\n\n\n const userPosition = new UserPosition(\n json.coordinates.lat,\n json.coordinates.lng,\n json.coordinates.alt,\n json.coordinates.level ? new Level(json.coordinates.level) : null,\n requestTime,\n 0,\n attitude.heading\n );\n\n\n return { userPosition, attitude };\n }\n}\n\nexport default new Vps();\n","import { UserPosition, GeoRelativePosition } from '@wemap/geo';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport MapMatchingHandler from '../../../mapmatching/MapMatchingHandler.js';\nimport GnssWifi from './GnssWifi.js';\nimport { default as GeoRelativePositionProvider } from '../relative/GeoRelativePosition.js';\nimport ProvidersOptions from '../../../ProvidersOptions.js';\nimport ProviderState from '../../ProviderState.js';\nimport Vps from '../../vision/Vps.js';\n\nclass AbsolutePosition extends Provider {\n\n // Use the new absolute position if its accuracy is at least x times better than the last one.\n static ACCURACY_RELOC_RATIO = 1.5;\n\n /** @type {boolean} */\n static USE_MM_FOR_FEED = true;\n\n\n /** @type {number?} */\n _gnssWifiProviderId;\n\n /** @type {number?} */\n _relativePositionProviderId;\n\n /** @type {number?} */\n _mapMatchingHandlerId\n\n /** @type {boolean?} */\n _waitUntilNextVpsPosition = false;\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsolutePosition';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n GeoRelativePositionProvider.availability,\n GnssWifi.availability\n ]);\n }\n\n\n /**\n * @override\n */\n start() {\n GeoRelativePositionProvider.availability\n .then(() => {\n this._relativePositionProviderId = GeoRelativePositionProvider.addEventListener(\n events => this._onRelativePosition(events[0])\n );\n })\n .catch(() => {\n // do nothing\n });\n\n if (ProvidersOptions.hasVps) {\n\n this._vpsProviderId = Vps.addEventListener(events => {\n this._onAbsolutePosition(events.find(event => event.dataType === EventType.AbsolutePosition));\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n });\n\n } else {\n\n this._gnssWifiProviderId = GnssWifi.addEventListener(\n events => {\n // bearing from GnssWifi is not reliable for our usecase\n events[0].data.bearing = null;\n this._onAbsolutePosition(events[0], false);\n }\n );\n\n }\n\n this._mapMatchingHandlerId = MapMatchingHandler.addEventListener();\n }\n\n\n /**\n * @override\n */\n stop() {\n if (this._relativePositionProviderId) {\n GeoRelativePositionProvider.removeEventListener(this._relativePositionProviderId);\n this._relativePositionProviderId = null;\n }\n if (this._gnssWifiProviderId) {\n GnssWifi.removeEventListener(this._gnssWifiProviderId);\n this._gnssWifiProviderId = null;\n }\n if (this._vpsProviderId) {\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n }\n\n MapMatchingHandler.removeEventListener(this._mapMatchingHandlerId);\n }\n\n /**\n * @param {ProviderEvent<UserPosition>} positionEvent\n * @param {boolean} canContainLevel\n */\n _onAbsolutePosition(positionEvent, canContainLevel = true) {\n\n const newPosition = positionEvent.data.clone();\n const lastPosition = this.lastEvent ? this.lastEvent.data : null;\n\n if (lastPosition) {\n\n // Is the new position accuracy is better enough than the last position accuracy\n const isBetterEnough = newPosition.accuracy * AbsolutePosition.ACCURACY_RELOC_RATIO <= lastPosition.accuracy;\n\n // Is the new position is far from the new one (regarding accuracy)\n // This is important if the person put the current page in the background during a while\n const isFarEnough = lastPosition.distanceTo(newPosition) > lastPosition.accuracy + newPosition.accuracy;\n\n if (!isBetterEnough && !isFarEnough) {\n return;\n }\n\n if (!canContainLevel) {\n newPosition.level = lastPosition.level;\n }\n\n // If the new position does not have a bearing, retrieve the bearing from the last position\n if (newPosition.bearing === null) {\n newPosition.bearing = lastPosition.bearing;\n }\n }\n\n\n const newPositionEvent = this.createEvent(\n EventType.AbsolutePosition,\n newPosition,\n [positionEvent]\n );\n\n // If the MM is disable or the network is not set yet, use the new position as it is.\n // If the position bearing is null, do not use MM, it is too dangerous.\n if (!MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromAbsolute(newPositionEvent);\n }\n\n /**\n * @param {ProviderEvent<GeoRelativePosition>} relativeEvent\n */\n _onRelativePosition(relativeEvent) {\n\n if (!this.lastEvent || this._waitUntilNextVpsPosition) {\n return;\n }\n\n const lastPosition = this.lastEvent.data;\n\n const offsetPos = relativeEvent.data;\n\n const dist = Math.sqrt(offsetPos.x ** 2 + offsetPos.y ** 2);\n const bearing = Math.atan2(offsetPos.x, offsetPos.y);\n const alt = lastPosition.alt !== null ? offsetPos.z : null;\n\n const newPosition = lastPosition.destinationPoint(dist, bearing, alt);\n newPosition.bearing = offsetPos.bearing;\n newPosition.time = offsetPos.time;\n newPosition.accuracy += offsetPos.accuracy;\n\n\n const newPositionEvent = this.createEvent(\n EventType.AbsolutePosition,\n newPosition,\n [relativeEvent]\n );\n\n\n if (!MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromRelative(newPositionEvent);\n }\n\n\n /**\n * @override\n * @param {UserPosition|ProviderEvent} data\n * @param {EventType} eventType\n */\n feed(data, eventType) {\n\n /** @type {ProviderEvent<UserPosition>} */\n let newPositionEvent;\n\n if (eventType === EventType.ForceVps) {\n if (!this._vpsProviderId && this.state === ProviderState.STARTED) {\n this._waitUntilNextVpsPosition = true;\n this._vpsProviderId = Vps.addEventListener(events => {\n this._waitUntilNextVpsPosition = false;\n this._onAbsolutePosition(events.find(event => event.dataType === EventType.AbsolutePosition));\n Vps.removeEventListener(this._vpsProviderId);\n this._vpsProviderId = null;\n });\n }\n\n return;\n\n }\n\n if (data instanceof UserPosition) {\n\n if (data.time === null) {\n throw Error('the time of the position is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the position is not defined');\n }\n\n newPositionEvent = new ProviderEvent(EventType.AbsolutePosition, data);\n\n } else if (data instanceof ProviderEvent) {\n\n if (data.dataType !== EventType.AbsolutePosition\n || !(data.data instanceof UserPosition)) {\n throw Error('the provider event is not an UserPosition');\n }\n\n newPositionEvent = data;\n\n } else {\n throw new Error('data is nor an UserPosition or a ProviderEvent');\n }\n\n // If the MM is disable or the network is not set yet, use the new position as it is.\n if (!AbsolutePosition.USE_MM_FOR_FEED || !MapMatchingHandler.canUseMapMatching()) {\n this.notify(newPositionEvent);\n return;\n }\n\n MapMatchingHandler.notifyPositionFromFeed(newPositionEvent);\n }\n}\n\nexport default new AbsolutePosition();\n","import geomagnetism from '@wemap/geomagnetism';\n\nimport {\n Attitude, Coordinates\n} from '@wemap/geo';\nimport {\n deg2rad, rad2deg, Quaternion, Rotations\n} from '@wemap/maths';\nimport {\n Browser, BrowserUtils\n} from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AskImuOnDesktopError from '../../../errors/AskImuOnDesktopError.js';\nimport MissingMagnetometerError from '../../../errors/MissingMagnetometerError.js';\nimport MissingSensorError from '../../../errors/MissingSensorError.js';\nimport AbsolutePosition from '../../position/absolute/AbsolutePosition.js';\n\n\n/**\n * Absolute attitude provider gives the device attitude in East-North-Up (ENU) frame using\n * browser deviceorientation or deviceorientationabsolute\n * The provider does not work until an AbsolutePosition is given. This is necessary to\n * calculate declination.\n *\n * -----------------------------------\n * Overview of compatibilities:\n * -----------------------------------\n *\n * Chrome Android (v72.0.3626): YES (via deviceorientationabsolute)\n * Safari iOS (v12.0): YES (via deviceorientation and event.webkitCompassHeading)\n * Opera Android (v50.2.2426): NO {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/ondeviceorientation}\n * Firefox Android (v65.0.1): NO {@link https://www.fxsitecompat.com/en-CA/docs/2018/various-device-sensor-apis-are-now-deprecated/}\n *\n * -----------------------------------\n */\nclass AbsoluteAttitudeFromBrowser extends Provider {\n\n // from http://tyrex.inria.fr/mobile/benchmarks-attitude/\n static DEFAULT_ACCURACY = deg2rad(15);\n\n absolutePositionProviderId = null;\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsoluteAttitudeFromBrowser';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return BrowserUtils.isMobile\n ? Promise.resolve()\n : Promise.reject(new AskImuOnDesktopError());\n }\n\n /**\n * @override\n */\n start() {\n\n const subscribe = () => {\n switch (BrowserUtils.name) {\n case Browser.CHROME:\n window.addEventListener('deviceorientationabsolute',\n this.onDeviceOrientationChromeEvent, true);\n break;\n\n case Browser.SAFARI:\n case Browser.IOS_WEBVIEW:\n window.addEventListener('deviceorientation',\n this.onDeviceOrientationSafariEvent, true);\n break;\n }\n };\n\n if (typeof (DeviceOrientationEvent) !== 'undefined' && typeof (DeviceOrientationEvent.requestPermission) === 'function') {\n DeviceOrientationEvent\n .requestPermission()\n .then(response => {\n if (response !== 'granted') {\n throw new Error('Permission not granted');\n }\n subscribe();\n })\n .catch(error => this.notifyError(error));\n } else {\n subscribe();\n }\n\n\n const lastAbsolutePosition = AbsolutePosition.lastEvent;\n if (lastAbsolutePosition) {\n this.onAbsolutePositionEvent(lastAbsolutePosition);\n } else {\n this.absolutePositionProviderId = AbsolutePosition.addEventListener(\n events => this.onAbsolutePositionEvent(events[0]),\n error => this.notifyError(error),\n false\n );\n }\n\n }\n\n /**\n * @override\n */\n stop() {\n switch (BrowserUtils.name) {\n case Browser.CHROME:\n window.removeEventListener('deviceorientationabsolute',\n this.onDeviceOrientationChromeEvent, true);\n break;\n\n case Browser.SAFARI:\n case Browser.IOS_WEBVIEW:\n window.removeEventListener('deviceorientation',\n this.onDeviceOrientationSafariEvent, true);\n break;\n }\n\n if (this.absolutePositionProviderId !== null) {\n AbsolutePosition.removeEventListener(this.absolutePositionProviderId);\n }\n }\n\n\n onDeviceOrientationChromeEvent = e => {\n\n this.magQuaternionTimestamp = e.timeStamp / 1e3;\n\n if (typeof e.alpha !== 'number' || typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientationabsolute'));\n return;\n }\n\n this.magQuaternion = Rotations.eulerToQuaternionZXYDegrees(\n [e.alpha, e.beta, e.gamma]);\n\n this.compute();\n };\n\n\n iosPreviousQuat = null;\n iosIsSkyMode;\n\n onDeviceOrientationSafariEvent = e => {\n\n this.magQuaternionTimestamp = e.timeStamp / 1e3;\n\n if (typeof e.beta !== 'number' || typeof e.gamma !== 'number') {\n this.notifyError(new MissingSensorError().from('deviceorientation'));\n return;\n }\n\n if (typeof e.webkitCompassHeading !== 'number') {\n super.notifyError(new MissingMagnetometerError().from('deviceorientation'));\n return;\n }\n\n /**\n * Trying the best to retrieve a good quaternion from devicemotion event.\n */\n\n let alpha;\n const [qw, qx, qy, qz] = Rotations.eulerToQuaternionZXYDegrees([e.webkitCompassHeading, e.beta, e.gamma]);\n const groundAngle = rad2deg(Math.acos(qw ** 2 - qx ** 2 - qy ** 2 + qz ** 2));\n\n let isSkyMode;\n if (groundAngle > 136) {\n isSkyMode = true;\n } else if (groundAngle < 134) {\n isSkyMode = false;\n } else if (this.iosPreviousQuat && this.iosIsSkyMode !== null) {\n /**\n * This condition is true only if :\n * - we are in the [134°; 136°] ground angle range\n * - we know the previous quaternion\n * - one of the both previous condition has been reached during this session\n *\n * In this case, we define a threshold to detect if there is a \"jump\" in the quaternion calculation,\n * then, the mode is switched.\n */\n isSkyMode = Quaternion.distance([qw, qx, qy, qz], this.iosPreviousQuat) < 0.5\n ? this.iosIsSkyMode\n : !this.iosIsSkyMode;\n }\n this.iosPreviousQuat = [qw, qx, qy, qz];\n this.iosIsSkyMode = isSkyMode;\n\n if (typeof (isSkyMode) === 'undefined') {\n // Algorithm uncertainity\n return;\n }\n\n if (isSkyMode) {\n alpha = 180 - e.webkitCompassHeading;\n } else {\n alpha = AbsoluteAttitudeFromBrowser.webkitCompassToHeading(\n e.webkitCompassHeading, e.beta, e.gamma);\n }\n\n this.magQuaternion = Rotations.eulerToQuaternionZXYDegrees([alpha, e.beta, e.gamma]);\n\n this.compute();\n };\n\n\n compute() {\n\n if (!this.declinationQuaternion || !this.magQuaternion) {\n return;\n }\n\n const trueQuaternion = Quaternion.multiply(this.declinationQuaternion, this.magQuaternion);\n const attitude = new Attitude(trueQuaternion, this.magQuaternionTimestamp,\n this.constructor.DEFAULT_ACCURACY, this.pname);\n this.notify(this.createEvent(\n EventType.AbsoluteAttitude,\n attitude,\n [this.absolutePositionEvent]\n ));\n }\n\n /**\n * Initialized declination quaternion using current position.\n * This method should be theoretically called every time the user moves.\n * But in reality declination does not change as much.\n * @param {Coordinates} positionEvent user position event\n */\n onAbsolutePositionEvent = positionEvent => {\n\n if (!positionEvent) {\n return;\n }\n\n this.absolutePositionEvent = positionEvent;\n\n const position = positionEvent.data;\n const wmmResult = geomagnetism.model().point([position.lat, position.lng]);\n // Declination is given in NED frame and our code use ENU, that is why we have: \"-decl\"\n this.declinationQuaternion = Quaternion.fromAxisAngle([0, 0, 1], - deg2rad(wmmResult.decl));\n\n AbsolutePosition.removeEventListener(this.absolutePositionProviderId);\n this.absolutePositionProviderId = null;\n this.compute();\n }\n\n static webkitCompassToHeading(_webkitCompassHeading, _beta, _gamma) {\n const webkitCompassHeading = deg2rad(_webkitCompassHeading);\n const beta = deg2rad(_beta);\n const gamma = deg2rad(_gamma);\n\n const c1 = Math.cos(webkitCompassHeading / 2);\n const c2 = Math.cos(beta / 2);\n const c3 = Math.cos(gamma / 2);\n const s1 = Math.sin(webkitCompassHeading / 2);\n const s2 = Math.sin(beta / 2);\n const s3 = Math.sin(gamma / 2);\n\n const qw = c1 * c2 * c3 - s1 * s2 * s3;\n const qz = s1 * c2 * c3 + c1 * s2 * s3;\n\n return rad2deg(-2 * Math.atan(qz / qw));\n }\n}\n\nexport default new AbsoluteAttitudeFromBrowser();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\n\nimport Accelerometer from '../imu/Accelerometer.js';\n\n/**\n * Inclination provider gives the inclination of the device using Imu Sensor\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass InclinationFromAcc extends Provider {\n\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationFromAcc';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return Accelerometer.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = Accelerometer.addEventListener(\n events => this.onAccelerometerEvent(events[0]),\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n Accelerometer.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n */\n onAccelerometerEvent = accelerometerEvent => {\n const acc = accelerometerEvent.data.values;\n\n const screenOrientation = window.orientation || 0;\n\n const sizeAcc = Math.sqrt(acc[0] * acc[0] + acc[1] * acc[1] + acc[2] * acc[2]);\n const accNormalized = [acc[0] / sizeAcc, acc[1] / sizeAcc, acc[2] / sizeAcc];\n\n const q = [accNormalized[2] + 1, accNormalized[1], -accNormalized[0], 0];\n const qSize = Math.sqrt(q[0] * q[0] + q[1] * q[1] + q[2] * q[2]);\n const qNormalized = [q[0] / qSize, q[1] / qSize, q[2] / qSize, 0];\n\n let inclination;\n if (screenOrientation === 0) {\n inclination = Math.asin(2 * qNormalized[1] * qNormalized[0]);\n } else if (screenOrientation === 90) {\n inclination = -Math.asin(2 * qNormalized[2] * qNormalized[0]);\n } else if (screenOrientation === -90) {\n inclination = Math.asin(2 * qNormalized[2] * qNormalized[0]);\n } else if (screenOrientation === 180) {\n inclination = -Math.asin(2 * qNormalized[1] * qNormalized[0]);\n }\n\n this.notify(this.createEvent(\n EventType.Inclination,\n inclination,\n [accelerometerEvent]\n ));\n };\n}\n\nexport default new InclinationFromAcc();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport RelativeAttitudeFromInertial from '../attitude/relative/RelativeAttitudeFromInertial.js';\n\n\n/**\n * Inclination provider gives the inclination of the device using Relative Attitude\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass InclinationFromRelativeAttitude extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationFromRelativeAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return RelativeAttitudeFromInertial.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = RelativeAttitudeFromInertial.addEventListener(\n events => {\n const attitudeEvent = events[0];\n const inclination = this.constructor.enuQuatToInclination(\n attitudeEvent.data.quaternion\n );\n this.notify(this.createEvent(\n EventType.Inclination,\n inclination,\n [attitudeEvent]\n ));\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n RelativeAttitudeFromInertial.removeEventListener(this.providerId);\n }\n\n static enuQuatToInclination(q) {\n const screenOrientation = window.orientation || 0;\n\n if (screenOrientation === 0) {\n return Math.asin(2 * (q[2] * q[3] + q[1] * q[0]));\n } else if (screenOrientation === 90) {\n return Math.asin(2 * (q[1] * q[3] - q[2] * q[0]));\n } else if (screenOrientation === -90) {\n return Math.asin(2 * (q[2] * q[0] - q[1] * q[3]));\n }\n // else if (screenOrientation === 180)\n return -Math.asin(2 * (q[2] * q[3] + q[1] * q[0]));\n }\n}\n\nexport default new InclinationFromRelativeAttitude();\n","import { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport InclinationFromAcc from './InclinationFromAcc.js';\nimport InclinationFromRelativeAttitude from './InclinationFromRelativeAttitude.js';\n\n/**\n * Inclination provider gives the inclination of the device using Imu Sensor\n * For example, when the top of the device is pointing the sky, inclination = Math.PI/2\n * when the device is layed on a table, inclination = 0\n * This provider use window.orientation to return a result in function of screen orientation\n */\nclass Inclination extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'InclinationProvider';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Inclination];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n InclinationFromAcc.availability,\n InclinationFromRelativeAttitude.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n const startInclinationFromAcc = () => {\n this.provider = InclinationFromAcc;\n this.providerId = this.provider.addEventListener(\n events => this.notify(events[0].clone()),\n error => this.notifyError(error)\n );\n };\n\n if (InclinationFromRelativeAttitude.availability) {\n this.provider = InclinationFromRelativeAttitude;\n this.providerId = this.provider.addEventListener(\n events => this.notify(events[0].clone()),\n () => {\n InclinationFromRelativeAttitude.removeEventListener(this.providerId);\n startInclinationFromAcc();\n }\n );\n } else {\n startInclinationFromAcc();\n }\n }\n\n /**\n * @override\n */\n stop() {\n if (this.provider) {\n this.provider.removeEventListener(this.providerId);\n }\n }\n}\n\nexport default new Inclination();\n","/* eslint-disable max-statements */\nimport { AbsoluteHeading, Attitude } from '@wemap/geo';\nimport { deg2rad, diffAngle, Quaternion } from '@wemap/maths';\nimport { PromiseUtils } from '@wemap/utils';\n\nimport Provider from '../../Provider.js';\nimport EventType from '../../../events/EventType.js';\nimport AbsoluteAttitudeFromBrowser from './AbsoluteAttitudeFromBrowser.js';\nimport RelativeAttitude from '../relative/RelativeAttitude.js';\nimport Inclination from '../../inclination/Inclination.js';\nimport ProviderEvent from '../../../events/ProviderEvent.js';\nimport HighRotationsDetector from '../../imu/HighRotationsDetector.js';\n\n/**\n * Absolute attitude provider gives the device attitude in East-North-Up (ENU) frame\n */\nclass AbsoluteAttitude extends Provider {\n\n /** @type {number} */\n static REL_ABS_DIVERGENCE_ANGLE_THRESHOLD = deg2rad(25);\n\n /** @type {number} in seconds */\n static REL_ABS_DIVERGENCE_TIME_THRESHOLD = 2.5;\n\n /** @type {number} */\n static REL_ABS_DIVERGENCE_INCLINATION_THRESHOLD = deg2rad(15);\n\n /** @type {boolean} */\n _attitudeFromBrowserErrored = false;\n\n /** @type {boolean} */\n _attitudeFromRelativeErrored = false;\n\n /*\n * RELATIVE\n */\n\n /** @type {Attitude} */\n _relativeAttitude = null;\n\n /** @type {number} in radians/s */\n _relativeAccuracy = 0;\n\n /** @type {ProviderEvent<Attitude|AbsoluteHeading>} */\n _lastForcedHeadingEvent;\n\n /** @type {number[]} quaternion offset from relative to absolute */\n _relAbsQuat;\n\n /** @type {boolean} */\n _wasHighRotationInProgress = false;\n\n /** @type {?number} */\n _timeFirstDivergence = null;\n\n\n constructor() {\n super();\n\n this._attitudeFromBrowserErrored = false;\n this._attitudeFromRelativeErrored = false;\n }\n\n /**\n * @override\n */\n static get pname() {\n return 'AbsoluteAttitude';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsoluteAttitude];\n }\n\n /**\n * @override\n */\n get _availability() {\n return PromiseUtils.any([\n AbsoluteAttitudeFromBrowser.availability,\n RelativeAttitude.availability\n ]);\n }\n\n /**\n * @override\n */\n start() {\n\n this.fromBrowserProviderId = AbsoluteAttitudeFromBrowser.addEventListener(\n events => this._onAttitudeFromBrowser(events[0]),\n error => {\n this._attitudeFromBrowserErrored = true;\n this.onError(error);\n }\n );\n\n this.relativeAttitudeProviderId = RelativeAttitude.addEventListener(\n events => this._onRelativeAttitudeEvent(events[0]),\n error => {\n this._attitudeFromRelativeErrored = true;\n this.onError(error);\n }\n );\n\n this.inclinationProviderId = Inclination.addEventListener();\n\n this.highRotationDetectorId = HighRotationsDetector.addEventListener();\n }\n\n /**\n * @override\n */\n stop() {\n AbsoluteAttitudeFromBrowser.removeEventListener(this.fromBrowserProviderId);\n RelativeAttitude.removeEventListener(this.relativeAttitudeProviderId);\n Inclination.removeEventListener(this.inclinationProviderId);\n HighRotationsDetector.removeEventListener(this.highRotationDetectorId);\n }\n\n onError(error) {\n if (this._attitudeFromBrowserErrored && this._attitudeFromRelativeErrored) {\n this.notifyError(error);\n }\n }\n\n\n /**\n * @param {ProviderEvent<Attitude|AbsoluteHeading>} absoluteHeadingEvent\n */\n _forceHeadingForRelative = (absoluteHeadingEvent) => {\n\n if (this.lastEvent && absoluteHeadingEvent.data.accuracy > this.lastEvent.data.accuracy) {\n return;\n }\n\n\n /**\n * @param {Attitude} relativeAttitude\n */\n const calcForceHeading = (relativeAttitude) => {\n const currentRelativeHeading = relativeAttitude.heading;\n\n this._relAbsQuat = Quaternion.fromAxisAngle(\n [0, 0, 1],\n currentRelativeHeading - absoluteHeadingEvent.data.heading\n );\n\n this._relativeAccuracy = 0;\n this._lastForcedHeadingEvent = absoluteHeadingEvent;\n };\n\n // If relativeAttitude does not exist yet, wait the next\n if (this._relativeAttitude) {\n calcForceHeading(this._relativeAttitude);\n return;\n }\n\n // If this._relativeAttitude does not exist, wait the first value\n // /!\\ This works only if the relative attitude event is provided rapidly.\n const providerId = RelativeAttitude.addEventListener(\n events => {\n calcForceHeading(events[0].data);\n RelativeAttitude.removeEventListener(providerId);\n }\n );\n\n };\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _onRelativeAttitudeEvent(event) {\n\n const { quaternion, accuracy, time } = event.data;\n\n // Calculate relative accuracy\n if (this._relativeAttitude) {\n this._relativeAccuracy += (time - this._relativeAttitude.time) * accuracy;\n }\n\n // Keep the relative attitude event for the calculation of relAbsQuat\n // /!\\ Keep this even if forced heading is not set /!\\\n this._relativeAttitude = event.data;\n\n\n if (!this._lastForcedHeadingEvent) {\n return;\n }\n\n const accuracyWithRelative = Math.min(\n this._lastForcedHeadingEvent.data.accuracy + this._relativeAccuracy,\n Math.PI\n );\n\n const highRotationInProgress = HighRotationsDetector.isInProgress();\n\n let magnetometerNeedCalibrationEvent = null;\n let divergenceDetected = false;\n\n if (this._eventFromBrowser) {\n\n const {\n accuracy: accuracyWithAbsolute,\n heading: headingFromAbsolute\n } = this._eventFromBrowser.data;\n\n if (this._wasHighRotationInProgress && !highRotationInProgress) {\n // Update heading for relative if it the end of high rotations\n // (probably due to a magnetometer calibratiton)\n this._forceHeadingForRelative(this._eventFromBrowser);\n\n } else if (accuracyWithAbsolute < accuracyWithRelative) {\n // Update heading for relative if:\n // (1) accuracy from absolute is better than relative\n // (2) heading divergence is greater than REL_ABS_DIVERGENCE_THRESHOLD\n const relativeQuaternion = Quaternion.multiply(this._relAbsQuat, quaternion);\n const relativeAttitude = new Attitude(relativeQuaternion);\n const angle = Math.abs(diffAngle(relativeAttitude.heading, headingFromAbsolute));\n const inclination = Inclination.lastEvent.data;\n\n\n if (angle > AbsoluteAttitude.REL_ABS_DIVERGENCE_ANGLE_THRESHOLD\n && Math.abs(inclination - Math.PI / 4) > AbsoluteAttitude.REL_ABS_DIVERGENCE_INCLINATION_THRESHOLD\n ) {\n divergenceDetected = true;\n\n // Be sure before forcing heading\n if (this._timeFirstDivergence !== null\n && time - this._timeFirstDivergence > AbsoluteAttitude.REL_ABS_DIVERGENCE_TIME_THRESHOLD) {\n\n this._forceHeadingForRelative(this._eventFromBrowser);\n magnetometerNeedCalibrationEvent = this.createEvent(\n EventType.MagnetometerNeedCalibration,\n {\n angle\n }, [event, this._lastForcedHeadingEvent]\n );\n this._timeFirstDivergence = null;\n } else if (this._timeFirstDivergence === null) {\n this._timeFirstDivergence = time;\n }\n\n }\n }\n\n }\n\n if (!divergenceDetected) {\n this._timeFirstDivergence = null;\n }\n\n this._wasHighRotationInProgress = highRotationInProgress;\n\n const absoluteQuat = Quaternion.multiply(this._relAbsQuat, quaternion);\n const attitude = new Attitude(absoluteQuat, time, accuracyWithRelative);\n\n const eventsToNotify = [\n this.createEvent(\n EventType.AbsoluteAttitude,\n attitude,\n [event, this._lastForcedHeadingEvent]\n )\n ];\n if (magnetometerNeedCalibrationEvent) {\n eventsToNotify.push(magnetometerNeedCalibrationEvent);\n }\n\n this.notify(...eventsToNotify);\n }\n\n\n /**\n * @param {ProviderEvent<Attitude>} event\n */\n _onAttitudeFromBrowser(event) {\n this._eventFromBrowser = event;\n\n if (!this._lastForcedHeadingEvent) {\n this._forceHeadingForRelative(event);\n return;\n }\n\n // Absolute attitude from browser is not used anymore due to magnetometer inaccuracy on pitch and roll\n }\n\n /**\n * @override\n * @param {AbsoluteHeading|Attitude|ProviderEvent} data\n */\n feed(data) {\n\n if (data instanceof AbsoluteHeading) {\n\n if (data.time === null) {\n throw Error('the time of the absolute heading is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the absolute heading is not defined');\n }\n\n this._forceHeadingForRelative(new ProviderEvent(EventType.AbsoluteHeading, data));\n\n } else if (data instanceof Attitude) {\n\n if (data.time === null) {\n throw Error('the time of the attitude is not defined');\n }\n if (data.accuracy === null) {\n throw Error('the accuracy of the attitude is not defined');\n }\n\n this._forceHeadingForRelative(new ProviderEvent(EventType.AbsoluteHeading, data));\n\n } else if (data instanceof ProviderEvent) {\n\n if (data.dataType !== EventType.AbsoluteHeading\n || !(data.data instanceof AbsoluteHeading)) {\n throw Error('the provider event is not an AbsoluteHeading');\n }\n\n this._forceHeadingForRelative(data);\n\n } else {\n throw new Error('data is nor an AbsoluteHeading or an Attitude object');\n }\n }\n}\n\nexport default new AbsoluteAttitude();\n","import EventType from '../../events/EventType.js';\nimport ProviderEvent from '../../events/ProviderEvent.js';\nimport AbsoluteAttitude from '../attitude/absolute/AbsoluteAttitude.js';\nimport Provider from '../Provider.js';\n\nclass MagnetometerCalibrationDetector extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'MagnetometerCalibrationDetector';\n }\n\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.MagnetometerNeedCalibration];\n }\n\n /**\n * @override\n */\n get _availability() {\n return AbsoluteAttitude.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = AbsoluteAttitude.addEventListener(\n events => this._parseAbsoluteAttitudeEvents(events),\n error => this.notifyError(error),\n false\n );\n }\n\n /**\n * @override\n */\n stop() {\n AbsoluteAttitude.removeEventListener(this.providerId);\n }\n\n /**\n * @private\n * @param {ProviderEvent[]} absoluteAttitudeEvents\n */\n _parseAbsoluteAttitudeEvents = absoluteAttitudeEvents => {\n\n if (absoluteAttitudeEvents.length < 2) {\n return;\n }\n\n const magnetometerNeedCalibrationEvent = absoluteAttitudeEvents[1];\n if (magnetometerNeedCalibrationEvent.dataType !== EventType.MagnetometerNeedCalibration) {\n return;\n }\n\n this.notify(magnetometerNeedCalibrationEvent);\n }\n}\n\nexport default new MagnetometerCalibrationDetector();\n","class IpResolveServerError extends Error {\n\n static DEFAULT_MESSAGE = 'IP Resolver failed';\n\n constructor(message) {\n super(message || IpResolveServerError.DEFAULT_MESSAGE);\n }\n}\n\nexport default IpResolveServerError;\n","import { UserPosition } from '@wemap/geo';\nimport { TimeUtils } from '@wemap/utils';\n\nimport EventType from '../../../events/EventType.js';\nimport Provider from '../../Provider.js';\nimport IpResolveServerError from '../../../errors/IpResolveServerError.js';\n\n/**\n * GnssWifiProvider is a provider based on navigator.geolocation.\n * This API does not allow us to know if the position returned is provided\n * by Wifi Fingerprinting algorithms or by GNSS. That is why the name is\n * \"GnssWifi\".\n */\nclass Ip extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'IP';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.AbsolutePosition];\n }\n\n /**\n * @override\n */\n start() {\n\n fetch('https://ipinfo.io/geo?token=24a7ca2f3b489d')\n .then((response) => {\n if (!response) {\n this.notifyError(new IpResolveServerError());\n return;\n }\n\n const timestamp = TimeUtils.preciseTime() / 1e3;\n\n const latLngStr = response.loc.split(',');\n const position = new UserPosition(\n parseFloat(latLngStr[0]),\n parseFloat(latLngStr[1]),\n null,\n null,\n timestamp\n );\n\n this.notify(this.createEvent(EventType.AbsolutePosition, position));\n });\n }\n\n /**\n * @override\n */\n stop() {\n\n }\n\n}\n\nexport default new Ip();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport ArCore from '../position/relative/ArCore.js';\n\nclass Barcode extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'Barcode';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.Barcode];\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n ArCore.enableBarcodeScanner();\n\n this.providerId = ArCore.addEventListener(\n events => {\n const barcodeEvent = events.find(event => event.dataType === EventType.Barcode);\n if (barcodeEvent) {\n this.notify(barcodeEvent);\n }\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.disableBarcodeScanner();\n ArCore.removeEventListener(this.providerId);\n }\n}\n\nexport default new Barcode();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport { ArCore } from '../../Providers.js';\nimport ProviderState from '../ProviderState.js';\n\nclass CameraNative extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'CameraNative';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.CameraNative];\n }\n\n /**\n * @override\n */\n get _availability() {\n return new Promise((resolve, reject) => {\n ArCore.availability\n .then(output => resolve(output))\n .catch(() => reject('Providers will not use the camera.'));\n });\n }\n\n /**\n * @override\n */\n start() {\n\n if (ArCore.state !== ProviderState.STOPPPED) {\n this.notify(this.createEvent(EventType.CameraNative, 'started'));\n }\n this.providerId = ArCore.addMonitoringListener(\n () => this.notify(this.createEvent(EventType.CameraNative, 'started')),\n () => this.notify(this.createEvent(EventType.CameraNative, 'stopped'))\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeMonitoringListener(this.providerId);\n }\n}\n\nexport default new CameraNative();\n","import Provider from '../Provider.js';\nimport EventType from '../../events/EventType.js';\nimport ArCore from '../position/relative/ArCore.js';\n\nclass CameraProjectionMatrix extends Provider {\n\n /**\n * @override\n */\n static get pname() {\n return 'CameraProjectionMatrix';\n }\n\n /**\n * @override\n */\n static get eventsType() {\n return [EventType.CameraProjectionMatrix];\n }\n\n /**\n * @override\n */\n get _availability() {\n return ArCore.availability;\n }\n\n /**\n * @override\n */\n start() {\n this.providerId = ArCore.addEventListener(\n events => {\n const projMatrixEvent = events.find(event => event.dataType === EventType.CameraProjectionMatrix);\n if (projMatrixEvent) {\n this.notify(projMatrixEvent);\n }\n },\n error => this.notifyError(error)\n );\n }\n\n /**\n * @override\n */\n stop() {\n ArCore.removeEventListener(this.providerId);\n }\n}\n\nexport default new CameraProjectionMatrix();\n","/* eslint-disable max-len */\n\nexport { default as Imu } from './providers/imu/Imu.js';\nexport { default as Accelerometer } from './providers/imu/Accelerometer.js';\nexport { default as Gyroscope } from './providers/imu/Gyroscope.js';\nexport { default as HighRotationsDetector } from './providers/imu/HighRotationsDetector.js';\nexport { default as MagnetometerCalibrationDetector } from './providers/imu/MagnetometerCalibrationDetector.js';\n\nexport { default as RelativeAttitudeFromBrowser } from './providers/attitude/relative/RelativeAttitudeFromBrowser.js';\nexport { default as RelativeAttitudeFromEkf } from './providers/attitude/relative/RelativeAttitudeFromEkf.js';\nexport { default as RelativeAttitudeFromInertial } from './providers/attitude/relative/RelativeAttitudeFromInertial.js';\nexport { default as RelativeAttitude } from './providers/attitude/relative/RelativeAttitude.js';\n\nexport { default as AbsoluteAttitudeFromBrowser } from './providers/attitude/absolute/AbsoluteAttitudeFromBrowser.js';\nexport { default as AbsoluteAttitude } from './providers/attitude/absolute/AbsoluteAttitude.js';\n\nexport { default as TurnDetector } from './providers/attitude/TurnDectector.js';\n\nexport { default as InclinationFromAcc } from './providers/inclination/InclinationFromAcc.js';\nexport { default as InclinationFromRelativeAttitude } from './providers/inclination/InclinationFromRelativeAttitude.js';\nexport { default as Inclination } from './providers/inclination/Inclination.js';\n\nexport { default as StepDetector } from './providers/steps/StepDetector.js';\nexport { default as StraightLineDetector } from './providers/steps/StraightLineDetector.js';\n\nexport { default as ArCore } from './providers/position/relative/ArCore.js';\nexport { default as Pdr } from './providers/position/relative/Pdr.js';\nexport { default as GeoRelativePositionFromArCore } from './providers/position/relative/GeoRelativePositionFromArCore.js';\nexport { default as GeoRelativePosition } from './providers/position/relative/GeoRelativePosition.js';\n\nexport { default as GnssWifi } from './providers/position/absolute/GnssWifi.js';\nexport { default as Ip } from './providers/position/absolute/Ip.js';\nexport { default as AbsolutePosition } from './providers/position/absolute/AbsolutePosition.js';\n\nexport { default as Vps } from './providers/vision/Vps.js';\n\nexport { default as Barcode } from './providers/others/Barcode.js';\nexport { default as CameraNative } from './providers/others/CameraNative.js';\nexport { default as CameraProjectionMatrix } from './providers/others/CameraProjectionMatrix.js';\n","\nimport {\n Attitude, AbsoluteHeading, UserPosition, Network\n} from '@wemap/geo';\nimport { Itinerary } from '@wemap/routers';\n\nimport EventType from './events/EventType.js';\nimport {\n AbsoluteAttitude, AbsolutePosition, Barcode, CameraNative,\n CameraProjectionMatrix, Inclination, MagnetometerCalibrationDetector, RelativeAttitude\n} from './Providers.js';\nimport ProvidersLoggerOld from './events/ProvidersLoggerOld.js';\nimport MapMatchingHandler from './mapmatching/MapMatchingHandler.js';\n\nclass ProvidersInterface {\n\n static idListeners = new Map();\n\n /**\n * @param {EventType} eventType\n * @param {Function} onEvent\n * @param {Function} onError\n * @param {Boolean} watchOnly if true, addEventListener does not start any provider, it just watches for events\n * @returns {Number}\n */\n static addEventListener(eventType, onEvent, onError, watchOnly = false) {\n const provider = this._getProviderFromEventType(eventType);\n const id = provider.addEventListener(events => onEvent(events[0].data), onError, !watchOnly);\n this.idListeners.set(id, provider);\n return id;\n }\n\n /**\n * @see addEventListener\n * @param {Number} id\n */\n static removeEventListener(id) {\n const provider = this.idListeners.get(id);\n if (provider) {\n return provider.removeEventListener(id);\n }\n return null;\n }\n\n\n /**\n * @param {EventType} eventType\n * @param {Object} data\n */\n static feed(eventType, data) {\n this._checkEventTypeDataConsistency(eventType, data);\n if (eventType === EventType.Network) {\n MapMatchingHandler.network = data;\n return;\n }\n if (eventType === EventType.Itinerary) {\n MapMatchingHandler.itinerary = data;\n return;\n }\n this._getProviderFromEventType(eventType).feed(data, eventType);\n }\n\n /**\n * @param {EventType} eventType\n */\n static getLastKnown(eventType) {\n const { lastEvent } = this._getProviderFromEventType(eventType);\n return lastEvent ? lastEvent.data : null;\n }\n\n /**\n * @param {EventType} eventType\n * @returns {Provider}\n */\n static _getProviderFromEventType(eventType) {\n\n switch (eventType) {\n case EventType.AbsoluteAttitude:\n case EventType.AbsoluteHeading:\n return AbsoluteAttitude;\n\n case EventType.AbsolutePosition:\n case EventType.ForceVps:\n return AbsolutePosition;\n\n case EventType.RelativeAttitude:\n return RelativeAttitude;\n\n case EventType.Inclination:\n return Inclination;\n\n case EventType.CameraNative:\n return CameraNative;\n\n case EventType.Barcode:\n return Barcode;\n\n case EventType.CameraProjectionMatrix:\n return CameraProjectionMatrix;\n\n case EventType.MagnetometerNeedCalibration:\n return MagnetometerCalibrationDetector;\n\n default:\n throw new Error(`Unable to deal with this event type: ${eventType}`);\n }\n }\n\n static _checkEventTypeDataConsistency(eventType, data) {\n const errorFn = expectedType =>\n new Error(`Event type (${eventType}) is not an instance of ${expectedType}`);\n\n switch (eventType) {\n case EventType.AbsoluteAttitude:\n if (!(data instanceof Attitude)) {\n throw errorFn('Attitude');\n }\n break;\n case EventType.AbsoluteHeading:\n if (!(data instanceof AbsoluteHeading)) {\n throw errorFn('AbsoluteHeading');\n }\n break;\n case EventType.AbsolutePosition:\n if (!(data instanceof UserPosition)) {\n throw errorFn('UserPosition');\n }\n break;\n case EventType.Network:\n if (!(data instanceof Network || data === null)) {\n throw errorFn('Network');\n }\n break;\n case EventType.Itinerary:\n if (!(data instanceof Itinerary || data === null)) {\n throw errorFn('Itinerary');\n }\n break;\n case EventType.ForceVps:\n break;\n default:\n throw new Error(`Unable to deal with this event type: ${eventType}`);\n }\n }\n\n /**\n * @param {Boolean} enabled\n */\n static set logger(enabled) {\n ProvidersLoggerOld.enabled = enabled;\n }\n\n static get mapMatchingMaxDistance() {\n return MapMatchingHandler.maxDistance;\n }\n\n static set mapMatchingMaxDistance(maxDistance) {\n MapMatchingHandler.maxDistance = maxDistance;\n }\n\n static get mapMatchingMinDistance() {\n return MapMatchingHandler.minDistance;\n }\n\n static set mapMatchingMinDistance(minDistance) {\n MapMatchingHandler.minDistance = minDistance;\n }\n\n static get mapMatchingMaxAngleBearing() {\n return MapMatchingHandler.maxAngleBearing;\n }\n\n static set mapMatchingMaxAngleBearing(maxAngleBearing) {\n MapMatchingHandler.maxAngleBearing = maxAngleBearing;\n }\n}\n\nexport default ProvidersInterface;\n","/* eslint-disable max-statements */\nimport { UserPosition } from '@wemap/geo';\n\nclass PositionSmoother {\n\n\n // Generated positions by second\n static DEFAULT_FREQUENCY = 60;\n\n // flyby (in second)\n static DEFAULT_FLYBY_TIME = 1;\n\n\n /**\n * @param {Function} callback\n * @param {Number} frequency in Hz\n */\n constructor(callback, frequency = this.constructor.DEFAULT_FREQUENCY) {\n this.callback = callback;\n this.positionsQueue = [];\n this.frequency = frequency;\n }\n\n /**\n * @param {UserPosition} newPosition\n * @param {Number} flybyTime in seconds\n */\n feed(newPosition, flybyTime = this.constructor.DEFAULT_FLYBY_TIME) {\n\n if (!(newPosition instanceof UserPosition)) {\n throw new TypeError('newPosition is not instance of UserPosition');\n }\n\n if (newPosition.time === null) {\n throw new Error('newPosition does not have time property');\n }\n\n let previousPosition;\n if (this.positionsQueue.length !== 0) {\n previousPosition = this.positionsQueue[0];\n this.positionsQueue = [];\n } else {\n previousPosition = this.previousPosition;\n }\n\n if (previousPosition) {\n\n const refTimestamp = newPosition.time;\n const distance = previousPosition.distanceTo(newPosition);\n const azimuth = previousPosition.bearingTo(newPosition);\n\n let i = 1;\n const nSamples = this.frequency * flybyTime + 1;\n\n let newPositionLevel = null;\n if (newPosition.level !== null) {\n newPositionLevel = newPosition.level.clone();\n }\n\n while (i < nSamples + 1) {\n const smoothedPosition = previousPosition.destinationPoint(distance * i / nSamples, azimuth);\n smoothedPosition.time = refTimestamp + (i - 1) / this.frequency;\n smoothedPosition.level = newPositionLevel;\n smoothedPosition.bearing = newPosition.bearing;\n smoothedPosition.accuracy = Math.max(\n smoothedPosition.accuracy + (newPosition.accuracy - smoothedPosition.accuracy) * i / nSamples,\n 0\n );\n this.positionsQueue.push(smoothedPosition);\n i++;\n }\n\n if (this.timeoutNotify) {\n clearTimeout(this.timeoutNotify);\n }\n } else {\n this.positionsQueue.push(newPosition.clone());\n }\n\n this.previousPosition = newPosition;\n this._notifyNext();\n }\n\n _notifyNext = () => {\n this.callback(this.positionsQueue.shift());\n if (this.positionsQueue.length !== 0) {\n this.timeoutNotify = setTimeout(this._notifyNext, 1e3 / this.frequency);\n } else {\n delete this.timeoutNotify;\n }\n }\n\n clear() {\n clearTimeout(this.timeoutNotify);\n delete this.timeoutNotify;\n this.positionsQueue = [];\n }\n}\n\nexport default PositionSmoother;\n","/* eslint-disable max-statements */\nimport { Attitude } from '@wemap/geo';\nimport { deg2rad, diffAngle, Quaternion } from '@wemap/maths';\n\nclass AttitudeSmoother {\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_JUMP_THRESHOLD = deg2rad(180);\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_CONVERGENCE = deg2rad(10);\n\n /** @type {number} in radians/s */\n static HIGH_JUMP_THRESHOLD = deg2rad(20);\n\n /** @type {number} in radians/s */\n static ROTATION_SPEED_HIGH_JUMP_CONVERGENCE = deg2rad(100);\n\n /** @type {number} in radians */\n static PITCH_UNCERTAINITY_HEADING_THRESHOLD = deg2rad(5);\n\n /** @type {Function} */\n _callback;\n\n /** @type {object?} */\n _smoothing = null;\n\n /**\n * @param {Function} callback\n */\n constructor(callback) {\n this._callback = callback;\n }\n\n /**\n * @param {Attitude} attitude\n */\n feed(newAttitude) {\n\n if (!(newAttitude instanceof Attitude)) {\n throw new TypeError('newAttitude is not instance of Attitude');\n }\n\n if (newAttitude.time === null) {\n throw new Error('newAttitude does not have time property');\n }\n\n const { _previousAttitude: previousAttitude } = this;\n this._previousAttitude = newAttitude;\n\n if (!previousAttitude) {\n this._callback(newAttitude);\n return;\n }\n\n /*\n * Comparison between two successive Attitude from the \"feed\" function\n */\n if (AttitudeSmoother.isJump(previousAttitude, newAttitude)) {\n\n const fromAttitude = this._smoothing === null\n ? previousAttitude\n : this._smoothing.interpAttitude(previousAttitude);\n\n const fromHeading = fromAttitude.heading;\n const toHeading = newAttitude.heading;\n const diffAngleHeading = diffAngle(toHeading, fromHeading);\n\n const isHighJump = Math.abs(diffAngleHeading) < AttitudeSmoother.HIGH_JUMP_THRESHOLD;\n const rotationSpeedConvergence = isHighJump\n ? AttitudeSmoother.ROTATION_SPEED_CONVERGENCE\n : AttitudeSmoother.ROTATION_SPEED_HIGH_JUMP_CONVERGENCE;\n\n const fromTime = fromAttitude.time;\n const timeToConsume = Math.abs(diffAngleHeading) / rotationSpeedConvergence;\n const multiplier = diffAngleHeading < 0 ? -1 : 1;\n\n this._smoothing = {\n toTime: fromTime + timeToConsume,\n\n /**\n * @param {Attitude} attitude\n */\n interpAttitude: attitude => {\n const angle = rotationSpeedConvergence * (attitude.time - fromTime);\n const interpHeading = fromHeading + angle * multiplier;\n const offsetQuat = Quaternion.fromAxisAngle([0, 0, 1], toHeading - interpHeading);\n const interpQuat = Quaternion.multiply(offsetQuat, attitude.quaternion);\n return new Attitude(interpQuat, attitude.time, attitude.accuracy);\n }\n };\n }\n\n if (this._smoothing !== null) {\n if (newAttitude.time >= this._smoothing.toTime) {\n // This means that is the last epoch for smoothing\n this._smoothing = null;\n } else {\n const interpAttitude = this._smoothing.interpAttitude(newAttitude);\n this._callback(interpAttitude);\n return;\n }\n }\n\n this._callback(newAttitude);\n }\n\n /**\n * @param {Attitude} previousAttitude\n * @param {Attitude} newAttitude\n * @returns {boolean}\n */\n static isJump(previousAttitude, newAttitude) {\n const fromHeading = previousAttitude.heading;\n const toHeading = newAttitude.heading;\n const diffAngleHeading = diffAngle(toHeading, fromHeading);\n const diffTime = newAttitude.time - previousAttitude.time;\n\n /**\n * Heading is calculated from two different formulas in function of the pitch angle.\n * Do not consider a jump if attitude is close to the change of the methods\n * @see MathsRotations#getHeadingFromQuaternion()\n */\n const [qw, qx, qy, qz] = newAttitude.quaternion;\n const distToPitchThreshold = Math.abs(Math.asin(2 * (qw * qx + qy * qz)) - Math.PI / 4);\n if (distToPitchThreshold < AttitudeSmoother.PITCH_UNCERTAINITY_HEADING_THRESHOLD) {\n return false;\n }\n\n return Math.abs(diffAngleHeading) > AttitudeSmoother.ROTATION_SPEED_JUMP_THRESHOLD * diffTime;\n }\n\n}\n\nexport default AttitudeSmoother;\n"],"names":["ProvidersLoggerOld","Imu","Gyroscope","Constants","inputModeCorrespondance","routingModeCorrespondance","Accelerometer","RelativeAttitudeFromInertial","RelativeAttitudeFromEkf","RelativeAttitudeFromBrowser","HighRotationsDetector","ArCore","RelativeAttitude","GeoConstants","StepDetector","StraightLineDetector","AbsolutePosition","AbsoluteAttitudeFromBrowser","AbsoluteAttitude","GeoRelativePosition","Pdr","GeoRelativePositionFromArCore","TimeUtils.preciseTime","GnssWifi","Vps","MapMatchingHandler","InclinationFromAcc","InclinationFromRelativeAttitude","Inclination","CameraNative","Barcode","CameraProjectionMatrix","MagnetometerCalibrationDetector"],"mappings":"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"}