github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/rpc/get_meta.go (about)

     1  // Copyright 2021 The TrueBlocks Authors. All rights reserved.
     2  // Use of this source code is governed by a license that can
     3  // be found in the LICENSE file.
     4  
     5  package rpc
     6  
     7  import (
     8  	"context"
     9  
    10  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base"
    11  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types"
    12  	"github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/walk"
    13  )
    14  
    15  // TODO: use types.MetaData throughout
    16  
    17  func (conn *Connection) GetMetaData(testmode bool) (*types.MetaData, error) {
    18  	chainId, networkId, err := conn.GetClientIDs()
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	if testmode {
    24  		return &types.MetaData{
    25  			Unripe:    0xdeadbeef,
    26  			Ripe:      0xdeadbeef,
    27  			Staging:   0xdeadbeef,
    28  			Finalized: 0xdeadbeef,
    29  			Latest:    0xdeadbeef,
    30  			Chain:     conn.Chain,
    31  			ChainId:   chainId,
    32  			NetworkId: networkId,
    33  		}, nil
    34  	}
    35  
    36  	var meta types.MetaData
    37  	meta.Chain = conn.Chain
    38  	meta.ChainId = chainId
    39  	meta.NetworkId = networkId
    40  	meta.Latest = conn.GetLatestBlockNumber()
    41  
    42  	filenameChan := make(chan walk.CacheFileInfo)
    43  
    44  	var nRoutines = 4
    45  	go walk.WalkCacheFolder(context.Background(), conn.Chain, walk.Index_Bloom, nil, filenameChan)
    46  	go walk.WalkCacheFolder(context.Background(), conn.Chain, walk.Index_Staging, nil, filenameChan)
    47  	go walk.WalkCacheFolder(context.Background(), conn.Chain, walk.Index_Ripe, nil, filenameChan)
    48  	go walk.WalkCacheFolder(context.Background(), conn.Chain, walk.Index_Unripe, nil, filenameChan)
    49  
    50  	for result := range filenameChan {
    51  		switch result.Type {
    52  		case walk.Index_Bloom:
    53  			fallthrough
    54  		case walk.Index_Final:
    55  			meta.Finalized = base.Max(meta.Finalized, result.FileRange.Last)
    56  		case walk.Index_Staging:
    57  			meta.Staging = base.Max(meta.Staging, result.FileRange.Last)
    58  		case walk.Index_Ripe:
    59  			meta.Ripe = base.Max(meta.Ripe, result.FileRange.Last)
    60  		case walk.Index_Unripe:
    61  			meta.Unripe = base.Max(meta.Unripe, result.FileRange.Last)
    62  		case walk.Cache_NotACache:
    63  			nRoutines--
    64  			if nRoutines == 0 {
    65  				close(filenameChan)
    66  			}
    67  		}
    68  	}
    69  
    70  	if meta.Staging == 0 {
    71  		meta.Staging = meta.Finalized
    72  	}
    73  	meta.Ripe = base.Max(meta.Staging, meta.Ripe)
    74  	meta.Unripe = base.Max(meta.Ripe, meta.Unripe)
    75  
    76  	return &meta, nil
    77  }