remove sonic from the default build, guard it under "sonic" tag for now.

This commit is contained in:
fiatjaf 2025-03-10 17:33:32 -03:00
parent 74e121075e
commit 657c6edf6c
4 changed files with 69 additions and 4 deletions

View File

@ -18,4 +18,4 @@ jobs:
with: with:
go-version-file: ./go.mod go-version-file: ./go.mod
- run: go test ./... - run: go test ./... -tags=sonic

View File

@ -26,7 +26,12 @@ var (
UnknownLabel = errors.New("unknown envelope label") UnknownLabel = errors.New("unknown envelope label")
) )
// ParseMessage parses a message into an Envelope. type MessageParser interface {
// ParseMessage parses a message into an Envelope.
ParseMessage([]byte) (Envelope, error)
}
// Deprecated: use NewMessageParser instead
func ParseMessage(message []byte) Envelope { func ParseMessage(message []byte) Envelope {
firstComma := bytes.Index(message, []byte{','}) firstComma := bytes.Index(message, []byte{','})
if firstComma == -1 { if firstComma == -1 {

54
envelopes_default.go Normal file
View File

@ -0,0 +1,54 @@
//go:build !sonic
package nostr
import (
"bytes"
"errors"
)
func NewMessageParser() MessageParser {
return messageParser{}
}
type messageParser struct{}
func (messageParser) ParseMessage(message []byte) (Envelope, error) {
firstComma := bytes.Index(message, []byte{','})
if firstComma == -1 {
return nil, errors.New("malformed json")
}
label := message[0:firstComma]
var v Envelope
switch {
case bytes.Contains(label, labelEvent):
v = &EventEnvelope{}
case bytes.Contains(label, labelReq):
v = &ReqEnvelope{}
case bytes.Contains(label, labelCount):
v = &CountEnvelope{}
case bytes.Contains(label, labelNotice):
x := NoticeEnvelope("")
v = &x
case bytes.Contains(label, labelEose):
x := EOSEEnvelope("")
v = &x
case bytes.Contains(label, labelOk):
v = &OKEnvelope{}
case bytes.Contains(label, labelAuth):
v = &AuthEnvelope{}
case bytes.Contains(label, labelClosed):
v = &ClosedEnvelope{}
case bytes.Contains(label, labelClose):
x := CloseEnvelope("")
v = &x
default:
return nil, UnknownLabel
}
if err := v.UnmarshalJSON(message); err != nil {
return nil, err
}
return v, nil
}

View File

@ -1,3 +1,5 @@
//go:build sonic
package nostr package nostr
import ( import (
@ -360,6 +362,8 @@ func (sv *sonicVisitor) OnString(v string) error {
sv.whereWeAre = inClosed sv.whereWeAre = inClosed
case "NOTICE": case "NOTICE":
sv.whereWeAre = inNotice sv.whereWeAre = inNotice
default:
return UnknownLabel
} }
// in an envelope // in an envelope
@ -483,9 +487,9 @@ type sonicMessageParser struct {
reusableIntArray []int reusableIntArray []int
} }
// NewSonicMessageParser returns a sonicMessageParser object that is intended to be reused many times. // NewMessageParser returns a sonicMessageParser object that is intended to be reused many times.
// It is not goroutine-safe. // It is not goroutine-safe.
func NewSonicMessageParser() sonicMessageParser { func NewMessageParser() sonicMessageParser {
return sonicMessageParser{ return sonicMessageParser{
reusableFilterArray: make([]Filter, 0, 1000), reusableFilterArray: make([]Filter, 0, 1000),
reusableTagArray: make([]Tag, 0, 10000), reusableTagArray: make([]Tag, 0, 10000),
@ -494,6 +498,8 @@ func NewSonicMessageParser() sonicMessageParser {
} }
} }
var NewSonicMessageParser = NewMessageParser
func (smp *sonicMessageParser) doneWithFilterSlice(slice []Filter) { func (smp *sonicMessageParser) doneWithFilterSlice(slice []Filter) {
if unsafe.SliceData(smp.reusableFilterArray) == unsafe.SliceData(slice) { if unsafe.SliceData(smp.reusableFilterArray) == unsafe.SliceData(slice) {
smp.reusableFilterArray = slice[len(slice):] smp.reusableFilterArray = slice[len(slice):]