all files / couch/couch/changes/ changes.js

80% Statements 36/45
75% Branches 6/8
57.14% Functions 8/14
79.07% Lines 34/43
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                        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);
  }
 
});