diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..604cdea --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,11 @@ +package main + +import "github.com/dezh-tech/immortal/server" + +func main() { + s := server.NewServer() + err := s.Start() + if err != nil { + panic(err) + } +} diff --git a/go.mod b/go.mod index 03e7a0a..58ad8e5 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/mailru/easyjson v0.7.7 github.com/stretchr/testify v1.9.0 github.com/tidwall/gjson v1.17.3 + golang.org/x/net v0.29.0 ) require ( diff --git a/go.sum b/go.sum index fd7869a..0aa1fcd 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..dbdc929 --- /dev/null +++ b/server/server.go @@ -0,0 +1,63 @@ +package server + +import ( + "errors" + "io" + "log" + "net/http" + + // TODO::: replace with https://github.com/coder/websocket. + "github.com/dezh-tech/immortal/types/envelope" + "golang.org/x/net/websocket" +) + +type Server struct { + conns map[*websocket.Conn]bool +} + +func NewServer() *Server { + return &Server{ + conns: make(map[*websocket.Conn]bool), + } +} + +func (s *Server) Start() error { + http.Handle("/ws", websocket.Handler(s.handleWS)) + err := http.ListenAndServe(":3000", nil) //nolint + + return err +} + +func (s *Server) handleWS(ws *websocket.Conn) { + // TODO::: replace with logger. + log.Printf("new connection: %s\n", ws.RemoteAddr()) + + // TODO::: make it concurrent safe. + s.conns[ws] = true + + s.readLoop(ws) +} + +func (s *Server) readLoop(ws *websocket.Conn) { + buf := make([]byte, 1024) + for { + n, err := ws.Read(buf) + if err != nil { + if errors.Is(err, io.EOF) { + break + } + + // TODO::: replace with logger. + log.Printf("error in connection handling: %s\n", err) + + // TODO::: drop connection? + continue + } + + msg := buf[:n] + env := envelope.ParseMessage(msg) + + // TODO::: replace with logger. + log.Printf("received envelope: %s\n", env.String()) + } +} diff --git a/types/event/event.go b/types/event/event.go index 2d64124..a611331 100644 --- a/types/event/event.go +++ b/types/event/event.go @@ -95,3 +95,12 @@ func (e *Event) IsValid() bool { // TODO::: replace with libsecp256k1 (C++ version). return sig.Verify(hash[:], pubkey) } + +func (e *Event) String() string { + ee, err := e.Encode() + if err != nil { + return "" + } + + return string(ee) +} diff --git a/types/utils.go b/types/utils.go index a0b9c12..e994456 100644 --- a/types/utils.go +++ b/types/utils.go @@ -24,7 +24,7 @@ func ContainsKind(target Kind, arr []Kind) bool { return false } -// Escaping strings for JSON encoding according to RFC8259. +// EscapeString for JSON encoding according to RFC8259. // Also encloses result in quotation marks "". func EscapeString(dst []byte, s string) []byte { dst = append(dst, '"')