All files / src/instagram stream.js

100% Statements 25/25
100% Branches 15/15
100% Functions 8/8
100% Lines 22/22
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                                                        14x 14x 14x 14x 14x 14x 7x                     10x 10x 1x   10x   9x   15x 11x   11x 8x 1x 1x   8x 6x 10x           1x            
import Stream from '../core/stream';
 
/**
 * @private
 * @class InstagramStream
 * @description InstagramStream class
 * @example
 *
 * // Streaming can be used on all endpoints taking MIN_TAG_ID as parameter
 * const stream = instagram.stream('tags/:tag-name/media/recent');
 *
 * stream.on('message', (message) => {
 *  console.log(message);
 * });
 *
 * // handle stream error
 * stream.on('error', (err) => {
 *  // An error occur
 *  console.log(err);
 * });
 */
class InstagramStream extends Stream {
  /**
   * @private
   * @memberof InstagramStream
   * @description Create a new instance of stream class
   */
  constructor(instagram, endpoint, options = {}) {
    super();
    this.instagram = instagram;
    this.endpoint = endpoint;
    this.interval = options.interval || 10000;
    this.minTagId = options.minTagId;
    if (options.runOnCreation !== false) {
      this.start();
    }
  }
 
  /**
   * @memberof InstagramStream
   * @private
   * @description Make a request on instagram API.<br />
   * Cache the result and emit only new messages.
   */
  makeRequest() {
    const params = {};
    if (this.minTagId) {
      params.min_tag_id = this.minTagId;
    }
    this.instagram.get(this.endpoint, params)
      .then((data) => {
        if (data.data.length > 0) {
          // Only return messages not in cache
          let newPosts = data.data.filter(post => this.cache.indexOf(post.id) === -1);
          this.cache.push(...newPosts.map(post => post.id));
          // Only return messages created after the stream
          newPosts = newPosts.filter(post => this.startDate < post.created_time * 1000);
          if (data.pagination.min_tag_id) {
            this.minTagId = data.pagination.min_tag_id;
            this.cache = [];
          }
          if (newPosts.length > 0) {
            newPosts.forEach((newPost) => {
              this.emit('message', newPost);
            });
          }
        }
      })
      .catch((err) => {
        this.emit('error', err.error || err);
      });
  }
}
 
export default InstagramStream;