utils.go raw
1 package nostr
2
3 import (
4 "cmp"
5 "encoding/hex"
6 "net/url"
7 "strings"
8 )
9
10 // IsValidRelayURL checks if a URL is a valid relay URL (ws:// or wss://).
11 func IsValidRelayURL(u string) bool {
12 parsed, err := url.Parse(u)
13 if err != nil {
14 return false
15 }
16 if parsed.Scheme != "wss" && parsed.Scheme != "ws" {
17 return false
18 }
19 return true
20 }
21
22 // IsValid32ByteHex checks if a string is a valid 32-byte hex string.
23 func IsValid32ByteHex(thing string) bool {
24 if !isLowerHex(thing) {
25 return false
26 }
27 if len(thing) != 64 {
28 return false
29 }
30 _, err := hex.DecodeString(thing)
31 return err == nil
32 }
33
34 // CompareEvent is meant to to be used with slices.Sort
35 func CompareEvent(a, b Event) int {
36 if a.CreatedAt == b.CreatedAt {
37 return strings.Compare(a.ID, b.ID)
38 }
39 return cmp.Compare(a.CreatedAt, b.CreatedAt)
40 }
41
42 // CompareEventReverse is meant to to be used with slices.Sort
43 func CompareEventReverse(b, a Event) int {
44 if a.CreatedAt == b.CreatedAt {
45 return strings.Compare(a.ID, b.ID)
46 }
47 return cmp.Compare(a.CreatedAt, b.CreatedAt)
48 }
49
50 // CompareEventPtr is meant to to be used with slices.Sort
51 func CompareEventPtr(a, b *Event) int {
52 if a == nil {
53 if b == nil {
54 return 0
55 } else {
56 return -1
57 }
58 } else if b == nil {
59 return 1
60 }
61
62 if a.CreatedAt == b.CreatedAt {
63 return strings.Compare(a.ID, b.ID)
64 }
65 return cmp.Compare(a.CreatedAt, b.CreatedAt)
66 }
67
68 // CompareEventPtrReverse is meant to to be used with slices.Sort
69 func CompareEventPtrReverse(b, a *Event) int {
70 if a == nil {
71 if b == nil {
72 return 0
73 } else {
74 return -1
75 }
76 } else if b == nil {
77 return 1
78 }
79
80 if a.CreatedAt == b.CreatedAt {
81 return strings.Compare(a.ID, b.ID)
82 }
83 return cmp.Compare(a.CreatedAt, b.CreatedAt)
84 }
85