mirror of
https://github.com/status-im/consul.git
synced 2025-01-09 13:26:07 +00:00
2b0b1e61d2
The WithEventSource mixin was responsible for catching EventSource errors and cleaning up events sources then the user left a Controller. As we are trying to avoid mixin usage, we moved this all to an `EventSource` component, which can clean up when the component is removed from the page, and also fires an onerror event. Moving to a component firing an onerror event means we can also remove all of our custom computed property work that we were using previously to catch errors (thrown when a service etc. is removed)
55 lines
1.7 KiB
JavaScript
55 lines
1.7 KiB
JavaScript
import { get, set } from '@ember/object';
|
|
|
|
const proxies = {};
|
|
export default function(ObjProxy, ArrProxy, createListeners) {
|
|
return function(source, data = []) {
|
|
let Proxy = ObjProxy;
|
|
// TODO: When is data ever a string?
|
|
let type = 'object';
|
|
if (typeof data !== 'string' && typeof get(data, 'length') !== 'undefined') {
|
|
Proxy = ArrProxy;
|
|
type = 'array';
|
|
data = data.filter(function(item) {
|
|
return !get(item, 'isDestroyed') && !get(item, 'isDeleted') && get(item, 'isLoaded');
|
|
});
|
|
}
|
|
if (typeof proxies[type] === 'undefined') {
|
|
proxies[type] = Proxy.extend({
|
|
init: function() {
|
|
this.listeners = createListeners();
|
|
this.listeners.add(this._source, 'message', e => set(this, 'content', e.data));
|
|
this._super(...arguments);
|
|
},
|
|
addEventListener: function(type, handler) {
|
|
this.listeners.add(this._source, type, handler);
|
|
},
|
|
getCurrentEvent: function() {
|
|
return this._source.getCurrentEvent(...arguments);
|
|
},
|
|
removeEventListener: function() {
|
|
return this._source.removeEventListener(...arguments);
|
|
},
|
|
dispatchEvent: function() {
|
|
return this._source.dispatchEvent(...arguments);
|
|
},
|
|
close: function() {
|
|
return this._source.close(...arguments);
|
|
},
|
|
open: function() {
|
|
return this._source.open(...arguments);
|
|
},
|
|
willDestroy: function() {
|
|
this._super(...arguments);
|
|
this.close();
|
|
this.listeners.remove();
|
|
},
|
|
});
|
|
}
|
|
return proxies[type].create({
|
|
content: data,
|
|
_source: source,
|
|
configuration: source.configuration,
|
|
});
|
|
};
|
|
}
|