package runtraversal import ( "bytes" "io" ld "gitlab.dms3.io/ld/go-ld-prime" "gitlab.dms3.io/ld/go-ld-prime/traversal" "gitlab.dms3.io/dms3/go-graphsync/ldutil" ) // ResponseSender sends responses over the network type ResponseSender func( link ld.Link, data []byte, ) error // RunTraversal wraps a given loader with an interceptor that sends loaded // blocks out to the network with the given response sender. func RunTraversal( loader ld.BlockReadOpener, traverser ldutil.Traverser, sendResponse ResponseSender) error { for { isComplete, err := traverser.IsComplete() if isComplete { return err } lnk, lnkCtx := traverser.CurrentRequest() result, err := loader(lnkCtx, lnk) var data []byte if err != nil { traverser.Error(traversal.SkipMe{}) } else { blockBuffer, ok := result.(*bytes.Buffer) if !ok { blockBuffer = new(bytes.Buffer) _, err = io.Copy(blockBuffer, result) } if err != nil { traverser.Error(err) } else { data = blockBuffer.Bytes() err = traverser.Advance(blockBuffer) if err != nil { return err } } } err = sendResponse(lnk, data) if err != nil { return err } } }