UNPKG

@expo/cli

Version:
172 lines (171 loc) 7.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { ApiV2Error: function() { return ApiV2Error; }, UnexpectedServerData: function() { return UnexpectedServerData; }, UnexpectedServerError: function() { return UnexpectedServerError; }, createCachedFetch: function() { return createCachedFetch; }, fetchAsync: function() { return fetchAsync; }, getResponseDataOrThrow: function() { return getResponseDataOrThrow; }, wrapFetchWithCredentials: function() { return wrapFetchWithCredentials; } }); function _path() { const data = /*#__PURE__*/ _interop_require_default(require("path")); _path = function() { return data; }; return data; } const _wrapFetchWithCache = require("./cache/wrapFetchWithCache"); const _wrapFetchWithBaseUrl = require("./wrapFetchWithBaseUrl"); const _wrapFetchWithOffline = require("./wrapFetchWithOffline"); const _wrapFetchWithProgress = require("./wrapFetchWithProgress"); const _wrapFetchWithProxy = require("./wrapFetchWithProxy"); const _wrapFetchWithUserAgent = require("./wrapFetchWithUserAgent"); const _env = require("../../utils/env"); const _errors = require("../../utils/errors"); const _fetch = require("../../utils/fetch"); const _endpoint = require("../endpoint"); const _settings = require("../settings"); const _UserSettings = require("../user/UserSettings"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class ApiV2Error extends Error { constructor(response){ super(response.message), this.name = 'ApiV2Error'; this.code = response.code; this.expoApiV2ErrorCode = response.code; this.expoApiV2ErrorDetails = response.details; this.expoApiV2ErrorServerStack = response.stack; this.expoApiV2ErrorMetadata = response.metadata; this.expoApiV2RequestId = response.requestId; } toString() { return `${super.toString()}${_env.env.EXPO_DEBUG && this.expoApiV2RequestId ? ` (Request Id: ${this.expoApiV2RequestId})` : ''}`; } } class UnexpectedServerError extends Error { constructor(...args){ super(...args), this.name = 'UnexpectedServerError'; } } class UnexpectedServerData extends Error { constructor(...args){ super(...args), this.name = 'UnexpectedServerData'; } } function getResponseDataOrThrow(json) { if (!!json && typeof json === 'object' && 'data' in json) { return json.data; } throw new UnexpectedServerData(!!json && typeof json === 'object' ? JSON.stringify(json) : 'Unknown data received from server.'); } function wrapFetchWithCredentials(fetchFunction) { return async function fetchWithCredentials(url, options = {}) { if (Array.isArray(options.headers)) { throw new Error('request headers must be in object form'); } const resolvedHeaders = options.headers ?? {}; const token = (0, _UserSettings.getAccessToken)(); if (token) { resolvedHeaders.authorization = `Bearer ${token}`; } else { var _getSession; const sessionSecret = (_getSession = (0, _UserSettings.getSession)()) == null ? void 0 : _getSession.sessionSecret; if (sessionSecret) { resolvedHeaders['expo-session'] = sessionSecret; } } try { const response = await fetchFunction(url, { ...options, headers: resolvedHeaders }); // Handle expected API errors (4xx) if (response.status >= 400 && response.status < 500) { const body = await response.text(); try { var _data_errors; const data = JSON.parse(body); if (data == null ? void 0 : (_data_errors = data.errors) == null ? void 0 : _data_errors.length) { throw new ApiV2Error(data.errors[0]); } } catch (error) { // Server returned non-json response. if (error.message.includes('in JSON at position')) { throw new UnexpectedServerError(body); } throw error; } } return response; } catch (error) { // When running `expo start`, but wifi or internet has issues if (isNetworkError(error) || // node-fetch error handling 'cause' in error && isNetworkError(error.cause) // undici error handling ) { (0, _settings.disableNetwork)(); throw new _errors.CommandError('OFFLINE', 'Network connection is unreliable. Try again with the environment variable `EXPO_OFFLINE=1` to skip network requests.'); } throw error; } }; } /** * Determine if the provided error is related to a network issue. * When this returns true, offline mode should be enabled. * - `ENOTFOUND` is thrown when the DNS lookup failed * - `EAI_AGAIN` is thrown when DNS lookup failed due to a server-side error * - `UND_ERR_CONNECT_TIMEOUT` is thrown after DNS is resolved, but server can't be reached * * @see https://nodejs.org/api/errors.html * @see https://github.com/nodejs/undici#network-address-family-autoselection */ function isNetworkError(error) { return 'code' in error && error.code && [ 'ENOTFOUND', 'EAI_AGAIN', 'UND_ERR_CONNECT_TIMEOUT' ].includes(error.code); } const fetchWithOffline = (0, _wrapFetchWithOffline.wrapFetchWithOffline)((0, _wrapFetchWithUserAgent.wrapFetchWithUserAgent)(_fetch.fetch)); const fetchWithBaseUrl = (0, _wrapFetchWithBaseUrl.wrapFetchWithBaseUrl)(fetchWithOffline, (0, _endpoint.getExpoApiBaseUrl)() + '/v2/'); const fetchWithProxy = (0, _wrapFetchWithProxy.wrapFetchWithProxy)(fetchWithBaseUrl); const fetchWithCredentials = (0, _wrapFetchWithProgress.wrapFetchWithProgress)(wrapFetchWithCredentials(fetchWithProxy)); function createCachedFetch({ fetch = fetchWithCredentials, cacheDirectory, ttl, skipCache }) { // Disable all caching in EXPO_BETA. if (skipCache || _env.env.EXPO_BETA || _env.env.EXPO_NO_CACHE) { return fetch; } const { FileSystemResponseCache } = require('./cache/FileSystemResponseCache'); return (0, _wrapFetchWithCache.wrapFetchWithCache)(fetch, new FileSystemResponseCache({ cacheDirectory: _path().default.join((0, _UserSettings.getExpoHomeDirectory)(), cacheDirectory), ttl })); } const fetchAsync = (0, _wrapFetchWithProgress.wrapFetchWithProgress)(wrapFetchWithCredentials(fetchWithProxy)); //# sourceMappingURL=client.js.map