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 }