linagora-rse
Version:
111 lines (92 loc) • 2.7 kB
JavaScript
;
angular.module('esn.rest.helper', [])
.factory('filteredcursor', function() {
return function filteredcursor(cursor, limit, options) {
var self = {
endOfStream: false,
offset: 0,
running: false,
error: false
};
var resultsBuffer = [];
options = options || {};
options.filter = options.filter || function() { return true; };
function nextItems(callback) {
if (self.error || self.running || self.endOfStream) {
return;
}
self.running = true;
function sendResponse() {
var results = null;
if (resultsBuffer.length >= limit) {
results = resultsBuffer.splice(0, limit);
} else if (cursor.endOfStream) {
self.endOfStream = true;
results = resultsBuffer;
resultsBuffer = [];
}
if (results) {
self.running = false;
self.offset += results.length;
callback(null, results);
return true;
}
return false;
}
function recursiveFetch() {
if (!sendResponse()) {
cursor.nextItems(function(err, results) {
if (err) {
self.error = err;
return callback(err);
}
var filtered = results.filter(options.filter);
if (filtered.length) {
resultsBuffer = resultsBuffer.concat(filtered);
}
recursiveFetch();
});
}
}
recursiveFetch();
}
self.nextItems = nextItems;
return self;
};
})
.factory('restcursor', function() {
return function restcursor(api, limit, options) {
var self = {
endOfStream: false,
offset: 0,
running: false,
error: false
};
options = options || {};
options.apiArgs = options.apiArgs || {};
options.updateApiArgs = options.updateApiArgs || function(cursor, items, apiArgs) {
apiArgs.offset = cursor.offset;
};
function nextItems(callback) {
if (self.running || self.endOfStream || self.error) {
return false;
}
api(options.apiArgs).then(function(response) {
var items = response.data;
self.offset += items.length;
options.updateApiArgs(self, items, options.apiArgs);
if (items.length < limit && !options.noEndOfStream) {
self.endOfStream = true;
}
self.running = false;
callback(null, items);
}, function(response) {
self.error = response.data ? response.data : response;
self.running = false;
callback(self.error);
});
}
self.nextItems = nextItems;
return self;
};
});