ParseFileController.default.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. "use strict";
  2. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  3. var _ParseFileEncode = require("./ParseFileEncode");
  4. function _interopRequireDefault(obj) {
  5. return obj && obj.__esModule ? obj : {
  6. default: obj
  7. };
  8. }
  9. function ownKeys(object, enumerableOnly) {
  10. var keys = Object.keys(object);
  11. if (Object.getOwnPropertySymbols) {
  12. var symbols = Object.getOwnPropertySymbols(object);
  13. enumerableOnly && (symbols = symbols.filter(function (sym) {
  14. return Object.getOwnPropertyDescriptor(object, sym).enumerable;
  15. })), keys.push.apply(keys, symbols);
  16. }
  17. return keys;
  18. }
  19. function _objectSpread(target) {
  20. for (var i = 1; i < arguments.length; i++) {
  21. var source = null != arguments[i] ? arguments[i] : {};
  22. i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
  23. _defineProperty(target, key, source[key]);
  24. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
  25. Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
  26. });
  27. }
  28. return target;
  29. }
  30. function _defineProperty(obj, key, value) {
  31. if (key in obj) {
  32. Object.defineProperty(obj, key, {
  33. value: value,
  34. enumerable: true,
  35. configurable: true,
  36. writable: true
  37. });
  38. } else {
  39. obj[key] = value;
  40. }
  41. return obj;
  42. }
  43. let XHR = null;
  44. if (typeof XMLHttpRequest !== 'undefined') {
  45. XHR = XMLHttpRequest;
  46. }
  47. const DefaultController = {
  48. saveFile: async function (name
  49. /*: string*/
  50. , source
  51. /*: FileSource*/
  52. , options
  53. /*:: ?: FullOptions*/
  54. ) {
  55. if (source.format !== 'file') {
  56. throw new Error('saveFile can only be used with File-type sources.');
  57. }
  58. const base64Data = await new Promise((res, rej) => {
  59. // eslint-disable-next-line no-undef
  60. const reader = new FileReader();
  61. reader.onload = () => res(reader.result);
  62. reader.onerror = error => rej(error);
  63. reader.readAsDataURL(source.file);
  64. }); // we only want the data after the comma
  65. // For example: "data:application/pdf;base64,JVBERi0xLjQKJ..." we would only want "JVBERi0xLjQKJ..."
  66. const [first, second] = base64Data.split(','); // in the event there is no 'data:application/pdf;base64,' at the beginning of the base64 string
  67. // use the entire string instead
  68. const data = second ? second : first;
  69. const newSource = {
  70. format: 'base64',
  71. base64: data,
  72. type: source.type || (source.file ? source.file.type : null)
  73. };
  74. return await DefaultController.saveBase64(name, newSource, options);
  75. },
  76. saveBase64: function (name
  77. /*: string*/
  78. , source
  79. /*: FileSource*/
  80. , options
  81. /*:: ?: FullOptions*/
  82. ) {
  83. if (source.format !== 'base64') {
  84. throw new Error('saveBase64 can only be used with Base64-type sources.');
  85. }
  86. const data
  87. /*: { base64: any, _ContentType?: any, fileData: Object }*/
  88. = {
  89. base64: source.base64,
  90. fileData: {
  91. ipfs: options.ipfs,
  92. metadata: _objectSpread({}, options.metadata),
  93. tags: _objectSpread({}, options.tags)
  94. }
  95. };
  96. delete options.metadata;
  97. delete options.tags;
  98. if (source.type) {
  99. data._ContentType = source.type;
  100. }
  101. return _CoreManager.default.getRESTController().request('POST', `files/${name}`, data, options);
  102. },
  103. download: function (uri, options) {
  104. if (XHR) {
  105. return this.downloadAjax(uri, options);
  106. }
  107. return new Promise((resolve, reject) => {
  108. const client = uri.indexOf('https') === 0 ? require('https') : require('http');
  109. const req = client.get(uri, resp => {
  110. resp.setEncoding('base64');
  111. let base64 = '';
  112. resp.on('data', data => base64 += data);
  113. resp.on('end', () => {
  114. resolve({
  115. base64,
  116. contentType: resp.headers['content-type']
  117. });
  118. });
  119. });
  120. req.on('abort', () => {
  121. resolve({});
  122. });
  123. req.on('error', reject);
  124. options.requestTask(req);
  125. });
  126. },
  127. downloadAjax: function (uri, options) {
  128. return new Promise((resolve, reject) => {
  129. const xhr = new XHR();
  130. xhr.open('GET', uri, true);
  131. xhr.responseType = 'arraybuffer';
  132. xhr.onerror = function (e) {
  133. reject(e);
  134. };
  135. xhr.onreadystatechange = function () {
  136. if (xhr.readyState !== xhr.DONE) {
  137. return;
  138. }
  139. if (!this.response) {
  140. return resolve({});
  141. }
  142. const bytes = new Uint8Array(this.response);
  143. resolve({
  144. base64: (0, _ParseFileEncode.encodeBase64)(bytes),
  145. contentType: xhr.getResponseHeader('content-type')
  146. });
  147. };
  148. options.requestTask(xhr);
  149. xhr.send();
  150. });
  151. },
  152. deleteFile: function (name
  153. /*: string*/
  154. , options
  155. /*:: ?: FullOptions*/
  156. ) {
  157. const headers = {
  158. 'X-Parse-Application-ID': _CoreManager.default.get('APPLICATION_ID')
  159. };
  160. if (options.useMasterKey) {
  161. headers['X-Parse-Master-Key'] = _CoreManager.default.get('MASTER_KEY');
  162. }
  163. let url = _CoreManager.default.get('SERVER_URL');
  164. if (url[url.length - 1] !== '/') {
  165. url += '/';
  166. }
  167. url += `files/${name}`;
  168. return _CoreManager.default.getRESTController().ajax('DELETE', url, '', headers).catch(response => {
  169. // TODO: return JSON object in server
  170. if (!response || response === 'SyntaxError: Unexpected end of JSON input') {
  171. return Promise.resolve();
  172. }
  173. return _CoreManager.default.getRESTController().handleError(response);
  174. });
  175. },
  176. _setXHR(xhr
  177. /*: any*/
  178. ) {
  179. XHR = xhr;
  180. },
  181. _getXHR() {
  182. return XHR;
  183. }
  184. };
  185. module.exports = DefaultController;