UNPKG

angular-cached-resource

Version:

An AngularJS module to interact with RESTful resources, even when browser is offline

168 lines (151 loc) 4.92 kB
// Generated by CoffeeScript 1.7.1 var CACHE_RETRY_TIMEOUT, Cache, ResourceCacheEntry, ResourceWriteQueue; CACHE_RETRY_TIMEOUT = 60000; ResourceCacheEntry = require('./resource_cache_entry'); Cache = require('./cache'); ResourceWriteQueue = (function() { function ResourceWriteQueue(CachedResource, $timeout) { this.CachedResource = CachedResource; this.$timeout = $timeout; this.key = "" + this.CachedResource.$key + "/write"; this.queue = Cache.getItem(this.key, []); } ResourceWriteQueue.prototype.enqueue = function(params, action, deferred) { var entry; entry = this.findEntry({ params: params, action: action }); if (entry == null) { this.queue.push({ params: params, action: action, deferred: deferred }); return this._update(); } else { entry.deferred.$promise.then(function(response) { return deferred.resolve(response); }); return entry.deferred.$promise["catch"](function(error) { return deferred.reject(error); }); } }; ResourceWriteQueue.prototype.findEntry = function(_arg) { var action, entry, params, _i, _len, _ref; action = _arg.action, params = _arg.params; _ref = this.queue; for (_i = 0, _len = _ref.length; _i < _len; _i++) { entry = _ref[_i]; if (action === entry.action && angular.equals(params, entry.params)) { return entry; } } }; ResourceWriteQueue.prototype.removeEntry = function(_arg) { var action, entry, newQueue, params, _i, _len, _ref; action = _arg.action, params = _arg.params; newQueue = []; _ref = this.queue; for (_i = 0, _len = _ref.length; _i < _len; _i++) { entry = _ref[_i]; if (!(action === entry.action && angular.equals(params, entry.params))) { newQueue.push(entry); } } this.queue = newQueue; if (this.queue.length === 0 && this.timeoutPromise) { this.$timeout.cancel(this.timeoutPromise); delete this.timeoutPromise; } return this._update(); }; ResourceWriteQueue.prototype.flush = function() { var entry, _i, _len, _ref, _results; this._setFlushTimeout(); _ref = this.queue; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { entry = _ref[_i]; _results.push(this._processEntry(entry)); } return _results; }; ResourceWriteQueue.prototype.processResource = function(params, done) { var entry, notDone, _i, _len, _ref, _results; notDone = true; _ref = this._entriesForResource(params); _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { entry = _ref[_i]; _results.push(this._processEntry(entry, (function(_this) { return function() { if (notDone && _this._entriesForResource(params).length === 0) { notDone = false; return done(); } }; })(this))); } return _results; }; ResourceWriteQueue.prototype._entriesForResource = function(params) { var entry, _i, _len, _ref, _results; _ref = this.queue; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { entry = _ref[_i]; if (angular.equals(params, entry.params)) { _results.push(entry); } } return _results; }; ResourceWriteQueue.prototype._processEntry = function(entry, done) { var cacheEntry, onFailure, onSuccess; cacheEntry = new ResourceCacheEntry(this.CachedResource.$key, entry.params); onSuccess = (function(_this) { return function(value) { var _ref; _this.removeEntry(entry); if ((_ref = entry.deferred) != null) { _ref.resolve(value); } if (angular.isFunction(done)) { return done(); } }; })(this); onFailure = (function(_this) { return function(error) { var _ref; return (_ref = entry.deferred) != null ? _ref.reject(error) : void 0; }; })(this); return this.CachedResource.$resource[entry.action](entry.params, cacheEntry.value, onSuccess, onFailure); }; ResourceWriteQueue.prototype._setFlushTimeout = function() { if (this.queue.length > 0 && !this.timeoutPromise) { this.timeoutPromise = this.$timeout(angular.bind(this, this.flush), CACHE_RETRY_TIMEOUT); return this.timeoutPromise.then((function(_this) { return function() { delete _this.timeoutPromise; return _this._setFlushTimeout(); }; })(this)); } }; ResourceWriteQueue.prototype._update = function() { var savableQueue; savableQueue = this.queue.map(function(entry) { return { params: entry.params, action: entry.action }; }); return Cache.setItem(this.key, savableQueue); }; return ResourceWriteQueue; })(); module.exports = ResourceWriteQueue;