@@ -254,37 +254,6 @@ interface ParsedFeed {
254
254
items : Array < FeedItem >
255
255
}
256
256
257
- /**
258
- * Simple state management without external dependencies
259
- */
260
- class SimpleStore < T > {
261
- private _state : T
262
- private _subscribers : Array < ( state : T ) => void > = [ ]
263
-
264
- constructor ( initialState : T ) {
265
- this . _state = initialState
266
- }
267
-
268
- get state ( ) : T {
269
- return this . _state
270
- }
271
-
272
- setState ( updater : ( current : T ) => T ) : void {
273
- this . _state = updater ( this . _state )
274
- this . _subscribers . forEach ( ( callback ) => callback ( this . _state ) )
275
- }
276
-
277
- subscribe ( callback : ( state : T ) => void ) : ( ) => void {
278
- this . _subscribers . push ( callback )
279
- return ( ) => {
280
- const index = this . _subscribers . indexOf ( callback )
281
- if ( index > - 1 ) {
282
- this . _subscribers . splice ( index , 1 )
283
- }
284
- }
285
- }
286
- }
287
-
288
257
/**
289
258
* Parse RSS feed
290
259
*/
@@ -505,10 +474,8 @@ function createFeedCollectionOptions<
505
474
}
506
475
507
476
// State management
508
- const seenItems = new SimpleStore <
509
- Map < string , { id : string ; lastSeen : number } >
510
- > ( new Map ( ) )
511
- const isPollingRef = new SimpleStore < boolean > ( false )
477
+ let seenItems = new Map < string , { id : string ; lastSeen : number } > ( )
478
+ let isPolling = false
512
479
let pollingTimeoutId : NodeJS . Timeout | null = null
513
480
514
481
/**
@@ -518,33 +485,31 @@ function createFeedCollectionOptions<
518
485
const now = Date . now ( )
519
486
const maxAge = pollingInterval * 10 // Keep items for 10 polling cycles
520
487
521
- seenItems . setState ( ( current ) => {
522
- const cleaned = new Map ( )
523
- let removedCount = 0
488
+ const cleaned = new Map ( )
489
+ let removedCount = 0
524
490
525
- for ( const [ key , value ] of current ) {
526
- if ( now - value . lastSeen < maxAge ) {
527
- cleaned . set ( key , value )
528
- } else {
529
- removedCount ++
530
- }
491
+ for ( const [ key , value ] of seenItems ) {
492
+ if ( now - value . lastSeen < maxAge ) {
493
+ cleaned . set ( key , value )
494
+ } else {
495
+ removedCount ++
531
496
}
497
+ }
532
498
533
- if ( cleaned . size > maxSeenItems ) {
534
- // Remove oldest items if we're still over the limit
535
- const sortedEntries = Array . from ( cleaned . entries ( ) )
536
- . sort ( ( [ , a ] , [ , b ] ) => b . lastSeen - a . lastSeen )
537
- . slice ( 0 , maxSeenItems )
538
-
539
- return new Map ( sortedEntries )
540
- }
499
+ if ( cleaned . size > maxSeenItems ) {
500
+ // Remove oldest items if we're still over the limit
501
+ const sortedEntries = Array . from ( cleaned . entries ( ) )
502
+ . sort ( ( [ , a ] , [ , b ] ) => b . lastSeen - a . lastSeen )
503
+ . slice ( 0 , maxSeenItems )
541
504
542
- if ( removedCount > 0 ) {
543
- debug ( `Cleaned up ${ removedCount } old feed items` )
544
- }
505
+ seenItems = new Map ( sortedEntries )
506
+ } else {
507
+ seenItems = cleaned
508
+ }
545
509
546
- return cleaned
547
- } )
510
+ if ( removedCount > 0 ) {
511
+ debug ( `Cleaned up ${ removedCount } old feed items` )
512
+ }
548
513
}
549
514
550
515
/**
@@ -611,15 +576,11 @@ function createFeedCollectionOptions<
611
576
const itemId = getItemId ( rawItem , parsedFeed . type )
612
577
613
578
// Check if we've seen this item before
614
- const seen = seenItems . state . get ( itemId )
579
+ const seen = seenItems . get ( itemId )
615
580
616
581
if ( ! seen ) {
617
582
// New item
618
- seenItems . setState ( ( current ) => {
619
- const newMap = new Map ( current )
620
- newMap . set ( itemId , { id : itemId , lastSeen : currentTime } )
621
- return newMap
622
- } )
583
+ seenItems . set ( itemId , { id : itemId , lastSeen : currentTime } )
623
584
624
585
write ( {
625
586
type : `insert` ,
@@ -629,11 +590,7 @@ function createFeedCollectionOptions<
629
590
newItemsCount ++
630
591
} else {
631
592
// Update last seen time
632
- seenItems . setState ( ( current ) => {
633
- const newMap = new Map ( current )
634
- newMap . set ( itemId , { ...seen , lastSeen : currentTime } )
635
- return newMap
636
- } )
593
+ seenItems . set ( itemId , { ...seen , lastSeen : currentTime } )
637
594
}
638
595
}
639
596
@@ -655,14 +612,14 @@ function createFeedCollectionOptions<
655
612
* Start polling
656
613
*/
657
614
const startPollingFn = ( syncParams ?: any ) => {
658
- if ( isPollingRef . state ) {
615
+ if ( isPolling ) {
659
616
return // Already polling
660
617
}
661
618
662
- isPollingRef . setState ( ( ) => true )
619
+ isPolling = true
663
620
664
621
const poll = async ( ) => {
665
- if ( ! isPollingRef . state ) {
622
+ if ( ! isPolling ) {
666
623
return // Polling was stopped
667
624
}
668
625
@@ -686,7 +643,7 @@ function createFeedCollectionOptions<
686
643
* Stop polling
687
644
*/
688
645
const stopPollingFn = ( ) => {
689
- isPollingRef . setState ( ( ) => false )
646
+ isPolling = false
690
647
if ( pollingTimeoutId ) {
691
648
clearTimeout ( pollingTimeoutId )
692
649
pollingTimeoutId = null
@@ -738,11 +695,11 @@ function createFeedCollectionOptions<
738
695
} ,
739
696
startPolling : ( ) => startPollingFn ( ) ,
740
697
stopPolling : stopPollingFn ,
741
- isPolling : ( ) => isPollingRef . state ,
698
+ isPolling : ( ) => isPolling ,
742
699
clearSeenItems : ( ) => {
743
- seenItems . setState ( ( ) => new Map ( ) )
700
+ seenItems = new Map ( )
744
701
} ,
745
- getSeenItemsCount : ( ) => seenItems . state . size ,
702
+ getSeenItemsCount : ( ) => seenItems . size ,
746
703
}
747
704
748
705
return {
0 commit comments