github.com/storacha/go-ucanto@v0.7.2/server/retrieval/handler.go (about)

     1  package retrieval
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/storacha/go-ucanto/core/invocation"
     7  	"github.com/storacha/go-ucanto/core/ipld"
     8  	"github.com/storacha/go-ucanto/core/receipt/fx"
     9  	"github.com/storacha/go-ucanto/core/result"
    10  	"github.com/storacha/go-ucanto/core/result/failure"
    11  	"github.com/storacha/go-ucanto/server"
    12  	"github.com/storacha/go-ucanto/server/transaction"
    13  	"github.com/storacha/go-ucanto/ucan"
    14  	"github.com/storacha/go-ucanto/validator"
    15  )
    16  
    17  // HandlerFunc is an invocation handler function. It is different to
    18  // [server.HandlerFunc] in that it allows an [Response] to be returned,
    19  // which for a retrieval server will determine the HTTP headers and body content
    20  // of the HTTP response. The usual handler response (out and effects) are added
    21  // to the X-Agent-Message HTTP header.
    22  type HandlerFunc[C any, O ipld.Builder, X failure.IPLDBuilderFailure] func(
    23  	ctx context.Context,
    24  	capability ucan.Capability[C],
    25  	invocation invocation.Invocation,
    26  	context server.InvocationContext,
    27  	request Request,
    28  ) (result result.Result[O, X], fx fx.Effects, resp Response, err error)
    29  
    30  // Provide is used to define given capability provider. It decorates the passed
    31  // handler and takes care of UCAN validation. It only calls the handler
    32  // when validation succeeds.
    33  func Provide[C any, O ipld.Builder, X failure.IPLDBuilderFailure](
    34  	capability validator.CapabilityParser[C],
    35  	handler HandlerFunc[C, O, X],
    36  ) ServiceMethod[O, failure.IPLDBuilderFailure] {
    37  	return func(ctx context.Context, inv invocation.Invocation, ictx server.InvocationContext, req Request) (transaction.Transaction[O, failure.IPLDBuilderFailure], Response, error) {
    38  		var response Response
    39  		method := server.Provide(capability, func(ctx context.Context, capability ucan.Capability[C], inv invocation.Invocation, ictx server.InvocationContext) (result.Result[O, X], fx.Effects, error) {
    40  			out, fx, res, err := handler(ctx, capability, inv, ictx, req)
    41  			response = res
    42  			return out, fx, err
    43  		})
    44  		tx, err := method(ctx, inv, ictx)
    45  		return tx, response, err
    46  	}
    47  }