all files / couch/couch/changes/feed/ long-polling.js

85.19% Statements 23/27
66.67% Branches 4/6
83.33% Functions 5/6
85.19% Lines 23/27
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                              19×           19× 19×       19× 19× 19×         19×   19× 18×   11×     19×   19× 19×   19× 19×     19×                        
import Ember from 'ember';
import Feed from './feed';
 
const {
  run: { next, later, cancel },
  RSVP: { resolve },
  merge
} = Ember;
 
const delayed = 'delayed';
const immediate = 'immediate';
 
export default class LongPollingFeed extends Feed {
 
  static isSupported() {
    return true;
  }
 
  get qs() {
    return {
      feed: 'longpoll'
    };
  }
 
  poll() {
    let url = this.url;
    this.request({ type: 'get', url, json: true }).then(json => {
      this.onMessage(json);
      this.nextPoll();
    }, err => {
      this.onError(err);
      this.nextPoll({ type: delayed });
      return resolve();
    });
  }
 
  nextPoll(opts) {
    let { type } = merge({ type: immediate }, opts);
 
    let invocation = () => {
      if(!this.started) {
        return;
      }
      this.poll();
    };
 
    cancel(this._poll);
 
    let cancelable;
    Iif(type === immediate) {
      cancelable = next(invocation);
    } else Eif(type === delayed) {
      cancelable = later(invocation, this.opts.reconnect);
    }
 
    this._poll = cancelable;
  }
 
  start() {
    this.poll();
    super.start();
  }
 
  onMessage(message) {
    this.onData(message);
  }
 
}