EventuallyQueue.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  3. var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
  4. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  5. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  6. var _ParseQuery = _interopRequireDefault(require("./ParseQuery"));
  7. var _Storage = _interopRequireDefault(require("./Storage"));
  8. var QUEUE_KEY = 'Parse/Eventually/Queue';
  9. var queueCache = [];
  10. var dirtyCache = true;
  11. var polling = undefined;
  12. var EventuallyQueue = {
  13. save: function (object) {
  14. var serverOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  15. return this.enqueue('save', object, serverOptions);
  16. },
  17. destroy: function (object) {
  18. var serverOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  19. return this.enqueue('destroy', object, serverOptions);
  20. },
  21. generateQueueId: function (action, object) {
  22. object._getId();
  23. var className = object.className,
  24. id = object.id,
  25. _localId = object._localId;
  26. var uniqueId = object.get('hash') || _localId;
  27. return [action, className, id, uniqueId].join('_');
  28. },
  29. enqueue: function () {
  30. var _enqueue = (0, _asyncToGenerator2.default)(function* (action, object, serverOptions) {
  31. var queueData = yield this.getQueue();
  32. var queueId = this.generateQueueId(action, object);
  33. var index = this.queueItemExists(queueData, queueId);
  34. if (index > -1) {
  35. for (var prop in queueData[index].object) {
  36. if (typeof object.get(prop) === 'undefined') {
  37. object.set(prop, queueData[index].object[prop]);
  38. }
  39. }
  40. } else {
  41. index = queueData.length;
  42. }
  43. queueData[index] = {
  44. queueId: queueId,
  45. action: action,
  46. object: object.toJSON(),
  47. serverOptions: serverOptions,
  48. id: object.id,
  49. className: object.className,
  50. hash: object.get('hash'),
  51. createdAt: new Date()
  52. };
  53. return this.setQueue(queueData);
  54. });
  55. function enqueue() {
  56. return _enqueue.apply(this, arguments);
  57. }
  58. return enqueue;
  59. }(),
  60. store: function (data) {
  61. return _Storage.default.setItemAsync(QUEUE_KEY, JSON.stringify(data));
  62. },
  63. load: function () {
  64. return _Storage.default.getItemAsync(QUEUE_KEY);
  65. },
  66. getQueue: function () {
  67. var _getQueue = (0, _asyncToGenerator2.default)(function* () {
  68. if (dirtyCache) {
  69. queueCache = JSON.parse((yield this.load()) || '[]');
  70. dirtyCache = false;
  71. }
  72. return queueCache;
  73. });
  74. function getQueue() {
  75. return _getQueue.apply(this, arguments);
  76. }
  77. return getQueue;
  78. }(),
  79. setQueue: function (queue) {
  80. queueCache = queue;
  81. return this.store(queueCache);
  82. },
  83. remove: function () {
  84. var _remove = (0, _asyncToGenerator2.default)(function* (queueId) {
  85. var queueData = yield this.getQueue();
  86. var index = this.queueItemExists(queueData, queueId);
  87. if (index > -1) {
  88. queueData.splice(index, 1);
  89. yield this.setQueue(queueData);
  90. }
  91. });
  92. function remove() {
  93. return _remove.apply(this, arguments);
  94. }
  95. return remove;
  96. }(),
  97. clear: function () {
  98. queueCache = [];
  99. return this.store([]);
  100. },
  101. queueItemExists: function (queue, queueId) {
  102. return queue.findIndex(function (data) {
  103. return data.queueId === queueId;
  104. });
  105. },
  106. length: function () {
  107. var _length = (0, _asyncToGenerator2.default)(function* () {
  108. var queueData = yield this.getQueue();
  109. return queueData.length;
  110. });
  111. function length() {
  112. return _length.apply(this, arguments);
  113. }
  114. return length;
  115. }(),
  116. sendQueue: function () {
  117. var _sendQueue = (0, _asyncToGenerator2.default)(function* () {
  118. var queue = yield this.getQueue();
  119. var queueData = (0, _toConsumableArray2.default)(queue);
  120. if (queueData.length === 0) {
  121. return false;
  122. }
  123. for (var i = 0; i < queueData.length; i += 1) {
  124. var queueObject = queueData[i];
  125. var id = queueObject.id,
  126. hash = queueObject.hash,
  127. className = queueObject.className;
  128. var ObjectType = _ParseObject.default.extend(className);
  129. if (id) {
  130. yield this.process.byId(ObjectType, queueObject);
  131. } else if (hash) {
  132. yield this.process.byHash(ObjectType, queueObject);
  133. } else {
  134. yield this.process.create(ObjectType, queueObject);
  135. }
  136. }
  137. return true;
  138. });
  139. function sendQueue() {
  140. return _sendQueue.apply(this, arguments);
  141. }
  142. return sendQueue;
  143. }(),
  144. sendQueueCallback: function () {
  145. var _sendQueueCallback = (0, _asyncToGenerator2.default)(function* (object, queueObject) {
  146. if (!object) {
  147. return this.remove(queueObject.queueId);
  148. }
  149. switch (queueObject.action) {
  150. case 'save':
  151. if (typeof object.updatedAt !== 'undefined' && object.updatedAt > new Date(queueObject.object.createdAt)) {
  152. return this.remove(queueObject.queueId);
  153. }
  154. try {
  155. yield object.save(queueObject.object, queueObject.serverOptions);
  156. yield this.remove(queueObject.queueId);
  157. } catch (e) {
  158. if (e.message !== 'XMLHttpRequest failed: "Unable to connect to the Parse API"') {
  159. yield this.remove(queueObject.queueId);
  160. }
  161. }
  162. break;
  163. case 'destroy':
  164. try {
  165. yield object.destroy(queueObject.serverOptions);
  166. yield this.remove(queueObject.queueId);
  167. } catch (e) {
  168. if (e.message !== 'XMLHttpRequest failed: "Unable to connect to the Parse API"') {
  169. yield this.remove(queueObject.queueId);
  170. }
  171. }
  172. break;
  173. }
  174. });
  175. function sendQueueCallback() {
  176. return _sendQueueCallback.apply(this, arguments);
  177. }
  178. return sendQueueCallback;
  179. }(),
  180. poll: function () {
  181. var _this = this;
  182. var ms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2000;
  183. if (polling) {
  184. return;
  185. }
  186. polling = setInterval(function () {
  187. var RESTController = _CoreManager.default.getRESTController();
  188. RESTController.request('GET', 'health').then(function (_ref) {
  189. var status = _ref.status;
  190. if (status === 'ok') {
  191. _this.stopPoll();
  192. return _this.sendQueue();
  193. }
  194. }).catch(function (e) {
  195. return e;
  196. });
  197. }, ms);
  198. },
  199. stopPoll: function () {
  200. clearInterval(polling);
  201. polling = undefined;
  202. },
  203. isPolling: function () {
  204. return !!polling;
  205. },
  206. _setPolling: function (flag) {
  207. polling = flag;
  208. },
  209. process: {
  210. create: function (ObjectType, queueObject) {
  211. var object = new ObjectType();
  212. return EventuallyQueue.sendQueueCallback(object, queueObject);
  213. },
  214. byId: function () {
  215. var _byId = (0, _asyncToGenerator2.default)(function* (ObjectType, queueObject) {
  216. var sessionToken = queueObject.serverOptions.sessionToken;
  217. var query = new _ParseQuery.default(ObjectType);
  218. query.equalTo('objectId', queueObject.id);
  219. var results = yield query.find({
  220. sessionToken: sessionToken
  221. });
  222. return EventuallyQueue.sendQueueCallback(results[0], queueObject);
  223. });
  224. function byId() {
  225. return _byId.apply(this, arguments);
  226. }
  227. return byId;
  228. }(),
  229. byHash: function () {
  230. var _byHash = (0, _asyncToGenerator2.default)(function* (ObjectType, queueObject) {
  231. var sessionToken = queueObject.serverOptions.sessionToken;
  232. var query = new _ParseQuery.default(ObjectType);
  233. query.equalTo('hash', queueObject.hash);
  234. var results = yield query.find({
  235. sessionToken: sessionToken
  236. });
  237. if (results.length > 0) {
  238. return EventuallyQueue.sendQueueCallback(results[0], queueObject);
  239. }
  240. return EventuallyQueue.process.create(ObjectType, queueObject);
  241. });
  242. function byHash() {
  243. return _byHash.apply(this, arguments);
  244. }
  245. return byHash;
  246. }()
  247. }
  248. };
  249. module.exports = EventuallyQueue;