"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
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 _es6Error() {
const data = _interopRequireDefault(require("es6-error"));
_es6Error = function () {
return data;
};
return data;
}
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _isString() {
const data = _interopRequireDefault(require("lodash/isString"));
_isString = function () {
return data;
};
return data;
}
function _FsCache() {
const data = require("./tools/FsCache");
_FsCache = function () {
return data;
};
return data;
}
function _Config() {
const data = _interopRequireDefault(require("./Config"));
_Config = 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 _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; 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 MAX_CONTENT_LENGTH = 100
/* MB */
* 1024 * 1024;
const TIMER_DURATION = 30000;
const TIMEOUT = 3600000;
let exponentClient = 'xdl';
class ApiError extends _es6Error().default {
constructor(code, message) {
super(message);
_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'];
let headers = {
'Exp-ClientId': clientId,
'Exponent-Client': exponentClient
};
if (skipValidationToken) {
headers['Exp-Skip-Manifest-Validation-Token'] = skipValidationToken;
}
if (session) {
headers['Expo-Session'] = session.sessionSecret;
}
let options = {
url,
method,
headers,
maxContentLength: MAX_CONTENT_LENGTH
};
if (requestBody) {
options = { ...options,
data: requestBody
};
}
if (requestOptions) {
if (requestOptions.formData) {
let convertedFormData = await _convertFormDataToBuffer(requestOptions.formData);
let {
data
} = convertedFormData;
options.headers = { ...options.headers,
...requestOptions.formData.getHeaders()
};
options = { ...options,
data
};
} else {
options = { ...options,
...requestOptions
};
}
}
let response = await _axios().default.request(options);
if (!response) {
throw new Error('Unexpected error: Request failed.');
}
let responseBody = response.data;
var responseObj;
if ((0, _isString().default)(responseBody)) {
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) {
let 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;
let {
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
};
let response = await (0, _axios().default)(url, config);
await new Promise(resolve => {
let 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);
}
class ApiClient {
static setClientName(name) {
exponentClient = name;
}
static async callMethodAsync(methodName, args, method, requestBody, requestOptions = {}, returnEntireResponse = false) {
let url = _apiBaseUrl() + '/' + encodeURIComponent(methodName) + '/' + encodeURIComponent(JSON.stringify(args));
return _callMethodAsync(url, method, requestBody, requestOptions, returnEntireResponse);
}
static async callPathAsync(path, method, requestBody, requestOptions = {}) {
let url = _rootBaseUrl() + path;
return _callMethodAsync(url, method, requestBody, requestOptions);
}
static async xdlSchemaAsync(sdkVersion) {
if (!ApiClient._schemaCaches.hasOwnProperty(sdkVersion)) {
ApiClient._schemaCaches[sdkVersion] = new (_FsCache().Cacher)(async () => {
return await ApiClient.callPathAsync(`/--/xdl-schema/${sdkVersion}`);
}, `schema-${sdkVersion}.json`, 0, _path().default.join(__dirname, `../caches/schema-${sdkVersion}.json`));
}
return await ApiClient._schemaCaches[sdkVersion].getAsync();
}
static async downloadAsync(url, outputPath, {
extract = false
} = {}, progressFunction, retryFunction) {
if (extract) {
let dotExpoHomeDirectory = _UserSettings().default.dotExpoHomeDirectory();
let tmpPath = _path().default.join(dotExpoHomeDirectory, 'tmp-download-file');
await _downloadAsync(url, tmpPath);
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);
_defineProperty(ApiClient, "_schemaCaches", {});
//# sourceMappingURL=__sourcemaps__/Api.js.map