fetch.go raw

   1  package relayinfo
   2  
   3  import (
   4  	"context"
   5  	"encoding/json"
   6  	"io"
   7  	"net/http"
   8  	"time"
   9  
  10  	"next.orly.dev/pkg/nostr/utils/normalize"
  11  	"next.orly.dev/pkg/lol/chk"
  12  	"next.orly.dev/pkg/lol/errorf"
  13  )
  14  
  15  // Fetch fetches the NIP-11 Info.
  16  func Fetch(c context.Context, u []byte) (info *T, err error) {
  17  	if _, ok := c.Deadline(); !ok {
  18  		// if no timeout is set, force it to 7 seconds
  19  		var cancel context.CancelFunc
  20  		c, cancel = context.WithTimeout(c, 7*time.Second)
  21  		defer cancel()
  22  	}
  23  	u = normalize.URL(u)
  24  	var req *http.Request
  25  	if req, err = http.NewRequestWithContext(
  26  		c, http.MethodGet, string(u), nil,
  27  	); chk.E(err) {
  28  		return
  29  	}
  30  	// add the NIP-11 header
  31  	req.Header.Add("Accept", "application/nostr+json")
  32  	// send the response
  33  	var resp *http.Response
  34  	if resp, err = http.DefaultClient.Do(req); chk.E(err) {
  35  		err = errorf.E("request failed: %w", err)
  36  		return
  37  	}
  38  	defer chk.E(resp.Body.Close())
  39  	var b []byte
  40  	if b, err = io.ReadAll(resp.Body); chk.E(err) {
  41  		return
  42  	}
  43  	info = &T{}
  44  	if err = json.Unmarshal(b, info); chk.E(err) {
  45  		return
  46  	}
  47  	return
  48  }
  49