Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"welcome" event #16

Open
gregfr opened this issue Feb 23, 2020 · 11 comments
Open

"welcome" event #16

gregfr opened this issue Feb 23, 2020 · 11 comments
Milestone

Comments

@gregfr
Copy link

gregfr commented Feb 23, 2020

Greetings
Is it possible to send an event to a newly connected client?

@alexandrevicenzi
Copy link
Owner

No, there's no hook for it. That being said, it would be possible to add a hook for that, but not sure if this would look good or be useful.

@gregfr
Copy link
Author

gregfr commented Feb 24, 2020

Well I would definitely have the use for it :)

@alexandrevicenzi
Copy link
Owner

Feel free to propose a change, or send a PR, but first I would like to see how it would look like.

@gregfr
Copy link
Author

gregfr commented Mar 11, 2020

Well when you have several clients on a channel, you could "greet" each one with some specific info, like an internal reference that the server uses to specifiy the client, or some kind of JWT for example.
Ideally, it could be returned when the clients connects, like:

app.$sse(url,{options})
.then((see, greetings) => {
jwt = greetings.jwt;
myID = greetings.yourID;
});

@gregfr
Copy link
Author

gregfr commented Mar 11, 2020

On the server side it could be:

s := sse.NewServer(&sse.Options{
...
  Greeter: func() {
  }
}

I realize this is inherently server-client so both sides should be involved, however.

@alexandrevicenzi
Copy link
Owner

@gregfr I don't like this approach using the Server Options.

My idea would be to do something more close to what you seen in logrus, a function called server.AddHook for example.

Another issue is that I don't want only one event. If there's an event for client connected there should be for client disconnected as well. On that yet, I think that could also be nice to have Pre and Post event, but that's another discussion, for now, Post event would do the job for most use cases that I'm aware of.

@alexandrevicenzi
Copy link
Owner

@graywolf336 you can also share some ideas here as this would solve your question on #23.

@The-One-Law
Copy link

The-One-Law commented Jul 9, 2020

Greetings,
I am also considering this,
perhaps better to just poll for new clients between sendmessages
and (when found) simply move them to appropriate channels ?
(currently exploring how to do this - In order to validate clients)

@graywolf336
Copy link

One thing I really like about gorilla websockets framework is their upgrade function returns a pointer to the client, so I wonder if that would be a viable solution here. That way when a client is connected, it is returned and I can send over the messages.

Aside from that approach, you could take the AddHook(eventType, func) approach and that wouldn’t be too bad.

type EventType string

var (
  EventTypeBeforeConnect EventType = “before-connect”
  EventTypeConnected EventType = “connected”
)

Naming could be better though.

@alexandrevicenzi
Copy link
Owner

I like the idea of sending the object when a hook is triggered, but with generic AddHook function you would need to receive an interface and cast it.

AddHook is a nice way because we could add more events without breaking anything, but there's this downside of casting objects as there's no way to have function overload.

One reason that I never implemented this is that I never found a clean/good way of doing, neither I know the most go-way of doing it.

Looking for examples in other libraries is a good idea, as web socket is more popular than SSE.

@graywolf336
Copy link

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
}

That is how gorilla websockets framework handles it. So, if you upgrade the connection and then you get back the connection which can be used to send and receive messages.

That is what I think would be the ideal way to approach it. Provide a way to "convert" or "upgrade" the connection to an sse client and send the "welcome" message that way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants