consul/ui-v2/app/utils/dom/event-source/resolver.js

30 lines
919 B
JavaScript

export default function(P = Promise) {
return function(source, listeners) {
let current;
if (typeof source.getCurrentEvent === 'function') {
current = source.getCurrentEvent();
}
if (current != null) {
// immediately resolve if we have previous cached data
return P.resolve(current.data).then(function(cached) {
source.reopen();
return cached;
});
}
// if we have no previously cached data, listen for the first response
return new P(function(resolve, reject) {
// close, cleanup and reject if we get an error
listeners.add(source, 'error', function(e) {
listeners.remove();
e.target.close();
reject(e.error);
});
// ...or cleanup and respond with the first lot of data
listeners.add(source, 'message', function(e) {
listeners.remove();
resolve(e.data);
});
});
};
}