@expo/xdl
Version:
The Expo Development Library
373 lines (282 loc) • 9.66 kB
JavaScript
;
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