Skip to content

Commit 6f588cf

Browse files
authored
Prevent infinite loop when calling foreach after deleting head (#194)
1 parent 1dd3940 commit 6f588cf

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

packages/cache/src/lru.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,18 @@ describe('lru()', () => {
193193
cache.write('baz', 'boz')
194194

195195
const results: string[] = []
196-
cache.forEach((value) => results.push(value))
196+
cache.forEach((key) => results.push(key))
197197
expect(results).toEqual(['baz', 'bar', 'foo'])
198198
})
199+
200+
it('should not iterate over deleted head', () => {
201+
const cache = lru<string, string>(Infinity)
202+
cache.write('foo', 'bar')
203+
cache.write('bar', 'baz')
204+
cache.delete('bar')
205+
206+
const results: string[] = []
207+
cache.forEach((key) => results.push(key))
208+
expect(results).toEqual(['foo'])
209+
})
199210
})

packages/cache/src/lru.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ export const lru = <Key = string, Value = any>(
107107
if (this.size === 1) {
108108
this.head = undefined
109109
} else {
110+
if (node === this.head) {
111+
this.head = node.prev
112+
}
110113
node.prev.next = node.next
111114
node.next.prev = node.prev
112115
}

0 commit comments

Comments
 (0)