matrix-react-sdk
Version:
SDK for matrix.org using React
124 lines (121 loc) • 16.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.watchPosition = exports.mapGeolocationPositionToTimedGeo = exports.mapGeolocationError = exports.getGeoUri = exports.getCurrentPosition = exports.genericPositionFromGeolocation = exports.GeolocationError = void 0;
var _logger = require("matrix-js-sdk/src/logger");
/*
Copyright 2024 New Vector Ltd.
Copyright 2022 The Matrix.org Foundation C.I.C
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
// map GeolocationPositionError codes
// https://developer.mozilla.org/en-US/docs/Web/API/GeolocationPositionError
let GeolocationError = exports.GeolocationError = /*#__PURE__*/function (GeolocationError) {
GeolocationError["Unavailable"] = "Unavailable";
GeolocationError["PermissionDenied"] = "PermissionDenied";
GeolocationError["PositionUnavailable"] = "PositionUnavailable";
GeolocationError["Timeout"] = "Timeout";
GeolocationError["Default"] = "Default";
return GeolocationError;
}({});
const GeolocationOptions = {
timeout: 10000,
maximumAge: 60000
};
const isGeolocationPositionError = error => typeof error === "object" && !!error["PERMISSION_DENIED"];
/**
* Maps GeolocationPositionError to our GeolocationError enum
*/
const mapGeolocationError = error => {
_logger.logger.error("Geolocation failed", error);
if (isGeolocationPositionError(error)) {
switch (error?.code) {
case error.PERMISSION_DENIED:
return GeolocationError.PermissionDenied;
case error.POSITION_UNAVAILABLE:
return GeolocationError.PositionUnavailable;
case error.TIMEOUT:
return GeolocationError.Timeout;
default:
return GeolocationError.Default;
}
} else if (error instanceof Error && error.message === GeolocationError.Unavailable) {
return GeolocationError.Unavailable;
} else {
return GeolocationError.Default;
}
};
exports.mapGeolocationError = mapGeolocationError;
const getGeolocation = () => {
if (!navigator.geolocation) {
throw new Error(GeolocationError.Unavailable);
}
return navigator.geolocation;
};
const genericPositionFromGeolocation = geoPosition => {
const {
latitude,
longitude,
altitude,
accuracy
} = geoPosition.coords;
return {
// safari reports geolocation timestamps as Apple Cocoa Core Data timestamp
// or ms since 1/1/2001 instead of the regular epoch
// they also use local time, not utc
// to simplify, just use Date.now()
timestamp: Date.now(),
latitude,
longitude,
altitude: altitude ?? undefined,
accuracy
};
};
exports.genericPositionFromGeolocation = genericPositionFromGeolocation;
const getGeoUri = position => {
const lat = position.latitude;
const lon = position.longitude;
const alt = Number.isFinite(position.altitude) ? `,${position.altitude}` : "";
const acc = Number.isFinite(position.accuracy) ? `;u=${position.accuracy}` : "";
return `geo:${lat},${lon}${alt}${acc}`;
};
exports.getGeoUri = getGeoUri;
const mapGeolocationPositionToTimedGeo = position => {
const genericPosition = genericPositionFromGeolocation(position);
return {
timestamp: genericPosition.timestamp,
geoUri: getGeoUri(genericPosition)
};
};
/**
* Gets current position, returns a promise
* @returns Promise<GeolocationPosition>
*/
exports.mapGeolocationPositionToTimedGeo = mapGeolocationPositionToTimedGeo;
const getCurrentPosition = async () => {
try {
const position = await new Promise((resolve, reject) => {
getGeolocation().getCurrentPosition(resolve, reject, GeolocationOptions);
});
return position;
} catch (error) {
throw new Error(mapGeolocationError(error));
}
};
exports.getCurrentPosition = getCurrentPosition;
const watchPosition = (onWatchPosition, onWatchPositionError) => {
try {
const onError = error => onWatchPositionError(mapGeolocationError(error));
const watchId = getGeolocation().watchPosition(onWatchPosition, onError, GeolocationOptions);
const clearWatch = () => {
getGeolocation().clearWatch(watchId);
};
return clearWatch;
} catch (error) {
throw new Error(mapGeolocationError(error));
}
};
exports.watchPosition = watchPosition;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIkdlb2xvY2F0aW9uRXJyb3IiLCJleHBvcnRzIiwiR2VvbG9jYXRpb25PcHRpb25zIiwidGltZW91dCIsIm1heGltdW1BZ2UiLCJpc0dlb2xvY2F0aW9uUG9zaXRpb25FcnJvciIsImVycm9yIiwibWFwR2VvbG9jYXRpb25FcnJvciIsImxvZ2dlciIsImNvZGUiLCJQRVJNSVNTSU9OX0RFTklFRCIsIlBlcm1pc3Npb25EZW5pZWQiLCJQT1NJVElPTl9VTkFWQUlMQUJMRSIsIlBvc2l0aW9uVW5hdmFpbGFibGUiLCJUSU1FT1VUIiwiVGltZW91dCIsIkRlZmF1bHQiLCJFcnJvciIsIm1lc3NhZ2UiLCJVbmF2YWlsYWJsZSIsImdldEdlb2xvY2F0aW9uIiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24iLCJnZW9Qb3NpdGlvbiIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJhY2N1cmFjeSIsImNvb3JkcyIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJ1bmRlZmluZWQiLCJnZXRHZW9VcmkiLCJwb3NpdGlvbiIsImxhdCIsImxvbiIsImFsdCIsIk51bWJlciIsImlzRmluaXRlIiwiYWNjIiwibWFwR2VvbG9jYXRpb25Qb3NpdGlvblRvVGltZWRHZW8iLCJnZW5lcmljUG9zaXRpb24iLCJnZW9VcmkiLCJnZXRDdXJyZW50UG9zaXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIndhdGNoUG9zaXRpb24iLCJvbldhdGNoUG9zaXRpb24iLCJvbldhdGNoUG9zaXRpb25FcnJvciIsIm9uRXJyb3IiLCJ3YXRjaElkIiwiY2xlYXJXYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9iZWFjb24vZ2VvbG9jYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQ1xuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbi8vIG1hcCBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IgY29kZXNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvblBvc2l0aW9uRXJyb3JcbmV4cG9ydCBlbnVtIEdlb2xvY2F0aW9uRXJyb3Ige1xuICAgIC8vIG5vIG5hdmlnYXRvci5nZW9sb2NhdGlvblxuICAgIFVuYXZhaWxhYmxlID0gXCJVbmF2YWlsYWJsZVwiLFxuICAgIC8vIFRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIHBhZ2UgZGlkbid0IGhhdmUgdGhlIHBlcm1pc3Npb24gdG8gZG8gaXQuXG4gICAgUGVybWlzc2lvbkRlbmllZCA9IFwiUGVybWlzc2lvbkRlbmllZFwiLFxuICAgIC8vIFRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgZ2VvbG9jYXRpb24gZmFpbGVkIGJlY2F1c2UgYXQgbGVhc3Qgb25lIGludGVybmFsIHNvdXJjZSBvZiBwb3NpdGlvbiByZXR1cm5lZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAgICBQb3NpdGlvblVuYXZhaWxhYmxlID0gXCJQb3NpdGlvblVuYXZhaWxhYmxlXCIsXG4gICAgLy8gVGhlIHRpbWUgYWxsb3dlZCB0byBhY3F1aXJlIHRoZSBnZW9sb2NhdGlvbiB3YXMgcmVhY2hlZCBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIHdhcyBvYnRhaW5lZC5cbiAgICBUaW1lb3V0ID0gXCJUaW1lb3V0XCIsXG4gICAgLy8gb3RoZXIgdW5leHBlY3RlZCBmYWlsdXJlXG4gICAgRGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxufVxuXG5jb25zdCBHZW9sb2NhdGlvbk9wdGlvbnMgPSB7XG4gICAgdGltZW91dDogMTAwMDAsXG4gICAgbWF4aW11bUFnZTogNjAwMDAsXG59O1xuXG5jb25zdCBpc0dlb2xvY2F0aW9uUG9zaXRpb25FcnJvciA9IChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvciA9PlxuICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAhIShlcnJvciBhcyBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpW1wiUEVSTUlTU0lPTl9ERU5JRURcIl07XG4vKipcbiAqIE1hcHMgR2VvbG9jYXRpb25Qb3NpdGlvbkVycm9yIHRvIG91ciBHZW9sb2NhdGlvbkVycm9yIGVudW1cbiAqL1xuZXhwb3J0IGNvbnN0IG1hcEdlb2xvY2F0aW9uRXJyb3IgPSAoZXJyb3I6IEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvciB8IEVycm9yIHwgdW5rbm93bik6IEdlb2xvY2F0aW9uRXJyb3IgPT4ge1xuICAgIGxvZ2dlci5lcnJvcihcIkdlb2xvY2F0aW9uIGZhaWxlZFwiLCBlcnJvcik7XG5cbiAgICBpZiAoaXNHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHN3aXRjaCAoZXJyb3I/LmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuUEVSTUlTU0lPTl9ERU5JRUQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuUGVybWlzc2lvbkRlbmllZDtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuUE9TSVRJT05fVU5BVkFJTEFCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuUG9zaXRpb25VbmF2YWlsYWJsZTtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuVElNRU9VVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gR2VvbG9jYXRpb25FcnJvci5UaW1lb3V0O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gR2VvbG9jYXRpb25FcnJvci5EZWZhdWx0O1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09IEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuRGVmYXVsdDtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRHZW9sb2NhdGlvbiA9ICgpOiBHZW9sb2NhdGlvbiA9PiB7XG4gICAgaWYgKCFuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJpY1Bvc2l0aW9uID0ge1xuICAgIGxhdGl0dWRlOiBudW1iZXI7XG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XG4gICAgYWx0aXR1ZGU/OiBudW1iZXI7XG4gICAgYWNjdXJhY3k/OiBudW1iZXI7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBUaW1lZEdlb1VyaSA9IHtcbiAgICBnZW9Vcmk6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24gPSAoZ2VvUG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiBHZW5lcmljUG9zaXRpb24gPT4ge1xuICAgIGNvbnN0IHsgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGUsIGFjY3VyYWN5IH0gPSBnZW9Qb3NpdGlvbi5jb29yZHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBzYWZhcmkgcmVwb3J0cyBnZW9sb2NhdGlvbiB0aW1lc3RhbXBzIGFzIEFwcGxlIENvY29hIENvcmUgRGF0YSB0aW1lc3RhbXBcbiAgICAgICAgLy8gb3IgbXMgc2luY2UgMS8xLzIwMDEgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBlcG9jaFxuICAgICAgICAvLyB0aGV5IGFsc28gdXNlIGxvY2FsIHRpbWUsIG5vdCB1dGNcbiAgICAgICAgLy8gdG8gc2ltcGxpZnksIGp1c3QgdXNlIERhdGUubm93KClcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICBhbHRpdHVkZTogYWx0aXR1ZGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhY2N1cmFjeSxcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdlb1VyaSA9IChwb3NpdGlvbjogR2VuZXJpY1Bvc2l0aW9uKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBsYXQgPSBwb3NpdGlvbi5sYXRpdHVkZTtcbiAgICBjb25zdCBsb24gPSBwb3NpdGlvbi5sb25naXR1ZGU7XG4gICAgY29uc3QgYWx0ID0gTnVtYmVyLmlzRmluaXRlKHBvc2l0aW9uLmFsdGl0dWRlKSA/IGAsJHtwb3NpdGlvbi5hbHRpdHVkZX1gIDogXCJcIjtcbiAgICBjb25zdCBhY2MgPSBOdW1iZXIuaXNGaW5pdGUocG9zaXRpb24uYWNjdXJhY3kpID8gYDt1PSR7cG9zaXRpb24uYWNjdXJhY3l9YCA6IFwiXCI7XG4gICAgcmV0dXJuIGBnZW86JHtsYXR9LCR7bG9ufSR7YWx0fSR7YWNjfWA7XG59O1xuXG5leHBvcnQgY29uc3QgbWFwR2VvbG9jYXRpb25Qb3NpdGlvblRvVGltZWRHZW8gPSAocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiBUaW1lZEdlb1VyaSA9PiB7XG4gICAgY29uc3QgZ2VuZXJpY1Bvc2l0aW9uID0gZ2VuZXJpY1Bvc2l0aW9uRnJvbUdlb2xvY2F0aW9uKHBvc2l0aW9uKTtcbiAgICByZXR1cm4geyB0aW1lc3RhbXA6IGdlbmVyaWNQb3NpdGlvbi50aW1lc3RhbXAsIGdlb1VyaTogZ2V0R2VvVXJpKGdlbmVyaWNQb3NpdGlvbikgfTtcbn07XG5cbi8qKlxuICogR2V0cyBjdXJyZW50IHBvc2l0aW9uLCByZXR1cm5zIGEgcHJvbWlzZVxuICogQHJldHVybnMgUHJvbWlzZTxHZW9sb2NhdGlvblBvc2l0aW9uPlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBvc2l0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8R2VvbG9jYXRpb25Qb3NpdGlvbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IFBvc2l0aW9uQ2FsbGJhY2ssIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZ2V0R2VvbG9jYXRpb24oKS5nZXRDdXJyZW50UG9zaXRpb24ocmVzb2x2ZSwgcmVqZWN0LCBHZW9sb2NhdGlvbk9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtYXBHZW9sb2NhdGlvbkVycm9yKGVycm9yKSk7XG4gICAgfVxufTtcblxuZXhwb3J0IHR5cGUgQ2xlYXJXYXRjaENhbGxiYWNrID0gKCkgPT4gdm9pZDtcbmV4cG9ydCBjb25zdCB3YXRjaFBvc2l0aW9uID0gKFxuICAgIG9uV2F0Y2hQb3NpdGlvbjogUG9zaXRpb25DYWxsYmFjayxcbiAgICBvbldhdGNoUG9zaXRpb25FcnJvcjogKGVycm9yOiBHZW9sb2NhdGlvbkVycm9yKSA9PiB2b2lkLFxuKTogQ2xlYXJXYXRjaENhbGxiYWNrID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpOiB2b2lkID0+IG9uV2F0Y2hQb3NpdGlvbkVycm9yKG1hcEdlb2xvY2F0aW9uRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgY29uc3Qgd2F0Y2hJZCA9IGdldEdlb2xvY2F0aW9uKCkud2F0Y2hQb3NpdGlvbihvbldhdGNoUG9zaXRpb24sIG9uRXJyb3IsIEdlb2xvY2F0aW9uT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNsZWFyV2F0Y2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBnZXRHZW9sb2NhdGlvbigpLmNsZWFyV2F0Y2god2F0Y2hJZCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbGVhcldhdGNoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtYXBHZW9sb2NhdGlvbkVycm9yKGVycm9yKSk7XG4gICAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUEsSUFDWUMsZ0JBQWdCLEdBQUFDLE9BQUEsQ0FBQUQsZ0JBQUEsMEJBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQUEsT0FBaEJBLGdCQUFnQjtBQUFBO0FBYTVCLE1BQU1FLGtCQUFrQixHQUFHO0VBQ3ZCQyxPQUFPLEVBQUUsS0FBSztFQUNkQyxVQUFVLEVBQUU7QUFDaEIsQ0FBQztBQUVELE1BQU1DLDBCQUEwQixHQUFJQyxLQUFjLElBQzlDLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFFQSxLQUFLLENBQThCLG1CQUFtQixDQUFDO0FBQzNGO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLG1CQUFtQixHQUFJRCxLQUFpRCxJQUF1QjtF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