restructure package. Change label extraction strategy.
This commit is contained in:
+77
@@ -0,0 +1,77 @@
|
||||
// Package envelope provides types and functions for working with Nostr protocol
|
||||
// websocket messages. It defines the Envelope type representing a Nostr message
|
||||
// and offers utilities for creating, parsing, and validating standardized message
|
||||
// formats.
|
||||
package envelope
|
||||
|
||||
// Envelope represents a Nostr websocket message.
|
||||
type Envelope []byte
|
||||
|
||||
// GetLabel extracts the message label from an envelope.
|
||||
// Returns the label as a byte slice or an error if the envelope is malformed.
|
||||
func GetLabel(env Envelope) ([]byte, error) {
|
||||
// begin walking byte slice
|
||||
i, n := 0, len(env)
|
||||
|
||||
// skip whitespace before '['
|
||||
for i < n && isSpace(env[i]) {
|
||||
i++
|
||||
}
|
||||
|
||||
// expect '['
|
||||
if i >= n || env[i] != '[' {
|
||||
return nil, ErrInvalidEnvelope
|
||||
}
|
||||
i++
|
||||
|
||||
// skip whitespace before '"'
|
||||
for i < n && isSpace(env[i]) {
|
||||
i++
|
||||
}
|
||||
|
||||
// expect '"'
|
||||
if i >= n || env[i] != '"' {
|
||||
return nil, ErrInvalidEnvelope
|
||||
}
|
||||
i++
|
||||
|
||||
// scan label: [A-Z]+ terminated by '"'
|
||||
start := i
|
||||
for i < n && env[i] != '"' { // do until end or '"' is reached
|
||||
if env[i] < 'A' || env[i] > 'Z' { // character is not [A-Z]
|
||||
return nil, ErrInvalidEnvelope
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
if i == n || i == start { // a label was not found in the previous loop
|
||||
return nil, ErrInvalidEnvelope
|
||||
}
|
||||
|
||||
return env[start:i], nil
|
||||
}
|
||||
|
||||
func isSpace(b byte) bool {
|
||||
return b == ' ' || b == '\t' || b == '\n' || b == '\r'
|
||||
}
|
||||
|
||||
// GetStandardLabels returns a set of standard Nostr websocket message labels
|
||||
func GetStandardLabels() map[string]struct{} {
|
||||
return map[string]struct{}{
|
||||
"EVENT": {},
|
||||
"REQ": {},
|
||||
"CLOSE": {},
|
||||
"CLOSED": {},
|
||||
"EOSE": {},
|
||||
"NOTICE": {},
|
||||
"OK": {},
|
||||
"AUTH": {},
|
||||
}
|
||||
}
|
||||
|
||||
// IsStandardLabel checks if the given label is a standard Nostr websocket message label
|
||||
func IsStandardLabel(label string) bool {
|
||||
labels := GetStandardLabels()
|
||||
_, ok := labels[label]
|
||||
return ok
|
||||
}
|
||||
Reference in New Issue
Block a user