kataras / neffos

A modern, fast and scalable websocket framework with elegant API written in Go
http://bit.ly/neffos-wiki
MIT License
603 stars 51 forks source link

Native Message Broadcasting with Scale out is not working #45

Open seraph911 opened 4 years ago

seraph911 commented 4 years ago

Hi all,

I try to use scaling out function with native messages, but it doesn't work out.

First of all, I tried to use Conn.Server().Broadcast with scaling out. However, it was not working, then I tried Conn.Server().Do func instead. Clients connect to the same ws server are able to receive messages while using Do func, but clients connect to different servers are not.

Is there any way that I can use scaling out function with native message mode?

Glad to hear your advice. Thank you very mush for your help.

package main

import (
    "log"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/websocket"
    "github.com/kataras/neffos/stackexchange/nats"
)

type clientPage struct {
    Title string
    Host  string
}

func main() {
    app := iris.New()

    app.RegisterView(iris.HTML("./templates", ".html")) // select the html engine to serve templates

    // Almost all features of neffos are disabled because no custom message can pass
    // when app expects to accept and send only raw websocket native messages.
    // When only allow native messages is a fact?
    // When the registered namespace is just one and it's empty
    // and contains only one registered event which is the `OnNativeMessage`.
    // When `Events{...}` is used instead of `Namespaces{ "namespaceName": Events{...}}`
    // then the namespace is empty "".
    ws := websocket.New(websocket.DefaultGorillaUpgrader, websocket.Events{
        websocket.OnNativeMessage: func(nsConn *websocket.NSConn, msg websocket.Message) error {
            log.Printf("Server got: %s from [%s]", msg.Body, nsConn.Conn.ID())

            nsConn.Conn.Server().Broadcast(nsConn, msg)
            return nil
        },
    })

    exc, err := nats.NewStackExchange("nats://nats-streaming:4222")
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if err != nil {
        panic(err)
    }
    ws.UseStackExchange(exc)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    ws.OnConnect = func(c *websocket.Conn) error {
        log.Printf("[%s] Connected to server!", c.ID())
        return nil
    }

    ws.OnDisconnect = func(c *websocket.Conn) {
        log.Printf("[%s] Disconnected from server", c.ID())
    }

    app.HandleDir("/js", "./static/js") // serve our custom javascript code.

    // register the server on an endpoint.
    // see the inline javascript code i the websockets.html, this endpoint is used to connect to the server.
    app.Get("/my_endpoint", websocket.Handler(ws))

    app.Get("/", func(ctx iris.Context) {
        ctx.View("client.html", clientPage{"Client Page", "localhost:80"})
    })

    // Target some browser windows/tabs to http://localhost:8080 and send some messages,
    // see the static/js/chat.js,
    // note that the client is using only the browser's native WebSocket API instead of the neffos one.
    app.Run(iris.Addr(":80"))
}
kataras commented 4 years ago

Hello @seraph911,

Sorry for the late response, I literally had zero-time as I am preparing the iris for its next big release. Let me check these two issues tomorrow, be sure, I will fix them.

seraph911 commented 4 years ago

Many thanks for your kind response, @kataras. So glad to hear that. I am looking forward to having your new version.