RESTController.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _uuid = _interopRequireDefault(require("./uuid"));
  7. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  8. var _ParseError = _interopRequireDefault(require("./ParseError"));
  9. var _promiseUtils = require("./promiseUtils");
  10. var _Xhr = _interopRequireDefault(require("./Xhr.weapp"));
  11. var XHR = null;
  12. if (typeof XMLHttpRequest !== 'undefined') {
  13. XHR = XMLHttpRequest;
  14. }
  15. var useXDomainRequest = false;
  16. if (typeof XDomainRequest !== 'undefined' && !('withCredentials' in new XMLHttpRequest())) {
  17. useXDomainRequest = true;
  18. }
  19. function ajaxIE9(method, url, data, headers, options) {
  20. return new Promise(function (resolve, reject) {
  21. var xdr = new XDomainRequest();
  22. xdr.onload = function () {
  23. var response;
  24. try {
  25. response = JSON.parse(xdr.responseText);
  26. } catch (e) {
  27. reject(e);
  28. }
  29. if (response) {
  30. resolve({
  31. response: response
  32. });
  33. }
  34. };
  35. xdr.onerror = xdr.ontimeout = function () {
  36. var fakeResponse = {
  37. responseText: JSON.stringify({
  38. code: _ParseError.default.X_DOMAIN_REQUEST,
  39. error: "IE's XDomainRequest does not supply error info."
  40. })
  41. };
  42. reject(fakeResponse);
  43. };
  44. xdr.onprogress = function () {
  45. if (options && typeof options.progress === 'function') {
  46. options.progress(xdr.responseText);
  47. }
  48. };
  49. xdr.open(method, url);
  50. xdr.send(data);
  51. if (options && typeof options.requestTask === 'function') {
  52. options.requestTask(xdr);
  53. }
  54. });
  55. }
  56. var RESTController = {
  57. ajax: function (method, url, data, headers, options) {
  58. if (useXDomainRequest) {
  59. return ajaxIE9(method, url, data, headers, options);
  60. }
  61. var promise = (0, _promiseUtils.resolvingPromise)();
  62. var isIdempotent = _CoreManager.default.get('IDEMPOTENCY') && ['POST', 'PUT'].includes(method);
  63. var requestId = isIdempotent ? (0, _uuid.default)() : '';
  64. var attempts = 0;
  65. (function dispatch() {
  66. if (XHR == null) {
  67. throw new Error('Cannot make a request: No definition of XMLHttpRequest was found.');
  68. }
  69. var handled = false;
  70. var xhr = new XHR();
  71. xhr.onreadystatechange = function () {
  72. if (xhr.readyState !== 4 || handled || xhr._aborted) {
  73. return;
  74. }
  75. handled = true;
  76. if (xhr.status >= 200 && xhr.status < 300) {
  77. var response;
  78. try {
  79. response = JSON.parse(xhr.responseText);
  80. var availableHeaders = typeof xhr.getAllResponseHeaders === 'function' ? xhr.getAllResponseHeaders() : '';
  81. headers = {};
  82. if (typeof xhr.getResponseHeader === 'function' && (availableHeaders == null ? void 0 : availableHeaders.indexOf('access-control-expose-headers')) >= 0) {
  83. var responseHeaders = xhr.getResponseHeader('access-control-expose-headers').split(', ');
  84. responseHeaders.forEach(function (header) {
  85. if (availableHeaders.indexOf(header.toLowerCase()) >= 0) {
  86. headers[header] = xhr.getResponseHeader(header.toLowerCase());
  87. }
  88. });
  89. }
  90. } catch (e) {
  91. promise.reject(e.toString());
  92. }
  93. if (response) {
  94. promise.resolve({
  95. response: response,
  96. headers: headers,
  97. status: xhr.status,
  98. xhr: xhr
  99. });
  100. }
  101. } else if (xhr.status >= 500 || xhr.status === 0) {
  102. if (++attempts < _CoreManager.default.get('REQUEST_ATTEMPT_LIMIT')) {
  103. var delay = Math.round(Math.random() * 125 * Math.pow(2, attempts));
  104. setTimeout(dispatch, delay);
  105. } else if (xhr.status === 0) {
  106. promise.reject('Unable to connect to the Parse API');
  107. } else {
  108. promise.reject(xhr);
  109. }
  110. } else {
  111. promise.reject(xhr);
  112. }
  113. };
  114. headers = headers || {};
  115. if (typeof headers['Content-Type'] !== 'string') {
  116. headers['Content-Type'] = 'text/plain';
  117. }
  118. if (_CoreManager.default.get('IS_NODE')) {
  119. headers['User-Agent'] = 'Parse/' + _CoreManager.default.get('VERSION') + ' (NodeJS ' + process.versions.node + ')';
  120. }
  121. if (isIdempotent) {
  122. headers['X-Parse-Request-Id'] = requestId;
  123. }
  124. if (_CoreManager.default.get('SERVER_AUTH_TYPE') && _CoreManager.default.get('SERVER_AUTH_TOKEN')) {
  125. headers['Authorization'] = _CoreManager.default.get('SERVER_AUTH_TYPE') + ' ' + _CoreManager.default.get('SERVER_AUTH_TOKEN');
  126. }
  127. var customHeaders = _CoreManager.default.get('REQUEST_HEADERS');
  128. for (var key in customHeaders) {
  129. headers[key] = customHeaders[key];
  130. }
  131. if (options && typeof options.progress === 'function') {
  132. var handleProgress = function handleProgress(type, event) {
  133. if (event.lengthComputable) {
  134. options.progress(event.loaded / event.total, event.loaded, event.total, {
  135. type: type
  136. });
  137. } else {
  138. options.progress(null, null, null, {
  139. type: type
  140. });
  141. }
  142. };
  143. xhr.onprogress = function (event) {
  144. handleProgress('download', event);
  145. };
  146. if (xhr.upload) {
  147. xhr.upload.onprogress = function (event) {
  148. handleProgress('upload', event);
  149. };
  150. }
  151. }
  152. xhr.open(method, url, true);
  153. for (var h in headers) {
  154. xhr.setRequestHeader(h, headers[h]);
  155. }
  156. xhr.onabort = function () {
  157. promise.resolve({
  158. response: {
  159. results: []
  160. },
  161. status: 0,
  162. xhr: xhr
  163. });
  164. };
  165. xhr.send(data);
  166. if (options && typeof options.requestTask === 'function') {
  167. options.requestTask(xhr);
  168. }
  169. })();
  170. return promise;
  171. },
  172. request: function request(method, path, data, options) {
  173. options = options || {};
  174. var url = _CoreManager.default.get('SERVER_URL');
  175. if (url[url.length - 1] !== '/') {
  176. url += '/';
  177. }
  178. url += path;
  179. var payload = {};
  180. if (data && typeof data === 'object') {
  181. for (var k in data) {
  182. payload[k] = data[k];
  183. }
  184. }
  185. var context = options.context;
  186. if (context !== undefined) {
  187. payload._context = context;
  188. }
  189. if (method !== 'POST') {
  190. payload._method = method;
  191. method = 'POST';
  192. }
  193. payload._ApplicationId = _CoreManager.default.get('APPLICATION_ID');
  194. var jsKey = _CoreManager.default.get('JAVASCRIPT_KEY');
  195. if (jsKey) {
  196. payload._JavaScriptKey = jsKey;
  197. }
  198. payload._ClientVersion = _CoreManager.default.get('VERSION');
  199. var useMasterKey = options.useMasterKey;
  200. if (typeof useMasterKey === 'undefined') {
  201. useMasterKey = _CoreManager.default.get('USE_MASTER_KEY');
  202. }
  203. if (useMasterKey) {
  204. if (_CoreManager.default.get('MASTER_KEY')) {
  205. delete payload._JavaScriptKey;
  206. payload._MasterKey = _CoreManager.default.get('MASTER_KEY');
  207. } else {
  208. throw new Error('Cannot use the Master Key, it has not been provided.');
  209. }
  210. }
  211. if (_CoreManager.default.get('FORCE_REVOCABLE_SESSION')) {
  212. payload._RevocableSession = '1';
  213. }
  214. var installationId = options.installationId;
  215. var installationIdPromise;
  216. if (installationId && typeof installationId === 'string') {
  217. installationIdPromise = Promise.resolve(installationId);
  218. } else {
  219. var installationController = _CoreManager.default.getInstallationController();
  220. installationIdPromise = installationController.currentInstallationId();
  221. }
  222. return installationIdPromise.then(function (iid) {
  223. payload._InstallationId = iid;
  224. var userController = _CoreManager.default.getUserController();
  225. if (options && typeof options.sessionToken === 'string') {
  226. return Promise.resolve(options.sessionToken);
  227. } else if (userController) {
  228. return userController.currentUserAsync().then(function (user) {
  229. if (user) {
  230. return Promise.resolve(user.getSessionToken());
  231. }
  232. return Promise.resolve(null);
  233. });
  234. }
  235. return Promise.resolve(null);
  236. }).then(function (token) {
  237. if (token) {
  238. payload._SessionToken = token;
  239. }
  240. var payloadString = JSON.stringify(payload);
  241. return RESTController.ajax(method, url, payloadString, {}, options).then(function (_ref) {
  242. var response = _ref.response,
  243. status = _ref.status,
  244. headers = _ref.headers,
  245. xhr = _ref.xhr;
  246. if (options.returnStatus) {
  247. return Object.assign({}, response, {
  248. _status: status,
  249. _headers: headers,
  250. _xhr: xhr
  251. });
  252. } else {
  253. return response;
  254. }
  255. });
  256. }).catch(RESTController.handleError);
  257. },
  258. handleError: function handleError(response) {
  259. var error;
  260. if (response && response.responseText) {
  261. try {
  262. var errorJSON = JSON.parse(response.responseText);
  263. error = new _ParseError.default(errorJSON.code, errorJSON.error);
  264. } catch (e) {
  265. error = new _ParseError.default(_ParseError.default.INVALID_JSON, 'Received an error with invalid JSON from Parse: ' + response.responseText);
  266. }
  267. } else {
  268. var message = response.message ? response.message : response;
  269. error = new _ParseError.default(_ParseError.default.CONNECTION_FAILED, 'XMLHttpRequest failed: ' + JSON.stringify(message));
  270. }
  271. return Promise.reject(error);
  272. },
  273. _setXHR: function _setXHR(xhr) {
  274. XHR = xhr;
  275. },
  276. _getXHR: function _getXHR() {
  277. return XHR;
  278. }
  279. };
  280. module.exports = RESTController;
  281. var _default = exports.default = RESTController;