Add periodic auto-sync with backend push events, remove refresh button
This commit is contained in:
@@ -195,6 +195,10 @@ type RPC = {
|
||||
params: {}
|
||||
response: void
|
||||
}
|
||||
setAutoSync: {
|
||||
params: { address: string; chainid: string } | null
|
||||
response: void
|
||||
}
|
||||
fetchTokenBalances: {
|
||||
params: {
|
||||
address: string
|
||||
@@ -316,7 +320,13 @@ type RPC = {
|
||||
}>
|
||||
webview: RPCSchema<{
|
||||
requests: {}
|
||||
messages: {}
|
||||
messages: {
|
||||
transfersUpdate: {
|
||||
count: number
|
||||
chainid: string
|
||||
address: string
|
||||
}
|
||||
}
|
||||
}>
|
||||
}
|
||||
|
||||
@@ -419,6 +429,9 @@ function mapTransfer(t: any): TxEntry {
|
||||
let moneroManager: MoneroWalletManager | null = null
|
||||
let moneroDownloading = false
|
||||
|
||||
let autoSyncTarget: { address: string; chainid: string } | null = null
|
||||
let autoSyncTimer: ReturnType<typeof setInterval> | null = null
|
||||
|
||||
const rpc = BrowserView.defineRPC<RPC>({
|
||||
maxRequestTime: 120000,
|
||||
handlers: {
|
||||
@@ -614,9 +627,45 @@ const rpc = BrowserView.defineRPC<RPC>({
|
||||
name: 'alchemy_key',
|
||||
})
|
||||
if (!key) return
|
||||
syncTransactionHistory(key, chainid, address).catch((e) =>
|
||||
console.error('[sync] error:', e),
|
||||
)
|
||||
try {
|
||||
const count = await syncTransactionHistory(
|
||||
key,
|
||||
chainid,
|
||||
address,
|
||||
)
|
||||
rpc.send.transfersUpdate({ count, chainid, address })
|
||||
} catch (e) {
|
||||
console.error('[sync] error:', e)
|
||||
}
|
||||
},
|
||||
setAutoSync: async (target) => {
|
||||
if (autoSyncTimer) clearInterval(autoSyncTimer)
|
||||
autoSyncTimer = null
|
||||
autoSyncTarget = null
|
||||
if (!target) return
|
||||
autoSyncTarget = target
|
||||
autoSyncTimer = setInterval(async () => {
|
||||
if (!autoSyncTarget) return
|
||||
const key = await Bun.secrets.get({
|
||||
service: 'koins',
|
||||
name: 'alchemy_key',
|
||||
})
|
||||
if (!key) return
|
||||
try {
|
||||
const count = await syncTransactionHistory(
|
||||
key,
|
||||
autoSyncTarget.chainid,
|
||||
autoSyncTarget.address,
|
||||
)
|
||||
rpc.send.transfersUpdate({
|
||||
count,
|
||||
chainid: autoSyncTarget.chainid,
|
||||
address: autoSyncTarget.address,
|
||||
})
|
||||
} catch (e) {
|
||||
console.error('[auto-sync] error:', e)
|
||||
}
|
||||
}, 30000)
|
||||
},
|
||||
flushTxCache: async () => {
|
||||
sqlite.run('DELETE FROM tx_history')
|
||||
|
||||
@@ -11,7 +11,7 @@ export const syncTransactionHistory = async (
|
||||
key: string,
|
||||
chainid: string,
|
||||
address: string,
|
||||
) => {
|
||||
): Promise<number> => {
|
||||
const addrLower = address.toLowerCase()
|
||||
|
||||
const existing = db
|
||||
@@ -39,7 +39,7 @@ export const syncTransactionHistory = async (
|
||||
},
|
||||
)
|
||||
|
||||
if (!transfers || transfers.length === 0) return
|
||||
if (!transfers || transfers.length === 0) return 0
|
||||
|
||||
const prepared: Array<typeof txHistory.$inferInsert> = []
|
||||
let latestBlock = Number(existing?.lastSyncBlock ?? '0')
|
||||
@@ -91,6 +91,8 @@ export const syncTransactionHistory = async (
|
||||
console.log(
|
||||
`[sync] ${chainid}/${addrLower}: synced ${prepared.length} transfers up to block ${latestBlock}`,
|
||||
)
|
||||
|
||||
return prepared.length
|
||||
}
|
||||
|
||||
function flush(prepared: Array<typeof txHistory.$inferInsert>) {
|
||||
|
||||
Reference in New Issue
Block a user