created [ws.*] to create a server, bind a default controller, or bind URI-bound controllers + launch() *TODO* + created websocket types
This commit is contained in:
parent
c6112c9c74
commit
d603145f5f
|
@ -0,0 +1,37 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
"git.xdrm.io/gws/ws"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func main(){
|
||||||
|
|
||||||
|
startTime := time.Now().UnixNano()
|
||||||
|
|
||||||
|
/* (1) Bind WebSocket server */
|
||||||
|
serv := ws.CreateServer("0.0.0.0", 4444)
|
||||||
|
|
||||||
|
/* (2) Bind default controller */
|
||||||
|
err := serv.BindDefault(func(c ws.Client, f ws.Frame){
|
||||||
|
fmt.Printf("Default controller")
|
||||||
|
})
|
||||||
|
if err != nil { panic(err) }
|
||||||
|
|
||||||
|
/* (3) Bind to URI */
|
||||||
|
err = serv.Bind("/channel/./room/./", func(c ws.Client, f ws.Frame){
|
||||||
|
fmt.Printf("URI controller")
|
||||||
|
})
|
||||||
|
if err != nil { panic(err) }
|
||||||
|
|
||||||
|
/* (4) Launch the server */
|
||||||
|
serv.Launch()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fmt.Printf("+ elapsed: %1.1f us\n", float32(time.Now().UnixNano()-startTime)/1e3)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package ws
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// CreateServer creates a server for a specific HOST and PORT
|
||||||
|
func CreateServer(host string, port uint16) *Server{
|
||||||
|
|
||||||
|
inst := new(Server)
|
||||||
|
|
||||||
|
inst.adr = make([]byte, len(host))
|
||||||
|
copy(inst.adr, []byte(host))
|
||||||
|
|
||||||
|
inst.prt = port
|
||||||
|
|
||||||
|
return inst
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package ws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"git.xdrm.io/gws/internal/uri/parser"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// BindDefault binds a default controller
|
||||||
|
// it will be called if the URI does not
|
||||||
|
// match another controller
|
||||||
|
func (s *Server) BindDefault(c ControllerFunc) error{
|
||||||
|
s.def = &Controller{nil, c};
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind binds a controller to an URI scheme
|
||||||
|
func (s *Server) Bind(uri string, c ControllerFunc) error {
|
||||||
|
|
||||||
|
/* (1) Build URI parser */
|
||||||
|
uriScheme, err := parser.Build(uri)
|
||||||
|
if err != nil { return fmt.Errorf("Cannot build URI: %s", err) }
|
||||||
|
|
||||||
|
/* (2) Create controller */
|
||||||
|
ctl := &Controller{uri: uriScheme, fun: c}
|
||||||
|
|
||||||
|
/* (3) Add to server */
|
||||||
|
s.ctl = append(s.ctl, ctl)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Launch launches the websocket server
|
||||||
|
func (s *Server) Launch(){
|
||||||
|
|
||||||
|
/* (1) Listen socket
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
/* (1) Build full url */
|
||||||
|
url := fmt.Sprintf("%s:%d", s.adr, s.prt)
|
||||||
|
|
||||||
|
/* (3) Bind listen socket */
|
||||||
|
// lsock, err := net.Listen("tcp", )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package ws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.xdrm.io/gws/internal/uri/parser"
|
||||||
|
"git.xdrm.io/gws/ws/frame"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Represents a websocket controller callback function
|
||||||
|
type ControllerFunc func(Client, Frame)
|
||||||
|
|
||||||
|
// Represents a websocket controller
|
||||||
|
type Controller struct {
|
||||||
|
uri *parser.Scheme
|
||||||
|
fun ControllerFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Represents a websocket srever
|
||||||
|
type Server struct {
|
||||||
|
adr []byte // server listening ip/host
|
||||||
|
prt uint16 // server listening port
|
||||||
|
|
||||||
|
def *Controller // default controller
|
||||||
|
ctl []*Controller // URI-bound controllers
|
||||||
|
}
|
||||||
|
|
||||||
|
// Represents a websocket client
|
||||||
|
type Client struct {
|
||||||
|
pro string // choosen protocol (Sec-WebSocket-Protocol)
|
||||||
|
arg [][]string // URI parameters, index 0 is full URI, then matching groups
|
||||||
|
dat interface{} // store (for client implementation-specific data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Represents a websocket frame
|
||||||
|
type Frame struct {
|
||||||
|
met frame.Header
|
||||||
|
buf []byte
|
||||||
|
len uint64
|
||||||
|
}
|
Loading…
Reference in New Issue