njones / socketio

A Modern SocketIO library for go
MIT License
60 stars 9 forks source link

socket-io: How to work with namespaces? #80

Open sujit-baniya opened 1 year ago

sujit-baniya commented 1 year ago

Hello, I'm trying to use this package for different namespaces

Here's the working version using github.com/googollee/go-socket.io

func main() {
    server := socketio.NewServer(&engineio.Options{
        Transports: []transport.Transport{
            &polling.Transport{
                CheckOrigin: allowOriginFunc,
            },
            &websocket.Transport{
                CheckOrigin: allowOriginFunc,
            },
        },
    })

    server.OnConnect("/", func(s socketio.Conn) error {
        s.SetContext("")
        log.Println("connected:", s.ID())
        return nil
    })

    server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
        log.Println("notice:", msg)
        s.Emit("reply", "have "+msg)
    })

    server.OnEvent("/chat", "msg", func(s socketio.Conn, msg string) string {
        log.Println("chat:", msg)
        s.SetContext(msg)
        return "recv " + msg
    })

    server.OnEvent("/", "bye", func(s socketio.Conn) string {
        last := s.Context().(string)
        s.Emit("bye", last)
        s.Close()
        return last
    })

    server.OnError("/", func(s socketio.Conn, e error) {
        log.Println("meet error:", e)
    })

    server.OnDisconnect("/", func(s socketio.Conn, reason string) {
        log.Println("closed", reason)
    })

    go func() {
        if err := server.Serve(); err != nil {
            log.Fatalf("socketio listen error: %s\n", err)
        }
    }()
    defer server.Close()

    http.Handle("/socket.io/", server)
    http.Handle("/", http.FileServer(http.Dir("asset")))

    log.Println("Serving at http://localhost:8001...")
    log.Fatal(http.ListenAndServe(":8001", nil))
}

When I try to use this package I'm getting error. Not sure what might be the issue


func main() {
    port := ":8001"

    server := sio.NewServer(
        eio.WithPingInterval(300*1*time.Millisecond),
        eio.WithPingTimeout(200*1*time.Millisecond),
        eio.WithMaxPayload(1000000),
        eio.WithTransportOption(eiot.WithGovernor(1500*time.Microsecond, 500*time.Microsecond)),
    )

    server.OnConnect(func(s *sio.SocketV4) error {
        log.Println("connected:", s.ID())
        s.Of("/").On("notice", CustomWrap(func(a string) error {
            return s.Emit("reply", seri.String("have "+a))
        }))
        s.Of("/").On("bye", CustomWrap(func(a string) error {
            return s.Emit("bye", seri.String(a))
        }))
        s.Of("/chat").On("msg", CustomWrap(func(a string) error {
            fmt.Println("msg", a)
            return nil
        }))
        return nil
    })

    http.Handle("/socket.io/", server)
    http.Handle("/", http.FileServer(http.Dir("asset")))
    log.Printf("serving port %s...\n", port)
    log.Fatal(http.ListenAndServe(port, nil))
}

// Define a custom wrapper 
type CustomWrap func(string) error

// Define your callback
func (cc CustomWrap) Callback(data ...interface{}) error {
    a, aOK := data[0].(string)

    if !aOK {
        return fmt.Errorf("bad parameters")
    }

    return cc(a)
}

Error:

44{"message":"expected an []interface{} or []string, found []interface {}\t{\"do\":\"eventPacket\"}"}

index.html

<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      var socket = io("http://127.0.0.1:8001", {transports: ["websocket"]});

      socket.on('reply', function(msg){
        $('#messages').append($('<li>').text(msg));
      });

      $('form').submit(function(){
        socket.emit('msg', $('#m').val(), function(data){
          $('#messages').append($('<li>').text('ACK CALLBACK: ' + data));
        });

        socket.emit('notice', $('#m').val());

        $('#m').val('');
        return false;
      });
    </script>
  </body>
</html>