|
1 | 1 | import { remote } from 'electron'
|
2 | 2 | import { initConnection as initAddressConnection } from 'database/address/ormconfig'
|
3 |
| -import AddressService from 'services/addresses' |
4 |
| -import LockUtils from 'models/lock-utils' |
5 | 3 | import AddressesUsedSubject from 'models/subjects/addresses-used-subject'
|
6 |
| -import BlockListener from 'services/sync/block-listener' |
7 | 4 | import { NetworkWithID } from 'services/networks'
|
8 | 5 | import { register as registerTxStatusListener } from 'listeners/tx-status'
|
9 | 6 | import { register as registerAddressListener } from 'listeners/address'
|
| 7 | +import IndexerRPC from 'services/indexer/indexer-rpc' |
| 8 | +import Utils from 'services/sync/utils' |
10 | 9 |
|
11 |
| -import { initDatabase } from './init-database' |
| 10 | +import { switchNetwork as syncSwitchNetwork } from './sync' |
| 11 | +import { switchNetwork as indexerSwitchNetwork } from './indexer' |
12 | 12 |
|
13 | 13 | // register to listen address updates
|
14 | 14 | registerAddressListener()
|
15 | 15 |
|
16 |
| -const { |
17 |
| - nodeService, |
18 |
| - addressDbChangedSubject, |
19 |
| - addressesUsedSubject, |
20 |
| - databaseInitSubject, |
21 |
| - walletCreatedSubject, |
22 |
| -} = remote.require('./startup/sync-block-task/params') |
| 16 | +const { addressesUsedSubject, databaseInitSubject } = remote.require('./startup/sync-block-task/params') |
23 | 17 |
|
24 | 18 | // pass to task a main process subject
|
25 | 19 | AddressesUsedSubject.setSubject(addressesUsedSubject)
|
26 | 20 |
|
27 |
| -// maybe should call this every time when new address generated |
28 |
| -// load all addresses and convert to lockHashes |
29 |
| -export const loadAddressesAndConvert = async (): Promise<string[]> => { |
30 |
| - const addresses: string[] = (await AddressService.allAddresses()).map(addr => addr.address) |
31 |
| - const lockHashes: string[] = await LockUtils.addressesToAllLockHashes(addresses) |
32 |
| - return lockHashes |
33 |
| -} |
34 |
| - |
35 |
| -// call this after network switched |
36 |
| -let blockListener: BlockListener | undefined |
37 |
| -export const switchNetwork = async () => { |
38 |
| - // stop all blocks service |
39 |
| - if (blockListener) { |
40 |
| - await blockListener.stopAndWait() |
| 21 | +export const testIndexer = async (): Promise<boolean> => { |
| 22 | + const indexerRPC = new IndexerRPC() |
| 23 | + try { |
| 24 | + await Utils.retry(3, 100, () => { |
| 25 | + return indexerRPC.getLockHashIndexStates() |
| 26 | + }) |
| 27 | + return true |
| 28 | + } catch { |
| 29 | + return false |
41 | 30 | }
|
42 |
| - |
43 |
| - // disconnect old connection and connect to new database |
44 |
| - await initDatabase() |
45 |
| - // load lockHashes |
46 |
| - const lockHashes: string[] = await loadAddressesAndConvert() |
47 |
| - // start sync blocks service |
48 |
| - blockListener = new BlockListener(lockHashes, nodeService.tipNumberSubject) |
49 |
| - |
50 |
| - addressDbChangedSubject.subscribe(async (event: string) => { |
51 |
| - // ignore update and remove |
52 |
| - if (event === 'AfterInsert') { |
53 |
| - const hashes: string[] = await loadAddressesAndConvert() |
54 |
| - if (blockListener) { |
55 |
| - blockListener.setLockHashes(hashes) |
56 |
| - } |
57 |
| - } |
58 |
| - }) |
59 |
| - |
60 |
| - const regenerateListener = async () => { |
61 |
| - if (blockListener) { |
62 |
| - await blockListener.stopAndWait() |
63 |
| - } |
64 |
| - // wait former queue to be drained |
65 |
| - const hashes: string[] = await loadAddressesAndConvert() |
66 |
| - blockListener = new BlockListener(hashes, nodeService.tipNumberSubject) |
67 |
| - await blockListener.start(true) |
68 |
| - } |
69 |
| - |
70 |
| - walletCreatedSubject.subscribe(async (type: string) => { |
71 |
| - if (type === 'import') { |
72 |
| - await regenerateListener() |
73 |
| - } |
74 |
| - }) |
75 |
| - |
76 |
| - blockListener.start() |
77 | 31 | }
|
78 | 32 |
|
79 | 33 | export const run = async () => {
|
80 | 34 | await initAddressConnection()
|
81 | 35 | databaseInitSubject.subscribe(async (network: NetworkWithID | undefined) => {
|
82 | 36 | if (network) {
|
83 |
| - await switchNetwork() |
| 37 | + const indexerEnable = await testIndexer() |
| 38 | + if (indexerEnable) { |
| 39 | + await indexerSwitchNetwork() |
| 40 | + } else { |
| 41 | + await syncSwitchNetwork() |
| 42 | + } |
84 | 43 | }
|
85 | 44 | })
|
86 | 45 | registerTxStatusListener()
|
|
0 commit comments