Files
realy/bunker/session.go

62 lines
1.3 KiB
Go

package bunker
import (
"encoding/json"
"relay.mleku.dev/chk"
"relay.mleku.dev/encryption"
"relay.mleku.dev/event"
"relay.mleku.dev/kind"
"relay.mleku.dev/tag"
"relay.mleku.dev/tags"
"relay.mleku.dev/timestamp"
)
type Session struct {
Pubkey, SharedKey, ConversationKey []byte
}
func (s *Session) ParseRequest(ev *event.T) (req *Request, err error) {
var b []byte
if b, err = encryption.Decrypt(ev.Content, s.ConversationKey); chk.E(err) {
if b, err = encryption.DecryptNip4(ev.Content, s.SharedKey); chk.E(err) {
return
}
}
if err = json.Unmarshal(b, &req); chk.E(err) {
return
}
return
}
func (s *Session) MakeResponse(id, requester, result string,
rErr error) (resp *Response, ev *event.T, err error) {
if rErr != nil {
resp = &Response{
ID: id,
Result: rErr.Error(),
}
} else if len(result) > 0 {
resp = &Response{
ID: id,
Result: result,
}
}
// todo: what if the response is empty? this shouldn't happen i think?
var j []byte
if j, err = json.Marshal(resp); chk.E(err) {
return
}
var ciphertext []byte
if ciphertext, err = encryption.Encrypt(j, s.ConversationKey); chk.E(err) {
return
}
ev = &event.T{
Content: ciphertext,
CreatedAt: timestamp.Now(),
Kind: kind.NostrConnect,
Tags: tags.New(tag.New("p", requester)),
}
return
}