Skip to content

Commit

Permalink
feat: add download block link to inspect page (#1312)
Browse files Browse the repository at this point in the history
  • Loading branch information
dirkmc authored Apr 5, 2023
1 parent 8f18a44 commit 9842435
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 8 deletions.
46 changes: 46 additions & 0 deletions gql/serve_download.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package gql

import (
"context"
"fmt"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-libipfs/blocks"
"net/http"
)

const downloadBlockPath = "/download/block/"

type BlockGetter interface {
Get(context.Context, cid.Cid) (blocks.Block, error)
}

// Serve downloads of raw blocks (for debugging purposes)
func serveDownload(ctx context.Context, mux *http.ServeMux, bstore BlockGetter) {
mux.HandleFunc(downloadBlockPath, func(writer http.ResponseWriter, request *http.Request) {
if len(request.URL.Path) <= len(downloadBlockPath) {
writeError(writer, fmt.Sprintf("url path too short: "+request.URL.Path))
return
}

cidstr := request.URL.Path[len(downloadBlockPath):]
c, err := cid.Parse(cidstr)
if err != nil {
writeError(writer, fmt.Sprintf("parsing payload cid "+cidstr+": "+err.Error()))
return
}

blk, err := bstore.Get(ctx, c)
if err != nil {
writeError(writer, fmt.Sprintf("getting block "+cidstr+": "+err.Error()))
return
}

writer.Header().Set("Content-Type", "application/vnd.ipld.raw")
_, _ = writer.Write(blk.RawData())
})
}

func writeError(writer http.ResponseWriter, s string) {
_, _ = writer.Write([]byte(s))
writer.WriteHeader(http.StatusBadRequest)
}
12 changes: 9 additions & 3 deletions gql/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ var log = logging.Logger("gql")

type Server struct {
resolver *resolver
bstore BlockGetter
srv *http.Server
wg sync.WaitGroup
}

func NewServer(resolver *resolver) *Server {
return &Server{resolver: resolver}
func NewServer(resolver *resolver, bstore BlockGetter) *Server {
return &Server{resolver: resolver, bstore: bstore}
}

//go:embed schema.graphql
Expand Down Expand Up @@ -57,11 +58,15 @@ func (s *Server) Start(ctx context.Context) error {
// Allow resolving directly to fields (instead of requiring resolvers to
// have a method for every GraphQL field)
opts := []graphql.SchemaOpt{graphql.UseFieldResolvers()}
schema, err := graphql.ParseSchema(string(schemaGraqhql), s.resolver, opts...)
schema, err := graphql.ParseSchema(schemaGraqhql, s.resolver, opts...)
if err != nil {
return err
}

// Serve /downloads (for downloading raw data for debugging purposes)
srvCtx, cancelSrvCtx := context.WithCancel(context.Background())
serveDownload(srvCtx, mux, s.bstore)

// GraphQL handler
queryHandler := &relay.Handler{Schema: schema}
wsOpts := []graphqlws.Option{
Expand All @@ -81,6 +86,7 @@ func (s *Server) Start(ctx context.Context) error {
s.wg.Add(1)
go func() {
defer s.wg.Done()
defer cancelSrvCtx()

if err := s.srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("gql.ListenAndServe(): %v", err)
Expand Down
1 change: 1 addition & 0 deletions node/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,7 @@ func ConfigBoost(cfg *config.Boost) Option {
Override(new(*storagemarket.Provider), modules.NewStorageMarketProvider(walletMiner, cfg)),

// GraphQL server
Override(new(gql.BlockGetter), From(new(dtypes.IndexBackedBlockstore))),
Override(new(*gql.Server), modules.NewGraphqlServer(cfg)),

// Tracing
Expand Down
7 changes: 4 additions & 3 deletions node/modules/storageminer.go
Original file line number Diff line number Diff line change
Expand Up @@ -624,14 +624,15 @@ func NewStorageMarketProvider(provAddr address.Address, cfg *config.Boost) func(
}
}

func NewGraphqlServer(cfg *config.Boost) func(lc fx.Lifecycle, r repo.LockedRepo, h host.Host, prov *storagemarket.Provider, dealsDB *db.DealsDB, logsDB *db.LogsDB, retDB *rtvllog.RetrievalLogDB, plDB *db.ProposalLogsDB, fundsDB *db.FundsDB, fundMgr *fundmanager.FundManager, storageMgr *storagemanager.StorageManager, publisher *storageadapter.DealPublisher, spApi sealingpipeline.API, legacyProv gfm_storagemarket.StorageProvider, legacyDT dtypes.ProviderDataTransfer, ps dtypes.ProviderPieceStore, sa retrievalmarket.SectorAccessor, dagst dagstore.Interface, fullNode v1api.FullNode) *gql.Server {
func NewGraphqlServer(cfg *config.Boost) func(lc fx.Lifecycle, r repo.LockedRepo, h host.Host, prov *storagemarket.Provider, dealsDB *db.DealsDB, logsDB *db.LogsDB, retDB *rtvllog.RetrievalLogDB, plDB *db.ProposalLogsDB, fundsDB *db.FundsDB, fundMgr *fundmanager.FundManager, storageMgr *storagemanager.StorageManager, publisher *storageadapter.DealPublisher, spApi sealingpipeline.API, legacyProv gfm_storagemarket.StorageProvider, legacyDT dtypes.ProviderDataTransfer, ps dtypes.ProviderPieceStore, sa retrievalmarket.SectorAccessor, dagst dagstore.Interface, fullNode v1api.FullNode, bg gql.BlockGetter) *gql.Server {
return func(lc fx.Lifecycle, r repo.LockedRepo, h host.Host, prov *storagemarket.Provider, dealsDB *db.DealsDB, logsDB *db.LogsDB, retDB *rtvllog.RetrievalLogDB, plDB *db.ProposalLogsDB, fundsDB *db.FundsDB, fundMgr *fundmanager.FundManager,
storageMgr *storagemanager.StorageManager, publisher *storageadapter.DealPublisher, spApi sealingpipeline.API,
legacyProv gfm_storagemarket.StorageProvider, legacyDT dtypes.ProviderDataTransfer,
ps dtypes.ProviderPieceStore, sa retrievalmarket.SectorAccessor, dagst dagstore.Interface, fullNode v1api.FullNode) *gql.Server {
ps dtypes.ProviderPieceStore, sa retrievalmarket.SectorAccessor, dagst dagstore.Interface,
fullNode v1api.FullNode, bg gql.BlockGetter) *gql.Server {

resolver := gql.NewResolver(cfg, r, h, dealsDB, logsDB, retDB, plDB, fundsDB, fundMgr, storageMgr, spApi, prov, legacyProv, legacyDT, ps, sa, dagst, publisher, fullNode)
server := gql.NewServer(resolver)
server := gql.NewServer(resolver, bg)

lc.Append(fx.Hook{
OnStart: server.Start,
Expand Down
8 changes: 8 additions & 0 deletions react/src/Inspect.css
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,12 @@

.inspect > p {
padding: 2em 1em;
}

.inspect a.download {
background-image: url("./bootstrap-icons/icons/download.svg");
background-position: left;
background-repeat: no-repeat;
padding-left: 1.25em;
margin-left: 1em;
}
14 changes: 12 additions & 2 deletions react/src/Inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,23 @@ function PieceStatus({pieceCid, pieceStatus, searchQuery}) {
{searchIsPayloadCid ? (
<tr key="payload cid">
<th>Searched CID (non-root)</th>
<td>{searchQuery}</td>
<td>
<span>{searchQuery}</span>
<a className="download" target="_blank" href={"/download/block/"+searchQuery}>
Download block
</a>
</td>
</tr>
) : null}
{rootCid ? (
<tr key="data root cid">
<th>Data Root CID</th>
<td>{rootCid}</td>
<td>
<span>{rootCid}</span>
<a className="download" target="_blank" href={"/download/block/"+searchQuery}>
Download block
</a>
</td>
</tr>
) : null}
<tr key="piece cid">
Expand Down

0 comments on commit 9842435

Please sign in to comment.