From 4cffa8607248386821ec0b447fe46a6ee9be17ed Mon Sep 17 00:00:00 2001 From: mleku Date: Thu, 24 Apr 2025 07:15:53 -0106 Subject: [PATCH] refactor ok,false envelopes to be even sleeker --- config/config.go | 2 +- envelopes/authenvelope/authenvelope.go | 2 + envelopes/eid/eid.go | 5 ++ envelopes/eventenvelope/eventenvelope.go | 4 ++ socketapi/handleAuth.go | 21 +++---- socketapi/handleEvent.go | 46 +++++++------- socketapi/ok.go | 79 ++++++++++++------------ 7 files changed, 84 insertions(+), 75 deletions(-) create mode 100644 envelopes/eid/eid.go diff --git a/config/config.go b/config/config.go index 20c4261..572f7b4 100644 --- a/config/config.go +++ b/config/config.go @@ -19,7 +19,7 @@ import ( type C struct { AppName string `env:"APP_NAME" default:"realy"` Listen string `env:"LISTEN" default:"0.0.0.0" usage:"network listen address"` - Port int `env:"PORT" default:"8080" usage:"network listen port"` + Port int `env:"PORT" default:"3334" usage:"network listen port"` Pprof bool `env:"PPROF" default:"false" usage:"enable pprof on 127.0.0.1:6060"` } diff --git a/envelopes/authenvelope/authenvelope.go b/envelopes/authenvelope/authenvelope.go index f5837a2..560293c 100644 --- a/envelopes/authenvelope/authenvelope.go +++ b/envelopes/authenvelope/authenvelope.go @@ -103,6 +103,8 @@ func NewResponse() *Response { return &Response{} } // NewResponseWith creates a new Response with a provided event.T. func NewResponseWith(event *event.T) *Response { return &Response{Event: event} } +func (en *Response) Id() []byte { return en.Event.Id } + // Label returns the label of a auth Response envelope. func (en *Response) Label() string { return L } diff --git a/envelopes/eid/eid.go b/envelopes/eid/eid.go new file mode 100644 index 0000000..4ef65ac --- /dev/null +++ b/envelopes/eid/eid.go @@ -0,0 +1,5 @@ +package eid + +type Ider interface { + Id() []byte +} diff --git a/envelopes/eventenvelope/eventenvelope.go b/envelopes/eventenvelope/eventenvelope.go index 581adde..47a3533 100644 --- a/envelopes/eventenvelope/eventenvelope.go +++ b/envelopes/eventenvelope/eventenvelope.go @@ -29,6 +29,8 @@ func NewSubmission() *Submission { return &Submission{T: &event.T{}} } // NewSubmissionWith creates a new eventenvelope.Submission with a provided event.T. func NewSubmissionWith(ev *event.T) *Submission { return &Submission{T: ev} } +func (en *Submission) Id() []byte { return en.T.Id } + // Label returns the label of a event eventenvelope.Submission envelope. func (en *Submission) Label() string { return L } @@ -99,6 +101,8 @@ func NewResultWith[V string | []byte](s V, ev *event.T) (res *Result, err error) return &Result{subscription.MustNew(s), ev}, nil } +func (en *Result) Id() []byte { return en.Event.Id } + // Label returns the label of a event eventenvelope.Result envelope. func (en *Result) Label() string { return L } diff --git a/socketapi/handleAuth.go b/socketapi/handleAuth.go index 0c82208..8d63401 100644 --- a/socketapi/handleAuth.go +++ b/socketapi/handleAuth.go @@ -10,19 +10,17 @@ import ( "realy.mleku.dev/reason" ) -func (a *A) HandleAuth(req []byte, - srv interfaces.Server) (msg []byte) { - +func (a *A) HandleAuth(b []byte, srv interfaces.Server) (msg []byte) { if srv.AuthRequired() || len(srv.Owners()) > 0 { svcUrl := srv.ServiceURL(a.Listener.Req()) if svcUrl == "" { return } - log.T.F("received auth response,%s", req) + log.T.F("received auth response,%s", b) var err error var rem []byte env := authenvelope.NewResponse() - if rem, err = env.Unmarshal(req); chk.E(err) { + if rem, err = env.Unmarshal(b); chk.E(err) { return } if len(rem) > 0 { @@ -32,20 +30,17 @@ func (a *A) HandleAuth(req []byte, if valid, err = auth.Validate(env.Event, []byte(a.Listener.Challenge()), svcUrl); chk.E(err) { e := err.Error() - if err = okenvelope.NewFrom(env.Event.Id, false, - reason.Error.F(err.Error())).Write(a.Listener); chk.E(err) { - return []byte(err.Error()) + if err = Ok.Error(a, env, e); chk.E(err) { + return []byte(e) } return reason.Error.F(e) } else if !valid { - if err = okenvelope.NewFrom(env.Event.Id, false, - reason.Error.F("failed to authenticate")).Write(a.Listener); chk.E(err) { - return []byte(err.Error()) + if err = Ok.Error(a, env, "failed to authenticate"); chk.E(err) { + return } return reason.Restricted.F("auth response does not validate") } else { - if err = okenvelope.NewFrom(env.Event.Id, true, - []byte{}).Write(a.Listener); chk.E(err) { + if err = okenvelope.NewFrom(env.Event.Id, true).Write(a.Listener); chk.E(err) { return } log.D.F("%s authed to pubkey,%0x", a.Listener.RealRemote(), env.Event.Pubkey) diff --git a/socketapi/handleEvent.go b/socketapi/handleEvent.go index 2e3d239..e7a6afb 100644 --- a/socketapi/handleEvent.go +++ b/socketapi/handleEvent.go @@ -16,7 +16,6 @@ import ( "realy.mleku.dev/kind" "realy.mleku.dev/log" "realy.mleku.dev/realy/interfaces" - "realy.mleku.dev/reason" "realy.mleku.dev/sha256" "realy.mleku.dev/store" "realy.mleku.dev/tag" @@ -55,7 +54,7 @@ func (a *A) HandleEvent(c context.T, req []byte, srv interfaces.Server, var reason []byte ok, reason = srv.AddEvent(c, env.T, a.Listener.Req(), a.Listener.AuthedBytes(), remote) log.T.F("event added %v", ok) - if err = okenvelope.NewFrom(env.Id, ok, reason).Write(a.Listener); chk.E(err) { + if err = okenvelope.NewFrom(env.Id(), ok, reason).Write(a.Listener); chk.E(err) { return } if after != nil { @@ -65,20 +64,20 @@ func (a *A) HandleEvent(c context.T, req []byte, srv interfaces.Server, } func (a *A) VerifyEvent(env *eventenvelope.Submission) (err error) { - if !bytes.Equal(env.GetIDBytes(), env.Id) { - if err = a.Invalid(env, "event id is computed incorrectly"); chk.E(err) { + if !bytes.Equal(env.GetIDBytes(), env.Id()) { + if err = Ok.Invalid(a, env, "event id is computed incorrectly"); chk.E(err) { return } return } var ok bool if ok, err = env.Verify(); chk.T(err) { - if err = a.Error(env, "failed to verify signature", err); chk.T(err) { + if err = Ok.Error(a, env, "failed to verify signature", err); chk.T(err) { return } return } else if !ok { - if err = a.Error(env, "signature is invalid", err); chk.T(err) { + if err = Ok.Error(a, env, "signature is invalid", err); chk.T(err) { return } return @@ -88,7 +87,7 @@ func (a *A) VerifyEvent(env *eventenvelope.Submission) (err error) { func (a *A) HandleRejectEvent(env *eventenvelope.Submission, notice string) (err error) { if strings.Contains(notice, "mute") { - if err = a.Blocked(env, notice); chk.E(err) { + if err = Ok.Blocked(a, env, notice); chk.E(err) { return } } else { @@ -101,12 +100,12 @@ func (a *A) HandleRejectEvent(env *eventenvelope.Submission, notice string) (err if err = authenvelope.NewChallengeWith(a.Listener.Challenge()).Write(a.Listener); chk.T(err) { return } - if err = a.AuthRequired(env, "auth required for storing events"); chk.E(err) { + if err = Ok.AuthRequired(a, env, "auth required for storing events"); chk.E(err) { return } return } - if err = a.Invalid(env, notice); chk.E(err) { + if err = Ok.Invalid(a, env, notice); chk.E(err) { return } return @@ -125,14 +124,14 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) } res, err = sto.QueryEvents(c, &filter.T{IDs: tag.New(evId)}) if err != nil { - if err = a.Ok("failed to query for target event", reason.Error, env); chk.T(err) { + if err = Ok.Error(a, env, "failed to query for target event"); chk.T(err) { return } return } for i := range res { if res[i].Kind.Equal(kind.Deletion) { - if err = a.Blocked(env, + if err = Ok.Blocked(a, env, "not processing or storing delete event containing delete event references", ); chk.E(err) { return @@ -140,7 +139,7 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) return } if !bytes.Equal(res[i].Pubkey, env.T.Pubkey) { - if err = a.Blocked(env, + if err = Ok.Blocked(a, env, "cannot delete other users' events (delete by e tag)", ); chk.E(err) { return @@ -155,14 +154,14 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) } var pk []byte if pk, err = hex.DecAppend(nil, split[1]); chk.E(err) { - if err = a.Invalid(env, + if err = Ok.Invalid(a, env, "delete event a tag pubkey value invalid: %s", t.Value()); chk.T(err) { } return } kin := ints.New(uint16(0)) if _, err = kin.Unmarshal(split[0]); chk.E(err) { - if err = a.Invalid(env, + if err = Ok.Invalid(a, env, "delete event a tag kind value invalid: %s", t.Value()); chk.T(err) { return } @@ -170,13 +169,13 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) } kk := kind.New(kin.Uint16()) if kk.Equal(kind.Deletion) { - if err = a.Blocked(env, "delete event kind may not be deleted"); chk.E(err) { + if err = Ok.Blocked(a, env, "delete event kind may not be deleted"); chk.E(err) { return } return } if !kk.IsParameterizedReplaceable() { - if err = a.Error(env, + if err = Ok.Error(a, env, "delete tags with a tags containing non-parameterized-replaceable events cannot be processed"); chk.E(err) { return } @@ -184,7 +183,7 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) } if !bytes.Equal(pk, env.T.Pubkey) { log.I.S(pk, env.T.Pubkey, env.T) - if err = a.Blocked(env, + if err = Ok.Blocked(a, env, "cannot delete other users' events (delete by a tag)"); chk.E(err) { return } @@ -195,7 +194,8 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) f.Authors.Append(pk) f.Tags.AppendTags(tag.New([]byte{'#', 'd'}, split[2])) if res, err = sto.QueryEvents(c, f); err != nil { - if err = a.Error(env, "failed to query for target event", err); chk.T(err) { + if err = Ok.Error(a, env, + "failed to query for target event"); chk.T(err) { return } return @@ -222,7 +222,7 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) } res = nil } - if err = okenvelope.NewFrom(env.Id, true).Write(a.Listener); chk.E(err) { + if err = okenvelope.NewFrom(env.Id(), true).Write(a.Listener); chk.E(err) { return } return @@ -230,12 +230,12 @@ func (a *A) CheckDelete(c context.T, env *eventenvelope.Submission, sto store.I) func (a *A) ProcessDelete(c context.T, target *event.T, env *eventenvelope.Submission, sto store.I) (skip bool, err error) { if target.Kind.K == kind.Deletion.K { - if err = a.Error(env, "cannot delete delete event %s", env.Id); chk.E(err) { + if err = Ok.Error(a, env, "cannot delete delete event %s", env.Id); chk.E(err) { return } } if target.CreatedAt.Int() > env.T.CreatedAt.Int() { - if err = a.Error(env, + if err = Ok.Error(a, env, "not deleting\n%d%\nbecause delete event is older\n%d", target.CreatedAt.Int(), env.T.CreatedAt.Int()); chk.E(err) { return @@ -243,13 +243,13 @@ func (a *A) ProcessDelete(c context.T, target *event.T, env *eventenvelope.Submi skip = true } if !bytes.Equal(target.Pubkey, env.Pubkey) { - if err = a.Error(env, "only author can delete event"); chk.E(err) { + if err = Ok.Error(a, env, "only author can delete event"); chk.E(err) { return } return } if err = sto.DeleteEvent(c, target.EventId()); chk.T(err) { - if err = a.Error(env, err.Error()); chk.T(err) { + if err = Ok.Error(a, env, err.Error()); chk.T(err) { return } return diff --git a/socketapi/ok.go b/socketapi/ok.go index 7237893..75945ac 100644 --- a/socketapi/ok.go +++ b/socketapi/ok.go @@ -1,48 +1,51 @@ package socketapi import ( - "realy.mleku.dev/envelopes/eventenvelope" + "realy.mleku.dev/envelopes/eid" "realy.mleku.dev/envelopes/okenvelope" "realy.mleku.dev/reason" ) -func (a *A) Ok(format string, prefix reason.R, env *eventenvelope.Submission, params ...any) (err error) { - err = okenvelope.NewFrom(env.Id, false, prefix.F(format, params...)).Write(a.Listener) - return +type OK func(a *A, env eid.Ider, format string, params ...any) (err error) + +type OKs struct { + AuthRequired OK + PoW OK + Duplicate OK + Blocked OK + RateLimited OK + Invalid OK + Error OK + Unsupported OK + Restricted OK } -func (a *A) AuthRequired(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.AuthRequired.F(format, params...)).Write(a.Listener) -} - -func (a *A) PoW(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.PoW.F(format, params...)).Write(a.Listener) -} - -func (a *A) Duplicate(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Duplicate.F(format, params...)).Write(a.Listener) -} - -func (a *A) Blocked(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Blocked.F(format, params...)).Write(a.Listener) -} - -func (a *A) RateLimited(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.RateLimited.F(format, params...)).Write(a.Listener) -} - -func (a *A) Invalid(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Invalid.F(format, params...)).Write(a.Listener) -} - -func (a *A) Error(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Error.F(format, params...)).Write(a.Listener) -} - -func (a *A) Unsupported(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Unsupported.F(format, params...)).Write(a.Listener) -} - -func (a *A) Restricted(env *eventenvelope.Submission, format string, params ...any) (err error) { - return okenvelope.NewFrom(env.Id, false, reason.Restricted.F(format, params...)).Write(a.Listener) +var Ok = OKs{ + AuthRequired: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.AuthRequired.F(format, params...)).Write(a.Listener) + }, + PoW: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.PoW.F(format, params...)).Write(a.Listener) + }, + Duplicate: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Duplicate.F(format, params...)).Write(a.Listener) + }, + Blocked: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Blocked.F(format, params...)).Write(a.Listener) + }, + RateLimited: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.RateLimited.F(format, params...)).Write(a.Listener) + }, + Invalid: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Invalid.F(format, params...)).Write(a.Listener) + }, + Error: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Error.F(format, params...)).Write(a.Listener) + }, + Unsupported: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Unsupported.F(format, params...)).Write(a.Listener) + }, + Restricted: func(a *A, env eid.Ider, format string, params ...any) (err error) { + return okenvelope.NewFrom(env.Id(), false, reason.Restricted.F(format, params...)).Write(a.Listener) + }, }