UNPKG

@expo/xdl

Version:
373 lines (282 loc) 9.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _axios() { const data = _interopRequireDefault(require("axios")); _axios = function () { return data; }; return data; } function _concatStream() { const data = _interopRequireDefault(require("concat-stream")); _concatStream = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _ApiV() { const data = require("./ApiV2"); _ApiV = function () { return data; }; return data; } function _Config() { const data = _interopRequireDefault(require("./Config")); _Config = function () { return data; }; return data; } function ConnectionStatus() { const data = _interopRequireWildcard(require("./ConnectionStatus")); ConnectionStatus = function () { return data; }; return data; } function Extract() { const data = _interopRequireWildcard(require("./Extract")); Extract = function () { return data; }; return data; } function Session() { const data = _interopRequireWildcard(require("./Session")); Session = function () { return data; }; return data; } function _User() { const data = _interopRequireDefault(require("./User")); _User = function () { return data; }; return data; } function _UserSettings() { const data = _interopRequireDefault(require("./UserSettings")); _UserSettings = function () { return data; }; return data; } function _XDLError() { const data = _interopRequireDefault(require("./XDLError")); _XDLError = function () { return data; }; return data; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const TIMER_DURATION = 30000; const TIMEOUT = 3600000; let exponentClient = 'xdl'; class ApiError extends Error { constructor(code, message) { super(message); _defineProperty(this, "name", 'ApiError'); _defineProperty(this, "code", void 0); _defineProperty(this, "_isApiError", true); _defineProperty(this, "serverError", void 0); this.code = code; } } // These aren't constants because some commands switch between staging and prod function _rootBaseUrl() { return `${_Config().default.api.scheme}://${_Config().default.api.host}`; } function _apiBaseUrl() { let rootBaseUrl = _rootBaseUrl(); if (_Config().default.api.port) { rootBaseUrl += ':' + _Config().default.api.port; } return rootBaseUrl + '/--/api'; } async function _callMethodAsync(url, method = 'get', requestBody, requestOptions, returnEntireResponse = false) { const clientId = await Session().clientIdAsync(); const session = await _User().default.getSessionAsync(); const skipValidationToken = process.env['EXPO_SKIP_MANIFEST_VALIDATION_TOKEN']; const headers = { 'Exp-ClientId': clientId, 'Exponent-Client': exponentClient }; if (skipValidationToken) { headers['Exp-Skip-Manifest-Validation-Token'] = skipValidationToken; } // Handle auth method, prioritizing authorization tokens before session secrets if (session === null || session === void 0 ? void 0 : session.accessToken) { headers['Authorization'] = `Bearer ${session.accessToken}`; } else if (session === null || session === void 0 ? void 0 : session.sessionSecret) { headers['Expo-Session'] = session.sessionSecret; } let options = { url, method, headers, maxContentLength: _ApiV().MAX_CONTENT_LENGTH, maxBodyLength: _ApiV().MAX_BODY_LENGTH }; if (requestBody) { options = { ...options, data: requestBody }; } if (requestOptions.formData) { const { formData, ...rest } = requestOptions; const convertedFormData = await _convertFormDataToBuffer(formData); const { data } = convertedFormData; options.headers = { ...options.headers, ...formData.getHeaders() }; options = { ...options, data, ...rest }; } else { options = { ...options, ...requestOptions }; } if (!requestOptions.hasOwnProperty('timeout') && ConnectionStatus().isOffline()) { options.timeout = 1; } const response = await _axios().default.request(options); if (!response) { throw new Error('Unexpected error: Request failed.'); } const responseBody = response.data; let responseObj; if (typeof responseBody === 'string') { try { responseObj = JSON.parse(responseBody); } catch (e) { throw new (_XDLError().default)('INVALID_JSON', 'Invalid JSON returned from API: ' + e + '. Response body: ' + responseBody); } } else { responseObj = responseBody; } if (responseObj.err) { const err = new ApiError(responseObj.code || 'API_ERROR', 'API Response Error: ' + responseObj.err); err.serverError = responseObj.err; throw err; } else { return returnEntireResponse ? response : responseObj; } } async function _convertFormDataToBuffer(formData) { return new Promise(resolve => { formData.pipe((0, _concatStream().default)({ encoding: 'buffer' }, data => resolve({ data }))); }); } async function _downloadAsync(url, outputPath, progressFunction, retryFunction) { let promptShown = false; let currentProgress = 0; const { cancel, token } = _axios().default.CancelToken.source(); let warningTimer = setTimeout(() => { if (retryFunction) { retryFunction(cancel); } promptShown = true; }, TIMER_DURATION); const tmpPath = `${outputPath}.download`; const config = { timeout: TIMEOUT, responseType: 'stream', cancelToken: token }; const response = await (0, _axios().default)(url, config); await new Promise(resolve => { const totalDownloadSize = response.data.headers['content-length']; let downloadProgress = 0; response.data.on('data', chunk => { downloadProgress += chunk.length; const roundedProgress = Math.floor(downloadProgress / totalDownloadSize * 100); if (currentProgress !== roundedProgress) { currentProgress = roundedProgress; clearTimeout(warningTimer); if (!promptShown) { warningTimer = setTimeout(() => { if (retryFunction) { retryFunction(cancel); } promptShown = true; }, TIMER_DURATION); } if (progressFunction) { progressFunction(roundedProgress); } } }).on('end', () => { clearTimeout(warningTimer); if (progressFunction && currentProgress !== 100) { progressFunction(100); } resolve(); }).pipe(_fsExtra().default.createWriteStream(tmpPath)); }); await _fsExtra().default.rename(tmpPath, outputPath); } /** @deprecated use ApiV2, got or GraphQL depending on use case. */ class ApiClient { static setClientName(name) { exponentClient = name; } static async callMethodAsync(methodName, args, method, requestBody, requestOptions = {}, returnEntireResponse = false) { const url = _apiBaseUrl() + '/' + encodeURIComponent(methodName) + '/' + encodeURIComponent(JSON.stringify(args)); return _callMethodAsync(url, method, requestBody, requestOptions, returnEntireResponse); } static async callPathAsync(path, method, requestBody, requestOptions = {}) { const url = _rootBaseUrl() + path; return _callMethodAsync(url, method, requestBody, requestOptions); } static async downloadAsync(url, outputPath, { extract = false } = {}, progressFunction, retryFunction) { if (extract) { const dotExpoHomeDirectory = _UserSettings().default.dotExpoHomeDirectory(); const tmpPath = _path().default.join(dotExpoHomeDirectory, 'tmp-download-file'); await _downloadAsync(url, tmpPath, progressFunction); await Extract().extractAsync(tmpPath, outputPath); _fsExtra().default.removeSync(tmpPath); } else { await _downloadAsync(url, outputPath, progressFunction, retryFunction); } } } exports.default = ApiClient; _defineProperty(ApiClient, "host", _Config().default.api.host); _defineProperty(ApiClient, "port", _Config().default.api.port || 80); //# sourceMappingURL=__sourcemaps__/Api.js.map