@@ -94,6 +94,14 @@ class FeedEmitter extends EventEmitter {
9494 * @type {boolean }
9595 */
9696 this . skipFirstLoad = options . skipFirstLoad ;
97+
98+ /**
99+ * Map of emitted event urls grouped by event.
100+ * This is to help prevent overlapping/dupe events in a single event name
101+ * Each entry set clears at the same interval as the most recently applied feed.
102+ * @type {Object }
103+ */
104+ this . emittedUrlsPerEvent = { } ;
97105 }
98106
99107 /**
@@ -193,6 +201,14 @@ class FeedEmitter extends EventEmitter {
193201 this . removeFromFeedList ( feedInList ) ;
194202 }
195203
204+ if ( ! this . emittedUrlsPerEvent [ feed . eventName ] ) {
205+ this . emittedUrlsPerEvent [ feed . eventName ] = {
206+ timeout : setTimeout ( ( ) => {
207+ this . emittedUrlsPerEvent [ feed . eventName ] . urls = [ ] ;
208+ } , feed . refresh ) ,
209+ urls : [ ] ,
210+ } ;
211+ }
196212 this . addToFeedList ( feed ) ;
197213 }
198214
@@ -230,6 +246,7 @@ class FeedEmitter extends EventEmitter {
230246 createSetInterval ( feed ) {
231247 const feedManager = new FeedManager ( this , feed ) ;
232248 feedManager . getContent ( true ) ;
249+
233250 return setInterval ( feedManager . getContent . bind ( feedManager ) , feed . refresh ) ;
234251 }
235252
@@ -247,6 +264,28 @@ class FeedEmitter extends EventEmitter {
247264 const pos = this . feedList . findIndex ( ( e ) => e . url === feed . url ) ;
248265 this . feedList . splice ( pos , 1 ) ;
249266 }
267+
268+ /**
269+ * Override emit to check if emitted event has already
270+ * been emitted on the same event
271+ * **WARNING:** This is a very limited scope implementation
272+ * If we ever need to emit more than one thing at once, we should expand this
273+ * @param {string } event event name to emit
274+ * @param {Object } data event data/args
275+ * @returns {boolean } [description]
276+ */
277+ emit ( event , data ) {
278+ // should only get triggered by initial-load, which we don't want to muck up memory with
279+ if ( ! this . emittedUrlsPerEvent [ event ] ) {
280+ return super . emit ( event , data ) ;
281+ }
282+
283+ if ( this . emittedUrlsPerEvent [ event ] . urls . includes ( data . link ) ) {
284+ return false ;
285+ }
286+ this . emittedUrlsPerEvent [ event ] . urls . push ( data . link ) ;
287+ return super . emit ( event , data ) ;
288+ }
250289}
251290
252291module . exports = FeedEmitter ;
0 commit comments