| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 | 
							- "use strict";
 
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
 
- var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
 
- var _splice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/splice"));
 
- var _findIndex = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find-index"));
 
- var _setInterval2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-interval"));
 
- var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));
 
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
 
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));
 
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
 
- var _CoreManager = _interopRequireDefault(require("./CoreManager"));
 
- var _ParseObject = _interopRequireDefault(require("./ParseObject"));
 
- var _ParseQuery = _interopRequireDefault(require("./ParseQuery"));
 
- var _Storage = _interopRequireDefault(require("./Storage"));
 
- /**
 
-  * https://github.com/francimedia/parse-js-local-storage
 
-  *
 
-  * @flow
 
-  */
 
- /*:: import type { SaveOptions } from './ParseObject';*/
 
- /*:: import type { RequestOptions } from './RESTController';*/
 
- /*:: type QueueObject = {
 
-   queueId: string,
 
-   action: string,
 
-   object: ParseObject,
 
-   serverOptions: SaveOptions | RequestOptions,
 
-   id: string,
 
-   className: string,
 
-   hash: string,
 
-   createdAt: Date,
 
- };*/
 
- /*:: type Queue = Array<QueueObject>;*/
 
- var QUEUE_KEY = 'Parse/Eventually/Queue';
 
- var queueCache = [];
 
- var dirtyCache = true;
 
- var polling = undefined;
 
- /**
 
-  * Provides utility functions to queue objects that will be
 
-  * saved to the server at a later date.
 
-  *
 
-  * @class Parse.EventuallyQueue
 
-  * @static
 
-  */
 
- var EventuallyQueue = {
 
-   /**
 
-    * Add object to queue with save operation.
 
-    *
 
-    * @function save
 
-    * @name Parse.EventuallyQueue.save
 
-    * @param {ParseObject} object Parse.Object to be saved eventually
 
-    * @param {object} [serverOptions] See {@link https://parseplatform.org/Parse-SDK-JS/api/master/Parse.Object.html#save Parse.Object.save} options.
 
-    * @returns {Promise} A promise that is fulfilled if object is added to queue.
 
-    * @static
 
-    * @see Parse.Object#saveEventually
 
-    */
 
-   save: function (object /*: ParseObject*/) /*: Promise*/{
 
-     var serverOptions /*: SaveOptions*/ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-     return this.enqueue('save', object, serverOptions);
 
-   },
 
-   /**
 
-    * Add object to queue with save operation.
 
-    *
 
-    * @function destroy
 
-    * @name Parse.EventuallyQueue.destroy
 
-    * @param {ParseObject} object Parse.Object to be destroyed eventually
 
-    * @param {object} [serverOptions] See {@link https://parseplatform.org/Parse-SDK-JS/api/master/Parse.Object.html#destroy Parse.Object.destroy} options
 
-    * @returns {Promise} A promise that is fulfilled if object is added to queue.
 
-    * @static
 
-    * @see Parse.Object#destroyEventually
 
-    */
 
-   destroy: function (object /*: ParseObject*/) /*: Promise*/{
 
-     var serverOptions /*: RequestOptions*/ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
 
-     return this.enqueue('destroy', object, serverOptions);
 
-   },
 
-   /**
 
-    * Generate unique identifier to avoid duplicates and maintain previous state.
 
-    *
 
-    * @param {string} action save / destroy
 
-    * @param {object} object Parse.Object to be queued
 
-    * @returns {string}
 
-    * @static
 
-    * @ignore
 
-    */
 
-   generateQueueId: function (action /*: string*/, object /*: ParseObject*/) /*: string*/{
 
-     object._getId();
 
-     var className = object.className,
 
-       id = object.id,
 
-       _localId = object._localId;
 
-     var uniqueId = object.get('hash') || _localId;
 
-     return [action, className, id, uniqueId].join('_');
 
-   },
 
-   /**
 
-    * Build queue object and add to queue.
 
-    *
 
-    * @param {string} action save / destroy
 
-    * @param {object} object Parse.Object to be queued
 
-    * @param {object} [serverOptions]
 
-    * @returns {Promise} A promise that is fulfilled if object is added to queue.
 
-    * @static
 
-    * @ignore
 
-    */
 
-   enqueue: function (action /*: string*/, object /*: ParseObject*/, serverOptions /*: SaveOptions | RequestOptions*/) /*: Promise*/{
 
-     var _this = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
 
-       var queueData, queueId, index, prop;
 
-       return _regenerator.default.wrap(function (_context) {
 
-         while (1) switch (_context.prev = _context.next) {
 
-           case 0:
 
-             _context.next = 2;
 
-             return _this.getQueue();
 
-           case 2:
 
-             queueData = _context.sent;
 
-             queueId = _this.generateQueueId(action, object);
 
-             index = _this.queueItemExists(queueData, queueId);
 
-             if (index > -1) {
 
-               // Add cached values to new object if they don't exist
 
-               for (prop in queueData[index].object) {
 
-                 if (typeof object.get(prop) === 'undefined') {
 
-                   object.set(prop, queueData[index].object[prop]);
 
-                 }
 
-               }
 
-             } else {
 
-               index = queueData.length;
 
-             }
 
-             queueData[index] = {
 
-               queueId: queueId,
 
-               action: action,
 
-               object: object.toJSON(),
 
-               serverOptions: serverOptions,
 
-               id: object.id,
 
-               className: object.className,
 
-               hash: object.get('hash'),
 
-               createdAt: new Date()
 
-             };
 
-             return _context.abrupt("return", _this.setQueue(queueData));
 
-           case 8:
 
-           case "end":
 
-             return _context.stop();
 
-         }
 
-       }, _callee);
 
-     }))();
 
-   },
 
-   store: function (data) {
 
-     return _Storage.default.setItemAsync(QUEUE_KEY, (0, _stringify.default)(data));
 
-   },
 
-   load: function () {
 
-     return _Storage.default.getItemAsync(QUEUE_KEY);
 
-   },
 
-   /**
 
-    * Sets the in-memory queue from local storage and returns.
 
-    *
 
-    * @function getQueue
 
-    * @name Parse.EventuallyQueue.getQueue
 
-    * @returns {Promise<Array>}
 
-    * @static
 
-    */
 
-   getQueue: function () /*: Promise<Array>*/{
 
-     var _this2 = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
 
-       return _regenerator.default.wrap(function (_context2) {
 
-         while (1) switch (_context2.prev = _context2.next) {
 
-           case 0:
 
-             if (!dirtyCache) {
 
-               _context2.next = 10;
 
-               break;
 
-             }
 
-             _context2.t0 = JSON;
 
-             _context2.next = 4;
 
-             return _this2.load();
 
-           case 4:
 
-             _context2.t1 = _context2.sent;
 
-             if (_context2.t1) {
 
-               _context2.next = 7;
 
-               break;
 
-             }
 
-             _context2.t1 = '[]';
 
-           case 7:
 
-             _context2.t2 = _context2.t1;
 
-             queueCache = _context2.t0.parse.call(_context2.t0, _context2.t2);
 
-             dirtyCache = false;
 
-           case 10:
 
-             return _context2.abrupt("return", queueCache);
 
-           case 11:
 
-           case "end":
 
-             return _context2.stop();
 
-         }
 
-       }, _callee2);
 
-     }))();
 
-   },
 
-   /**
 
-    * Saves the queue to local storage
 
-    *
 
-    * @param {Queue} queue Queue containing Parse.Object data.
 
-    * @returns {Promise} A promise that is fulfilled when queue is stored.
 
-    * @static
 
-    * @ignore
 
-    */
 
-   setQueue: function (queue /*: Queue*/) /*: Promise<void>*/{
 
-     queueCache = queue;
 
-     return this.store(queueCache);
 
-   },
 
-   /**
 
-    * Removes Parse.Object data from queue.
 
-    *
 
-    * @param {string} queueId Unique identifier for Parse.Object data.
 
-    * @returns {Promise} A promise that is fulfilled when queue is stored.
 
-    * @static
 
-    * @ignore
 
-    */
 
-   remove: function (queueId /*: string*/) /*: Promise<void>*/{
 
-     var _this3 = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
 
-       var queueData, index;
 
-       return _regenerator.default.wrap(function (_context3) {
 
-         while (1) switch (_context3.prev = _context3.next) {
 
-           case 0:
 
-             _context3.next = 2;
 
-             return _this3.getQueue();
 
-           case 2:
 
-             queueData = _context3.sent;
 
-             index = _this3.queueItemExists(queueData, queueId);
 
-             if (!(index > -1)) {
 
-               _context3.next = 8;
 
-               break;
 
-             }
 
-             (0, _splice.default)(queueData).call(queueData, index, 1);
 
-             _context3.next = 8;
 
-             return _this3.setQueue(queueData);
 
-           case 8:
 
-           case "end":
 
-             return _context3.stop();
 
-         }
 
-       }, _callee3);
 
-     }))();
 
-   },
 
-   /**
 
-    * Removes all objects from queue.
 
-    *
 
-    * @function clear
 
-    * @name Parse.EventuallyQueue.clear
 
-    * @returns {Promise} A promise that is fulfilled when queue is cleared.
 
-    * @static
 
-    */
 
-   clear: function () /*: Promise*/{
 
-     queueCache = [];
 
-     return this.store([]);
 
-   },
 
-   /**
 
-    * Return the index of a queueId in the queue. Returns -1 if not found.
 
-    *
 
-    * @param {Queue} queue Queue containing Parse.Object data.
 
-    * @param {string} queueId Unique identifier for Parse.Object data.
 
-    * @returns {number}
 
-    * @static
 
-    * @ignore
 
-    */
 
-   queueItemExists: function (queue /*: Queue*/, queueId /*: string*/) /*: number*/{
 
-     return (0, _findIndex.default)(queue).call(queue, function (data) {
 
-       return data.queueId === queueId;
 
-     });
 
-   },
 
-   /**
 
-    * Return the number of objects in the queue.
 
-    *
 
-    * @function length
 
-    * @name Parse.EventuallyQueue.length
 
-    * @returns {number}
 
-    * @static
 
-    */
 
-   length: function () /*: number*/{
 
-     var _this4 = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
 
-       var queueData;
 
-       return _regenerator.default.wrap(function (_context4) {
 
-         while (1) switch (_context4.prev = _context4.next) {
 
-           case 0:
 
-             _context4.next = 2;
 
-             return _this4.getQueue();
 
-           case 2:
 
-             queueData = _context4.sent;
 
-             return _context4.abrupt("return", queueData.length);
 
-           case 4:
 
-           case "end":
 
-             return _context4.stop();
 
-         }
 
-       }, _callee4);
 
-     }))();
 
-   },
 
-   /**
 
-    * Sends the queue to the server.
 
-    *
 
-    * @function sendQueue
 
-    * @name Parse.EventuallyQueue.sendQueue
 
-    * @returns {Promise<boolean>} Returns true if queue was sent successfully.
 
-    * @static
 
-    */
 
-   sendQueue: function () /*: Promise<boolean>*/{
 
-     var _this5 = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
 
-       var queue, queueData, i, queueObject, id, hash, className, ObjectType;
 
-       return _regenerator.default.wrap(function (_context5) {
 
-         while (1) switch (_context5.prev = _context5.next) {
 
-           case 0:
 
-             _context5.next = 2;
 
-             return _this5.getQueue();
 
-           case 2:
 
-             queue = _context5.sent;
 
-             queueData = (0, _toConsumableArray2.default)(queue);
 
-             if (!(queueData.length === 0)) {
 
-               _context5.next = 6;
 
-               break;
 
-             }
 
-             return _context5.abrupt("return", false);
 
-           case 6:
 
-             i = 0;
 
-           case 7:
 
-             if (!(i < queueData.length)) {
 
-               _context5.next = 26;
 
-               break;
 
-             }
 
-             queueObject = queueData[i];
 
-             id = queueObject.id, hash = queueObject.hash, className = queueObject.className;
 
-             ObjectType = _ParseObject.default.extend(className);
 
-             if (!id) {
 
-               _context5.next = 16;
 
-               break;
 
-             }
 
-             _context5.next = 14;
 
-             return _this5.process.byId(ObjectType, queueObject);
 
-           case 14:
 
-             _context5.next = 23;
 
-             break;
 
-           case 16:
 
-             if (!hash) {
 
-               _context5.next = 21;
 
-               break;
 
-             }
 
-             _context5.next = 19;
 
-             return _this5.process.byHash(ObjectType, queueObject);
 
-           case 19:
 
-             _context5.next = 23;
 
-             break;
 
-           case 21:
 
-             _context5.next = 23;
 
-             return _this5.process.create(ObjectType, queueObject);
 
-           case 23:
 
-             i += 1;
 
-             _context5.next = 7;
 
-             break;
 
-           case 26:
 
-             return _context5.abrupt("return", true);
 
-           case 27:
 
-           case "end":
 
-             return _context5.stop();
 
-         }
 
-       }, _callee5);
 
-     }))();
 
-   },
 
-   /**
 
-    * Build queue object and add to queue.
 
-    *
 
-    * @param {ParseObject} object Parse.Object to be processed
 
-    * @param {QueueObject} queueObject Parse.Object data from the queue
 
-    * @returns {Promise} A promise that is fulfilled when operation is performed.
 
-    * @static
 
-    * @ignore
 
-    */
 
-   sendQueueCallback: function (object /*: ParseObject*/, queueObject /*: QueueObject*/) /*: Promise<void>*/{
 
-     var _this6 = this;
 
-     return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
 
-       return _regenerator.default.wrap(function (_context6) {
 
-         while (1) switch (_context6.prev = _context6.next) {
 
-           case 0:
 
-             if (object) {
 
-               _context6.next = 2;
 
-               break;
 
-             }
 
-             return _context6.abrupt("return", _this6.remove(queueObject.queueId));
 
-           case 2:
 
-             _context6.t0 = queueObject.action;
 
-             _context6.next = _context6.t0 === 'save' ? 5 : _context6.t0 === 'destroy' ? 20 : 33;
 
-             break;
 
-           case 5:
 
-             if (!(typeof object.updatedAt !== 'undefined' && object.updatedAt > new Date(queueObject.object.createdAt))) {
 
-               _context6.next = 7;
 
-               break;
 
-             }
 
-             return _context6.abrupt("return", _this6.remove(queueObject.queueId));
 
-           case 7:
 
-             _context6.prev = 7;
 
-             _context6.next = 10;
 
-             return object.save(queueObject.object, queueObject.serverOptions);
 
-           case 10:
 
-             _context6.next = 12;
 
-             return _this6.remove(queueObject.queueId);
 
-           case 12:
 
-             _context6.next = 19;
 
-             break;
 
-           case 14:
 
-             _context6.prev = 14;
 
-             _context6.t1 = _context6["catch"](7);
 
-             if (!(_context6.t1.message !== 'XMLHttpRequest failed: "Unable to connect to the Parse API"')) {
 
-               _context6.next = 19;
 
-               break;
 
-             }
 
-             _context6.next = 19;
 
-             return _this6.remove(queueObject.queueId);
 
-           case 19:
 
-             return _context6.abrupt("break", 33);
 
-           case 20:
 
-             _context6.prev = 20;
 
-             _context6.next = 23;
 
-             return object.destroy(queueObject.serverOptions);
 
-           case 23:
 
-             _context6.next = 25;
 
-             return _this6.remove(queueObject.queueId);
 
-           case 25:
 
-             _context6.next = 32;
 
-             break;
 
-           case 27:
 
-             _context6.prev = 27;
 
-             _context6.t2 = _context6["catch"](20);
 
-             if (!(_context6.t2.message !== 'XMLHttpRequest failed: "Unable to connect to the Parse API"')) {
 
-               _context6.next = 32;
 
-               break;
 
-             }
 
-             _context6.next = 32;
 
-             return _this6.remove(queueObject.queueId);
 
-           case 32:
 
-             return _context6.abrupt("break", 33);
 
-           case 33:
 
-           case "end":
 
-             return _context6.stop();
 
-         }
 
-       }, _callee6, null, [[7, 14], [20, 27]]);
 
-     }))();
 
-   },
 
-   /**
 
-    * Start polling server for network connection.
 
-    * Will send queue if connection is established.
 
-    *
 
-    * @function poll
 
-    * @name Parse.EventuallyQueue.poll
 
-    * @param [ms] Milliseconds to ping the server. Default 2000ms
 
-    * @static
 
-    */
 
-   poll: function () {
 
-     var _this7 = this;
 
-     var ms /*: number*/ = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2000;
 
-     if (polling) {
 
-       return;
 
-     }
 
-     polling = (0, _setInterval2.default)(function () {
 
-       var RESTController = _CoreManager.default.getRESTController();
 
-       RESTController.request('GET', 'health').then(function (_ref) {
 
-         var status = _ref.status;
 
-         if (status === 'ok') {
 
-           _this7.stopPoll();
 
-           return _this7.sendQueue();
 
-         }
 
-       }).catch(function (e) {
 
-         return e;
 
-       });
 
-     }, ms);
 
-   },
 
-   /**
 
-    * Turns off polling.
 
-    *
 
-    * @function stopPoll
 
-    * @name Parse.EventuallyQueue.stopPoll
 
-    * @static
 
-    */
 
-   stopPoll: function () {
 
-     clearInterval(polling);
 
-     polling = undefined;
 
-   },
 
-   /**
 
-    * Return true if pinging the server.
 
-    *
 
-    * @function isPolling
 
-    * @name Parse.EventuallyQueue.isPolling
 
-    * @returns {boolean}
 
-    * @static
 
-    */
 
-   isPolling: function () /*: boolean*/{
 
-     return !!polling;
 
-   },
 
-   _setPolling: function (flag /*: boolean*/) {
 
-     polling = flag;
 
-   },
 
-   process: {
 
-     create: function (ObjectType, queueObject) {
 
-       var object = new ObjectType();
 
-       return EventuallyQueue.sendQueueCallback(object, queueObject);
 
-     },
 
-     byId: function (ObjectType, queueObject) {
 
-       return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() {
 
-         var sessionToken, query, results;
 
-         return _regenerator.default.wrap(function (_context7) {
 
-           while (1) switch (_context7.prev = _context7.next) {
 
-             case 0:
 
-               sessionToken = queueObject.serverOptions.sessionToken;
 
-               query = new _ParseQuery.default(ObjectType);
 
-               query.equalTo('objectId', queueObject.id);
 
-               _context7.next = 5;
 
-               return (0, _find.default)(query).call(query, {
 
-                 sessionToken: sessionToken
 
-               });
 
-             case 5:
 
-               results = _context7.sent;
 
-               return _context7.abrupt("return", EventuallyQueue.sendQueueCallback(results[0], queueObject));
 
-             case 7:
 
-             case "end":
 
-               return _context7.stop();
 
-           }
 
-         }, _callee7);
 
-       }))();
 
-     },
 
-     byHash: function (ObjectType, queueObject) {
 
-       return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {
 
-         var sessionToken, query, results;
 
-         return _regenerator.default.wrap(function (_context8) {
 
-           while (1) switch (_context8.prev = _context8.next) {
 
-             case 0:
 
-               sessionToken = queueObject.serverOptions.sessionToken;
 
-               query = new _ParseQuery.default(ObjectType);
 
-               query.equalTo('hash', queueObject.hash);
 
-               _context8.next = 5;
 
-               return (0, _find.default)(query).call(query, {
 
-                 sessionToken: sessionToken
 
-               });
 
-             case 5:
 
-               results = _context8.sent;
 
-               if (!(results.length > 0)) {
 
-                 _context8.next = 8;
 
-                 break;
 
-               }
 
-               return _context8.abrupt("return", EventuallyQueue.sendQueueCallback(results[0], queueObject));
 
-             case 8:
 
-               return _context8.abrupt("return", EventuallyQueue.process.create(ObjectType, queueObject));
 
-             case 9:
 
-             case "end":
 
-               return _context8.stop();
 
-           }
 
-         }, _callee8);
 
-       }))();
 
-     }
 
-   }
 
- };
 
- module.exports = EventuallyQueue;
 
 
  |