Skip to content

Commit 32b5a1c

Browse files
Remove SimpleStore and simplify state management in RSS feed collection
Co-authored-by: sam.willis <[email protected]>
1 parent 1f4697c commit 32b5a1c

File tree

1 file changed

+32
-75
lines changed
  • packages/rss-db-collection/src

1 file changed

+32
-75
lines changed

packages/rss-db-collection/src/rss.ts

Lines changed: 32 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -254,37 +254,6 @@ interface ParsedFeed {
254254
items: Array<FeedItem>
255255
}
256256

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-
288257
/**
289258
* Parse RSS feed
290259
*/
@@ -505,10 +474,8 @@ function createFeedCollectionOptions<
505474
}
506475

507476
// 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
512479
let pollingTimeoutId: NodeJS.Timeout | null = null
513480

514481
/**
@@ -518,33 +485,31 @@ function createFeedCollectionOptions<
518485
const now = Date.now()
519486
const maxAge = pollingInterval * 10 // Keep items for 10 polling cycles
520487

521-
seenItems.setState((current) => {
522-
const cleaned = new Map()
523-
let removedCount = 0
488+
const cleaned = new Map()
489+
let removedCount = 0
524490

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++
531496
}
497+
}
532498

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)
541504

542-
if (removedCount > 0) {
543-
debug(`Cleaned up ${removedCount} old feed items`)
544-
}
505+
seenItems = new Map(sortedEntries)
506+
} else {
507+
seenItems = cleaned
508+
}
545509

546-
return cleaned
547-
})
510+
if (removedCount > 0) {
511+
debug(`Cleaned up ${removedCount} old feed items`)
512+
}
548513
}
549514

550515
/**
@@ -611,15 +576,11 @@ function createFeedCollectionOptions<
611576
const itemId = getItemId(rawItem, parsedFeed.type)
612577

613578
// Check if we've seen this item before
614-
const seen = seenItems.state.get(itemId)
579+
const seen = seenItems.get(itemId)
615580

616581
if (!seen) {
617582
// 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 })
623584

624585
write({
625586
type: `insert`,
@@ -629,11 +590,7 @@ function createFeedCollectionOptions<
629590
newItemsCount++
630591
} else {
631592
// 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 })
637594
}
638595
}
639596

@@ -655,14 +612,14 @@ function createFeedCollectionOptions<
655612
* Start polling
656613
*/
657614
const startPollingFn = (syncParams?: any) => {
658-
if (isPollingRef.state) {
615+
if (isPolling) {
659616
return // Already polling
660617
}
661618

662-
isPollingRef.setState(() => true)
619+
isPolling = true
663620

664621
const poll = async () => {
665-
if (!isPollingRef.state) {
622+
if (!isPolling) {
666623
return // Polling was stopped
667624
}
668625

@@ -686,7 +643,7 @@ function createFeedCollectionOptions<
686643
* Stop polling
687644
*/
688645
const stopPollingFn = () => {
689-
isPollingRef.setState(() => false)
646+
isPolling = false
690647
if (pollingTimeoutId) {
691648
clearTimeout(pollingTimeoutId)
692649
pollingTimeoutId = null
@@ -738,11 +695,11 @@ function createFeedCollectionOptions<
738695
},
739696
startPolling: () => startPollingFn(),
740697
stopPolling: stopPollingFn,
741-
isPolling: () => isPollingRef.state,
698+
isPolling: () => isPolling,
742699
clearSeenItems: () => {
743-
seenItems.setState(() => new Map())
700+
seenItems = new Map()
744701
},
745-
getSeenItemsCount: () => seenItems.state.size,
702+
getSeenItemsCount: () => seenItems.size,
746703
}
747704

748705
return {

0 commit comments

Comments
 (0)