11import { SignableENR } from '@chainsafe/enr'
22import { keys } from '@libp2p/crypto'
33import { multiaddr } from '@multiformats/multiaddr'
4- import {
5- NetworkId ,
6- TransportLayer ,
7- createPortalNetwork ,
8- DEFAULT_BOOTNODES ,
9- } from 'portalnetwork'
4+ import { NetworkId , TransportLayer , createPortalNetwork , DEFAULT_BOOTNODES } from 'portalnetwork'
105import { createDatabase } from './db'
116import { TauriUDPTransportService } from './transports'
7+ import { DEFAULT_DB_SIZE , STARTUP_DELAY_MS } from '@/utils/constants/config'
128
139import type { PortalNetwork } from 'portalnetwork'
1410import type { Multiaddr } from '@multiformats/multiaddr'
15- // const isBrowser = () => !window.__TAURI__
1611
17- const db = createDatabase ( 'network_db' , { prefix : 'portalclient_' } )
12+ let client : PortalNetwork
1813
1914export const createPortalClient = async ( port : number ) : Promise < PortalNetwork > => {
20- try {
21- const privateKey = await keys . generateKeyPair ( 'secp256k1' )
15+ const db = createDatabase ( 'db' , { prefix : 'portalclient_' } )
16+
17+ const createNetwork = async ( rebuildFromMemory : boolean ) : Promise < PortalNetwork > => {
18+ let privateKey : any
19+ if ( rebuildFromMemory ) {
20+ privateKey = await db . getPrivateKey ( )
21+ } else {
22+ privateKey = await keys . generateKeyPair ( 'secp256k1' )
23+ await db . savePrivateKey ( privateKey )
24+ }
25+
2226 const enr = SignableENR . createFromPrivateKey ( privateKey )
2327 const nodeAddr = multiaddr ( `/ip4/0.0.0.0/udp/${ port } ` )
2428 enr . setLocationMultiaddr ( nodeAddr )
25- const client = await createPortalNetwork ( {
29+
30+ return createPortalNetwork ( {
2631 transport : TransportLayer . TAURI ,
2732 supportedNetworks : [
2833 { networkId : NetworkId . HistoryNetwork } ,
2934 { networkId : NetworkId . StateNetwork } ,
3035 ] ,
3136 db,
32- dbSize : async ( ) => 1024 * 1024 * 1024 ,
37+ rebuildFromMemory,
38+ dbSize : async ( ) => DEFAULT_DB_SIZE ,
3339 config : {
3440 enr,
3541 bindAddrs : { ip4 : nodeAddr } ,
@@ -42,14 +48,23 @@ export const createPortalClient = async (port: number): Promise<PortalNetwork> =
4248 } ,
4349 } ,
4450 } )
51+ }
4552
46- await client . start ( )
47- await client . bootstrap ( )
48-
49- await new Promise ( resolve => setTimeout ( resolve , 1000 ) )
50-
51- return client
53+ try {
54+ client = await createNetwork ( true )
5255 } catch ( error ) {
53- throw error
56+ console . error ( 'Failed to create node from memory, creating from scratch:' , error )
57+ client = await createNetwork ( false )
5458 }
59+
60+ await client . start ( )
61+ await client . storeNodeDetails ( )
62+
63+ client . enableLog ( '*Portal*' )
64+
65+ // @ts -expect-error Window is available in browser
66+ window . portal = client // add portal to window to allow for direct access to portalnetwork client
67+ await new Promise ( ( resolve ) => setTimeout ( resolve , STARTUP_DELAY_MS ) )
68+
69+ return client
5570}
0 commit comments