{
  "version": 3,
  "sources": ["../src/osm-auth.mjs"],
  "sourcesContent": [
    "\n/**\n * osmAuth\n * Easy authentication with OpenStreetMap over OAuth 2.0.\n * @module\n *\n * @param    o   `Object` containing options:\n * @param    o.scope          OAuth2 scopes requested (e.g. \"read_prefs write_api\")\n * @param    o.client_id      OAuth2 client ID\n * @param    o.redirect_uri   OAuth2 redirect URI (e.g. \"http://127.0.0.1:8080/land.html\")\n * @param    o.access_token   Can pre-authorize with an OAuth2 bearer token if you have one\n * @param    o.apiUrl         A base url for the OSM API (default: \"https://api.openstreetmap.org\")\n * @param    o.url            A base url for the OAuth2 handshake (default: \"https://www.openstreetmap.org\")\n * @param    o.auto           If `true`, attempt to authenticate automatically when calling `.xhr()` or `.fetch()` (default: `false`)\n * @param    o.singlepage     If `true`, use page redirection instead of a popup (default: `false`)\n * @param    o.loading        Function called when auth-related xhr calls start\n * @param    o.done           Function called when auth-related xhr calls end\n * @param    o.locale         The locale to use on the OAuth2 authentication page. Optional.\n * @return  `self`\n */\nexport function osmAuth(o) {\n  var oauth = {};\n\n  var CHANNEL_ID = 'osm-api-auth-complete';\n\n  // Mock localStorage if needed.\n  // Note that accessing localStorage may throw a `SecurityError`, so wrap in a try/catch.\n  var _store = null;\n  try {\n    if (!('localStorage' in globalThis)) {\n      throw new Error('No localStorage');\n    }\n    _store = globalThis.localStorage;\n\n  } catch (e) {\n    var _mock = new Map();\n    _store = {\n      isMocked: true,\n      hasItem: (k) => _mock.has(k),\n      getItem: (k) => _mock.get(k),\n      setItem: (k, v) => _mock.set(k, v),\n      removeItem: (k) => _mock.delete(k),\n      clear: () => _mock.clear()\n    };\n  }\n\n  /**\n   * token\n   * Get/Set tokens. These are prefixed with the base URL so that `osm-auth`\n   * can be used with multiple APIs and the keys in `localStorage` will not clash\n   * @param  {string}   k  key\n   * @param  {string?}  v  value\n   * @return {string?}  If getting, returns the stored value or `null`.  If setting, returns `undefined`.\n   */\n  function token(k, v) {\n    var key = o.url + k;\n    if (arguments.length === 1) {\n      var val = _store.getItem(key) || '';\n      // Note: legacy tokens might be wrapped in double quotes - remove them, see #129\n      return val.replace(/\"/g, '');\n\n    } else if (arguments.length === 2) {\n      if (v) {\n        return _store.setItem(key, v);\n      } else {\n        return _store.removeItem(key);\n      }\n    }\n  }\n\n\n  /**\n   * authenticated\n   * Test whether the user is currently authenticated\n   *\n   * @return {boolean} `true` if authenticated, `false` if not\n   */\n  oauth.authenticated = function() {\n    return !!token('oauth2_access_token');\n  };\n\n\n  /**\n   * getAccessToken\n   * Return the current stored access token, if any\n   *\n   * @return {string} The access token, or '' if user is not authenticated.\n   */\n  oauth.getAccessToken = function() {\n    return token('oauth2_access_token');\n  };\n\n\n  /**\n   * logout\n   * Removes any stored authentication tokens (legacy OAuth1 tokens too)\n   *\n   * @return  `self`\n   */\n  oauth.logout = function () {\n    token('oauth2_access_token', '');         // OAuth2\n    token('oauth_token', '');                 // OAuth1\n    token('oauth_token_secret', '');          // OAuth1\n    token('oauth_request_token_secret', '');  // OAuth1\n    return oauth;\n  };\n\n\n  /**\n   * authenticate\n   * First logs out, then runs the authentiation flow, finally calls the callback.\n   * TODO: detect lack of click event  (probably can settimeout it)\n   *\n   * @param   {function}  callback  Errback-style callback `(err, result)`, called when complete\n   * @param   {LoginOptions}  [options]  Other options\n   * @return  none\n   */\n  oauth.authenticate = function(callback, options) {\n    if (oauth.authenticated()) {\n      callback(null, oauth);\n      return;\n    }\n\n    oauth.logout();\n\n    _preopenPopup(function(error, popup) {\n      if (error) {\n        callback(error);\n      } else {\n        _generatePkceChallenge(function(pkce) {\n          _authenticate(pkce, options, popup, callback);\n        });\n      }\n    });\n  };\n\n\n  /**\n   * authenticateAsync\n   * Promisified version of `authenticate`\n   * @param {LoginOptions} [options]\n   * @return  {Promise}  Promise settled with whatever `_authenticate` did\n   */\n  oauth.authenticateAsync = function(options) {\n    if (oauth.authenticated()) {\n      return Promise.resolve(oauth);\n    }\n\n    oauth.logout();\n\n    return new Promise((resolve, reject) => {\n      var errback = (err, result) => {\n        if (err) {\n          reject(err);\n        } else {\n          resolve(result);\n        }\n      };\n\n      _preopenPopup((error, popup) => {\n        if (error) {\n          errback(error);\n        } else {\n          _generatePkceChallenge(pkce => _authenticate(pkce, options, popup, errback));\n        }\n      });\n    });\n  };\n\n\n  /**\n   * opens an empty popup to be later used for the authentication page\n   * @param   {function}  callback  Errback-style callback `(err, result)`, called when complete\n   * @return  none\n   */\n  function _preopenPopup(callback) {\n    if (o.singlepage) {\n      callback(null, undefined);\n      return;\n    }\n\n    // Create a 550x610 popup window in the center of the screen\n    var w = 550;\n    var h = 610;\n    var settings = [\n        ['width', w],\n        ['height', h],\n        ['left', window.screen.width / 2 - w / 2],\n        ['top', window.screen.height / 2 - h / 2],\n      ]\n      .map(function (x) { return x.join('='); })\n      .join(',');\n    var popup = window.open('about:blank', 'oauth_window', settings);\n    if (popup) {\n      callback(null, popup);\n    } else {\n      var error = new Error('Popup was blocked');\n      error.status = 'popup-blocked';\n      callback(error);\n    }\n  }\n\n\n  /**\n   * _authenticate\n   * internal authenticate\n   *\n   * @typedef {{ switchUser?: boolean }} LoginOptions\n   *\n   * @param  {Object}    pkce      Object containing PKCE code challenge properties\n   * @param  {LoginOptions=}   options   Other options\n   * @param  {Window}    popup     Popup Window to use for the authentication page, should be undefined when using singlepage mode\n   * @param  {function}  callback  Errback-style callback that accepts `(err, result)`\n   */\n  function _authenticate(pkce, options, popup, callback) {\n    var state = generateState();\n\n    // ## Request authorization to access resources from the user\n    // and receive authorization code\n    var path =\n      '/oauth2/authorize?' +\n      utilQsString({\n        client_id: o.client_id,\n        redirect_uri: o.redirect_uri,\n        response_type: 'code',\n        scope: o.scope,\n        state: state,\n        code_challenge: pkce.code_challenge,\n        code_challenge_method: pkce.code_challenge_method,\n        locale: o.locale || '',\n      });\n\n    var url = options?.switchUser\n      ? `${o.url}/logout?referer=${encodeURIComponent(`/login?referer=${encodeURIComponent(path)}`)}`\n      : o.url + path;\n\n    if (o.singlepage) {\n      if (_store.isMocked) {\n        // in singlepage mode, PKCE requires working non-volatile storage\n        var error = new Error('localStorage unavailable, but required in singlepage mode');\n        error.status = 'pkce-localstorage-unavailable';\n        callback(error);\n        return;\n      }\n      var params = utilStringQs(window.location.search.slice(1));\n      if (params.code) {\n        oauth.bootstrapToken(params.code, callback);\n      } else {\n        // save OAuth2 state and PKCE challenge in local storage, for later use\n        // in the `/oauth/token` request\n        token('oauth2_state', state);\n        token('oauth2_pkce_code_verifier', pkce.code_verifier);\n        window.location = url;\n      }\n    } else {\n      oauth.popupWindow = popup;\n      popup.location = url;\n    }\n\n    // Called by a function in the redirect URL page, in the popup window. The\n    // window closes itself.\n    var bc = new BroadcastChannel(CHANNEL_ID);\n    bc.addEventListener('message', (event) => {\n      var url = event.data;\n      var params = utilStringQs(url.split('?')[1]);\n      if (params.state !== state) {\n        var error = new Error('Invalid state');\n        error.status = 'invalid-state';\n        callback(error);\n        return;\n      } else if (params.error !== undefined) {\n        var err = new Error(params.error_description.replace(/\\+/g, ' '));\n        err.status = params.error;\n        callback(err);\n        return;\n      }\n      _requestAccessToken(params.code, pkce.code_verifier, accessTokenDone);\n      bc.close();\n    });\n\n    function accessTokenDone(err, xhr) {\n      o.done();\n      if (err) {\n        callback(err);\n        return;\n      }\n      var access_token = JSON.parse(xhr.response);\n      token('oauth2_access_token', access_token.access_token);\n      callback(null, oauth);\n    }\n  }\n\n\n  /**\n   * _requestAccessToken\n   * The client requests an access token by authenticating with the\n   * authorization server and presenting the `auth_code`, brought\n   * in from a function call on a landing page popup.\n   * @param  {string}    auth_code\n   * @param  {string}    code_verifier\n   * @param  {function}  accessTokenDone  Errback-style callback `(err, result)`, called when complete\n   */\n  function _requestAccessToken(auth_code, code_verifier, accessTokenDone) {\n    var url =\n      o.url +\n      '/oauth2/token?' +\n      utilQsString({\n        client_id: o.client_id,\n        redirect_uri: o.redirect_uri,\n        grant_type: 'authorization_code',\n        code: auth_code,\n        code_verifier: code_verifier\n      });\n\n    // The authorization server authenticates the client and validates\n    // the authorization grant, and if valid, issues an access token.\n    oauth.rawxhr('POST', url, null, null, null, accessTokenDone);\n    o.loading();\n  }\n\n\n  /**\n   * bringPopupWindowToFront\n   * Tries to bring an existing authentication popup to the front.\n   *\n   * @return {boolean} `true` if it succeeded, `false` if not\n   */\n  oauth.bringPopupWindowToFront = function() {\n    var broughtPopupToFront = false;\n    try {\n      // This may cause a cross-origin error:\n      // `DOMException: Blocked a frame with origin \"...\" from accessing a cross-origin frame.`\n      if (oauth.popupWindow && !oauth.popupWindow.closed) {\n        oauth.popupWindow.focus();\n        broughtPopupToFront = true;\n      }\n    } catch (err) {\n      // Bringing popup window to front failed (probably because of the cross-origin error mentioned above)\n    }\n    return broughtPopupToFront;\n  };\n\n\n  /**\n   * bootstrapToken\n   * The authorization code is a temporary code that a client can exchange for an access token.\n   * If using this library in single-page mode, you'll need to call this once your application\n   * has an `auth_code` and wants to get an access_token.\n   *\n   * @param   {string}   auth_code  The OAuth2 `auth_code`\n   * @param   {function} callback   Errback-style callback `(err, result)`, called when complete\n   * @return  none\n   */\n  oauth.bootstrapToken = function(auth_code, callback) {\n    var state = token('oauth2_state');\n    token('oauth2_state', '');\n    var params = utilStringQs(window.location.search.slice(1));\n    if (params.state !== state) {\n      var error = new Error('Invalid state');\n      error.status = 'invalid-state';\n      callback(error);\n      return;\n    }\n    var code_verifier = token('oauth2_pkce_code_verifier');\n    token('oauth2_pkce_code_verifier', '');\n    _requestAccessToken(auth_code, code_verifier, accessTokenDone);\n\n    function accessTokenDone(err, xhr) {\n      o.done();\n      if (err) {\n        callback(err);\n        return;\n      }\n      var access_token = JSON.parse(xhr.response);\n      token('oauth2_access_token', access_token.access_token);\n      callback(null, oauth);\n    }\n  };\n\n\n  /**\n   * fetch\n   * A `fetch` wrapper that includes the Authorization header if the user is authenticated.\n   * https://developer.mozilla.org/en-US/docs/Web/API/fetch\n   *\n   * @param  {string}   resource    Resource passed to `fetch`\n   * @param  {Object}   options     Options passed to `fetch`\n   * @return {Promise}  Promise that wraps `authenticateAsync` then `fetch`\n   */\n  oauth.fetch = function(resource, options) {\n    if (oauth.authenticated()) {\n      return _doFetch();\n    } else {\n      if (o.auto) {\n        return oauth.authenticateAsync().then(_doFetch);\n      } else {\n        return Promise.reject(new Error('not authenticated'));\n      }\n    }\n\n    function _doFetch() {\n      options = options || {};\n      if (!options.headers) {\n        options.headers = { 'Content-Type': 'application/x-www-form-urlencoded' };\n      }\n      options.headers.Authorization = 'Bearer ' + token('oauth2_access_token');\n      return fetch(resource, options);\n    }\n  };\n\n\n  /**\n   * xhr\n   * A `XMLHttpRequest` wrapper that does authenticated calls if the user has logged in.\n   * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n   *\n   * @param   {Object} options\n   * @param    options.method   Passed to `xhr.open`  (e.g. 'GET', 'POST')\n   * @param    options.prefix   If `true` path contains a path, if `false` path contains the full url\n   * @param    options.path     The URL path (e.g. \"/api/0.6/user/details\") (or full url, if `prefix`=`false`)\n   * @param    options.content  Passed to `xhr.send`\n   * @param    options.headers  `Object` containing request headers\n   * @param   {function}         callback  Errback-style callback `(err, result)`, called when complete\n   * @return  {XMLHttpRequest}  `XMLHttpRequest` if authenticated, otherwise `null`\n   */\n  oauth.xhr = function (options, callback) {\n    if (oauth.authenticated()) {\n      return _doXHR();\n    } else {\n      if (o.auto) {\n        oauth.authenticate(_doXHR);\n        return;\n      } else {\n        callback('not authenticated', null);\n        return;\n      }\n    }\n\n    function _doXHR() {\n      var url = options.prefix !== false ? (o.apiUrl + options.path) : options.path;\n      return oauth.rawxhr(\n        options.method,\n        url,\n        token('oauth2_access_token'),\n        options.content,\n        options.headers,\n        done\n      );\n    }\n\n    function done(err, xhr) {\n      if (err) {\n        callback(err);\n      } else if (xhr.responseXML) {\n        callback(err, xhr.responseXML);\n      } else {\n        callback(err, xhr.response);\n      }\n    }\n  };\n\n\n  /**\n   * rawxhr\n   * Creates the XMLHttpRequest set up with a header and response handling\n   * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n   *\n   * @param    method         Passed to `xhr.open`  (e.g. 'GET', 'POST')\n   * @param    url            Passed to `xhr.open`\n   * @param    access_token   OAuth2 bearer token\n   * @param    data           Passed to `xhr.send`\n   * @param    headers        `Object` containing request headers\n   * @param    callback       An \"errback\"-style callback (`err`, `result`), called when complete\n   * @return  `XMLHttpRequest`\n   */\n  oauth.rawxhr = function(method, url, access_token, data, headers, callback) {\n    headers = headers || { 'Content-Type': 'application/x-www-form-urlencoded' };\n\n    if (access_token) {\n      headers.Authorization = 'Bearer ' + access_token;\n    }\n\n    var xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = function () {\n      if (4 === xhr.readyState && 0 !== xhr.status) {\n        if (/^20\\d$/.test(xhr.status)) {   // a 20x status code - OK\n          callback(null, xhr);\n        } else {\n          callback(xhr, null);\n        }\n      }\n    };\n    xhr.onerror = function (e) {\n      callback(e, null);\n    };\n\n    xhr.open(method, url, true);\n    for (var h in headers) xhr.setRequestHeader(h, headers[h]);\n\n    xhr.send(data);\n    return xhr;\n  };\n\n\n  /**\n   * preauth\n   * Pre-authorize this object, if we already have access token from the start\n   *\n   * @param   {Object}  val  Object containing `access_token` property\n   * @return  `self`\n   */\n  oauth.preauth = function(val) {\n    if (val && val.access_token) {\n      token('oauth2_access_token', val.access_token);\n    }\n    return oauth;\n  };\n\n\n  /**\n   * options  (getter / setter)\n   * If passed with no arguments, just return the options\n   * If passed an Object, set the options then attempt to pre-authorize\n   *\n   * @param   val?   Object containing options\n   * @return  current `options` (if getting), or `self` (if setting)\n   */\n  oauth.options = function(val) {\n    if (!arguments.length) return o;\n\n    o = val;\n    o.apiUrl = o.apiUrl || 'https://api.openstreetmap.org';\n    o.url = o.url || 'https://www.openstreetmap.org';\n    o.auto = o.auto || false;\n    o.singlepage = o.singlepage || false;\n\n    // Optional loading and loading-done functions for nice UI feedback.\n    // by default, no-ops\n    o.loading = o.loading || function () {};\n    o.done = o.done || function () {};\n    return oauth.preauth(o);\n  };\n\n\n  // Everything below here is initialization/setup code\n  // Handle options and attempt to pre-authorize\n  oauth.options(o);\n\n  return oauth;\n}\n\n\n/**\n * utilQsString\n * Transforms object of `key=value` pairs into query string\n * @param   {Object}  Object of `key=value` pairs\n * @returns {string}  query string\n */\nfunction utilQsString(obj) {\n  return Object.keys(obj)\n    .filter(function(key) {\n      return obj[key] !== undefined;\n    })\n    .sort()\n    .map(function(key) {\n      return (encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));\n    })\n    .join('&');\n}\n\n/**\n * utilStringQs\n * Transforms query string into object of `key=value` pairs\n * @param   {string}  query string\n * @returns {Object}  Object of `key=value` pairs\n */\nfunction utilStringQs(str) {\n  var i = 0; // advance past any leading '?' or '#' characters\n  while (i < str.length && (str[i] === '?' || str[i] === '#')) i++;\n  str = str.slice(i);\n\n  return str.split('&').reduce(function(obj, pair) {\n    var parts = pair.split('=');\n    if (parts.length === 2) {\n      obj[parts[0]] = decodeURIComponent(parts[1]);\n    }\n    return obj;\n  }, {});\n}\n\n\n/**\n * Generates a challenge/verifier pair for PKCE.\n * If the browser does not support the WebCryptoAPI, the \"plain\" method is\n * used as a fallback instead of a SHA-256 hash.\n * @param {callback} callback called with the result of the generated PKCE challenge\n */\nfunction _generatePkceChallenge(callback) {\n  var code_verifier;\n  // generate a random code_verifier\n  // https://datatracker.ietf.org/doc/html/rfc7636#section-7.1\n  var random = globalThis.crypto.getRandomValues(new Uint8Array(32));\n  code_verifier = base64(random.buffer);\n  var verifier = Uint8Array.from(Array.from(code_verifier).map(function(char) {\n    return char.charCodeAt(0);\n  }));\n\n  // generate challenge for code verifier\n  globalThis.crypto.subtle.digest('SHA-256', verifier).then(function(hash) {\n    var code_challenge = base64(hash);\n\n    callback({\n      code_challenge: code_challenge,\n      code_verifier: code_verifier,\n      code_challenge_method: 'S256'\n    });\n  });\n}\n\n\n/**\n * Returns a random state to be used as the \"state\" of the OAuth2 authentication\n * See https://datatracker.ietf.org/doc/html/rfc6749#section-10.12\n */\nfunction generateState() {\n  var state;\n  var random = globalThis.crypto.getRandomValues(new Uint8Array(32));\n  state = base64(random.buffer);\n\n  return state;\n}\n\n\n/**\n * base64\n * Converts binary buffer to base64 encoded string, as used in rfc7636\n * @param    {ArrayBuffer}  buffer\n * @returns  {string}       base64 encoded\n */\nfunction base64(buffer) {\n  return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)))\n    .replace(/\\//g, '_')\n    .replace(/\\+/g, '-')\n    .replace(/[=]/g, '');\n}\n"
  ],
  "mappings": "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",
  "debugId": "14D80766C95C18C664756E2164756E21",
  "names": []
}