1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 1× 1× 1× 3× 48× 48× 28× 28× 28× 28× 19× 19× 19× 19× 19× 19× 12× 26× 19× 19× 19× 19× 19× 19× 19× 29× 10× 19× 19× 19× 19× 28× 28× 11× | import Ember from 'ember'; import assert from '../../util/assert'; import { isFastBoot } from '../../util/computed'; const { getOwner, Evented, merge, isArray, A } = Ember; export const defaultFeedIdentifiers = [ 'event-source', 'long-polling' ]; const inBrowser = fn => { return function(...args) { Iif(this.get('_isFastBoot')) { return; } return fn.call(this, ...args); }; } export default Ember.Object.extend(Evented, { _isFastBoot: isFastBoot(), isStarted: false, _feedOptions() { assert({ error: 'internal', reason: 'override Changes._feedOptions' }, false); }, _feedFactoryName() { assert({ error: 'internal', reason: 'override Changes._feedFactoryName' }, false); }, _feedContext() { assert({ error: 'internal', reason: 'override Changes._feedContext' }, false); }, _lookupFeedClass(feed) { let name = this._feedFactoryName(feed); let factory = getOwner(this).factoryFor(name); assert(`changes feed factory named '${name}' is not registered`, !!factory); return factory.class; }, _createFeed(Feed) { let opts = this._feedOptions(); let context = this._feedContext(); let instance = new Feed(opts, context); return instance; }, _createSupportedFeed() { let { feed } = this.get('opts'); if(!isArray(feed)) { feed = [ feed ]; } let Feed = A(feed).map(name => this._lookupFeedClass(name)).find(feedClass => feedClass.isSupported()); assert(`no browser supported changes feed type found in listed '${feed.join(', ')}' types`, !!Feed); return this._createFeed(Feed); }, start: inBrowser(function() { Iif(this.get('isStarted')) { return; } let feed = this._createSupportedFeed(); feed.delegate = this; feed.start(); this.setProperties({ _feed: feed, isStarted: true }); }), stop: inBrowser(function() { if(!this.get('isStarted')) { return; } let feed = this.get('_feed'); feed.delegate = null; let opts = feed.stop(); this.setProperties({ _feed: null, isStarted: false, opts: merge(this.get('opts'), opts) }); }), restart: inBrowser(function() { this.stop(); this.start(); }), willDestroy() { this.stop(); this._super(); }, _trigger(type, arg) { this.trigger(type, arg); }, onData(feed, data) { this._trigger('data', data); }, onError(feed, err) { this._trigger('error', err); } }); |