Skip to content

Commit c32036a

Browse files
authored
fix: expire old latest transaction ids (#89)
1 parent 0955007 commit c32036a

File tree

5 files changed

+32
-23
lines changed

5 files changed

+32
-23
lines changed

src/features/blocks/data/latest-blocks.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { ApplicationId } from '@/features/applications/data/types'
2323
import { applicationResultsAtom } from '@/features/applications/data'
2424
import { syncedRoundAtom } from './synced-round'
2525
import { algod } from '@/features/common/data/algo-client'
26+
import { createTimestamp } from '@/features/common/data'
2627

2728
const maxBlocksToDisplay = 10
2829

@@ -94,6 +95,8 @@ const subscribeToBlocksEffect = atomEffect((get, set) => {
9495
return
9596
}
9697

98+
const timestamp = createTimestamp()
99+
97100
const [blockTransactionIds, transactionResults, groupResults, staleAssetIds, staleAddresses, staleApplicationIds] =
98101
result.subscribedTransactions.reduce(
99102
(acc, t) => {
@@ -235,9 +238,9 @@ const subscribeToBlocksEffect = atomEffect((get, set) => {
235238
set(latestTransactionIdsAtom, (prev) => {
236239
return transactionResults
237240
.reverse()
238-
.map((txn) => txn.id)
241+
.map((txn) => [txn.id, timestamp] as const) // This timestamp will always be earlier than the corresponding transaction timestamp, so it always expires before the transaction.
239242
.concat(prev)
240-
.slice(0, 10_000)
243+
.slice(0, 50_000)
241244
})
242245
})
243246

src/features/common/data/atoms-in-atom.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { dataStore } from './data-store'
33

44
const defaultCreateInitialValueAtom = <T>(value: T) => atom(() => value)
55

6-
const createTimestamp = () => Date.now()
6+
export const createTimestamp = (): number => Date.now()
77

88
export const createAtomAndTimestamp = <T>(value: T) => {
99
return [defaultCreateInitialValueAtom(value), createTimestamp()] as const

src/features/common/data/state-cleanup.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
11
import { blockResultsAtom } from '@/features/blocks/data'
22
import { groupResultsAtom } from '@/features/groups/data'
3-
import { transactionResultsAtom } from '@/features/transactions/data'
3+
import { latestTransactionIdsAtom, transactionResultsAtom } from '@/features/transactions/data'
44
import { Atom, Getter, PrimitiveAtom, Setter, useAtom } from 'jotai'
55
import { atomEffect } from 'jotai-effect'
66
import { accountResultsAtom } from '@/features/accounts/data'
77
import { applicationMetadataResultsAtom } from '@/features/applications/data/application-metadata'
88
import { applicationResultsAtom } from '@/features/applications/data'
99
import { assetMetadataResultsAtom, assetResultsAtom } from '@/features/assets/data'
1010

11-
const cleanUpIntervalMillis = 60_000 // 10 minutes
12-
const expirationMillis = 3600000 // 1 hour
11+
const cleanUpIntervalMillis = 600_000 // 10 minutes
12+
const expirationMillis = 3_600_000 // 1 hour
1313
// Run every 10 minutes and cleanup data that hasn't been accessed in the last 1 hour
1414

1515
const stateCleanupEffect = atomEffect((get, set) => {
1616
const cleanup = setInterval(() => {
17-
;(async () => {
18-
const expiredTimestamp = Date.now() - expirationMillis
19-
const removeExpired = createExpiredDataRemover(get, set, expiredTimestamp)
20-
removeExpired(blockResultsAtom)
21-
removeExpired(groupResultsAtom)
22-
removeExpired(transactionResultsAtom)
23-
removeExpired(accountResultsAtom)
24-
removeExpired(applicationMetadataResultsAtom)
25-
removeExpired(applicationResultsAtom)
26-
removeExpired(assetMetadataResultsAtom)
27-
removeExpired(assetResultsAtom)
28-
})()
17+
const expiredTimestamp = Date.now() - expirationMillis
18+
19+
const removeExpired = createExpiredDataRemover(get, set, expiredTimestamp)
20+
set(latestTransactionIdsAtom, (prev) => {
21+
const next = prev.filter(([_, timestamp]) => timestamp > expiredTimestamp)
22+
if (prev.length !== next.length) {
23+
return next
24+
}
25+
return prev
26+
})
27+
removeExpired(blockResultsAtom)
28+
removeExpired(groupResultsAtom)
29+
removeExpired(transactionResultsAtom)
30+
removeExpired(accountResultsAtom)
31+
removeExpired(applicationMetadataResultsAtom)
32+
removeExpired(applicationResultsAtom)
33+
removeExpired(assetMetadataResultsAtom)
34+
removeExpired(assetResultsAtom)
2935
}, cleanUpIntervalMillis)
3036

3137
return () => clearInterval(cleanup)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { atom } from 'jotai'
22
import { TransactionId } from './types'
33

4-
export const latestTransactionIdsAtom = atom<TransactionId[]>([])
4+
export const latestTransactionIdsAtom = atom<(readonly [TransactionId, number])[]>([])

src/features/transactions/data/live-transaction.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ export const useLiveTransactions = (filter: (transactionResult: TransactionResul
1212
const liveTransactionsAtom = atom<(Transaction | InnerTransaction)[]>([])
1313

1414
const liveTransactionsAtomEffect = atomEffect((get, set) => {
15+
const latestTransactionIds = get(latestTransactionIdsAtom)
1516
;(async () => {
16-
const latestTransactionIds = get(latestTransactionIdsAtom)
17-
1817
const newTransactions: Transaction[] = []
19-
for (const transactionId of latestTransactionIds) {
18+
for (const [transactionId] of latestTransactionIds) {
2019
if (transactionId === syncedTransactionId) {
2120
break
2221
}
@@ -32,7 +31,8 @@ export const useLiveTransactions = (filter: (transactionResult: TransactionResul
3231
}
3332
}
3433

35-
syncedTransactionId = latestTransactionIds[0]
34+
const [latestTransactionId] = latestTransactionIds.length > 0 ? latestTransactionIds[0] : ([undefined] as const)
35+
syncedTransactionId = latestTransactionId
3636

3737
if (newTransactions.length > 0) {
3838
set(liveTransactionsAtom, (prev) => {

0 commit comments

Comments
 (0)