Handeling websocket disconnect

This commit is contained in:
Brandon Watson 2023-09-19 10:19:04 -05:00
parent 8f0db70487
commit 832e02f42f
6 changed files with 46 additions and 14 deletions

View File

@ -58,14 +58,14 @@ func NewClient(url string, opts ...Option) (*Client, error) {
} }
// Subscribe informs the server that messages published to that channel are delivered to itself. // Subscribe informs the server that messages published to that channel are delivered to itself.
func (c *Client) Subscribe(subscription string) (*subscription.Subscription, error) { func (c *Client) Subscribe(channel string) (*subscription.Subscription, error) {
return c.dispatcher.Subscribe(subscription) return c.dispatcher.Subscribe(channel)
} }
// Publish publishes events on a channel by sending event messages, the server MAY respond to a publish event // Publish publishes events on a channel by sending event messages, the server MAY respond to a publish event
// if this feature is supported by the server use the OnPublishResponse to get the publish status. // if this feature is supported by the server use the OnPublishResponse to get the publish status.
func (c *Client) Publish(subscription string, data message.Data) (err error) { func (c *Client) Publish(channel string, data message.Data) (err error) {
return c.dispatcher.Publish(subscription, data) return c.dispatcher.Publish(channel, data)
} }
// Disconnect closes all subscriptions and inform the server to remove any client-related state. // Disconnect closes all subscriptions and inform the server to remove any client-related state.

View File

@ -22,6 +22,8 @@ type Dispatcher struct {
extensions message.Extensions extensions message.Extensions
advice atomic.Value
//map requestID //map requestID
pendingSubs map[string]chan error //todo wrap in structure pendingSubs map[string]chan error //todo wrap in structure
pendingSubsMu sync.Mutex pendingSubsMu sync.Mutex
@ -103,6 +105,19 @@ func (d *Dispatcher) dispatchMessage(msg *message.Message) {
if message.IsMetaMessage(msg) { if message.IsMetaMessage(msg) {
//handle it //handle it
switch msg.Channel { switch msg.Channel {
case message.MetaConnect:
if msg.Advice.Reconnect == message.ReconnectNone {
d.Disconnect()
log.Println("Websocket terminated")
return
}
log.Println("Websocket terminated: reconnecting")
d.Connect()
subsList := d.store.GetAll()
for i := range subsList {
sub := subsList[i]
d.Subscribe(sub.Name())
}
case message.MetaSubscribe: case message.MetaSubscribe:
//handle MetaSubscribe resp //handle MetaSubscribe resp
d.pendingSubsMu.Lock() d.pendingSubsMu.Lock()

View File

@ -84,6 +84,19 @@ func (s *SubscriptionsStore) RemoveAll() {
s.mutex.Unlock() s.mutex.Unlock()
} }
func (s *SubscriptionsStore) GetAll() []*subscription.Subscription {
s.mutex.Lock()
subsList := make([]*subscription.Subscription, 0)
for i := range s.subs {
//close all listeners
for j := range s.subs[i] {
subsList = append(subsList, s.subs[i][j])
}
}
s.mutex.Unlock()
return subsList
}
// Count return the number of subscriptions associated with the specified channel // Count return the number of subscriptions associated with the specified channel
func (s *SubscriptionsStore) Count(channel string) int { func (s *SubscriptionsStore) Count(channel string) int {
return len(s.Match(channel)) return len(s.Match(channel))

View File

@ -1,7 +1,7 @@
package store package store
import ( import (
"github.com/thesyncim/faye/subscription" "gitea.watsonlabs.net/watsonb8/fayec/subscription"
"reflect" "reflect"
"testing" "testing"
) )

View File

@ -30,12 +30,16 @@ func NewSubscription(chanel string, unsub Unsubscriber, msgCh chan *message.Mess
func (s *Subscription) OnMessage(onMessage func(channel string, msg message.Data)) error { func (s *Subscription) OnMessage(onMessage func(channel string, msg message.Data)) error {
var inMsg *message.Message var inMsg *message.Message
for inMsg = range s.msgCh { go func() error {
if inMsg.GetError() != nil { for inMsg = range s.msgCh {
return inMsg.GetError() if inMsg.GetError() != nil {
return inMsg.GetError()
}
onMessage(inMsg.Channel, inMsg.Data)
} }
onMessage(inMsg.Channel, inMsg.Data) return nil
} }()
return nil return nil
} }

View File

@ -3,11 +3,11 @@ package test
import ( import (
"context" "context"
"fmt" "fmt"
. "gitea.watsonlabs.net/watsonb8/fayec"
"gitea.watsonlabs.net/watsonb8/fayec/extensions"
"gitea.watsonlabs.net/watsonb8/fayec/message"
"gitea.watsonlabs.net/watsonb8/fayec/subscription"
"github.com/pkg/errors" "github.com/pkg/errors"
. "github.com/thesyncim/faye"
"github.com/thesyncim/faye/extensions"
"github.com/thesyncim/faye/message"
"github.com/thesyncim/faye/subscription"
"log" "log"
"os" "os"
"os/exec" "os/exec"