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