EventuallyQueue.js 8.3 KB

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