mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 23:51:44 +08:00
add locker for websocket.WriteMessage
This commit is contained in:
parent
356774e3f7
commit
995fe38ee4
@ -35,7 +35,7 @@ type DevWebServer struct {
|
|||||||
dispatcher frontend.Dispatcher
|
dispatcher frontend.Dispatcher
|
||||||
assetServer *assetserver.BrowserAssetServer
|
assetServer *assetserver.BrowserAssetServer
|
||||||
socketMutex sync.Mutex
|
socketMutex sync.Mutex
|
||||||
websocketClients map[*websocket.Conn]struct{}
|
websocketClients map[*websocket.Conn]*sync.Mutex
|
||||||
menuManager *menumanager.Manager
|
menuManager *menumanager.Manager
|
||||||
starttime string
|
starttime string
|
||||||
|
|
||||||
@ -58,6 +58,7 @@ func (d *DevWebServer) Run(ctx context.Context) error {
|
|||||||
|
|
||||||
d.server.Get("/wails/ipc", websocket.New(func(c *websocket.Conn) {
|
d.server.Get("/wails/ipc", websocket.New(func(c *websocket.Conn) {
|
||||||
d.newWebsocketSession(c)
|
d.newWebsocketSession(c)
|
||||||
|
locker := d.websocketClients[c]
|
||||||
// websocket.Conn bindings https://pkg.go.dev/github.com/fasthttp/websocket?tab=doc#pkg-index
|
// websocket.Conn bindings https://pkg.go.dev/github.com/fasthttp/websocket?tab=doc#pkg-index
|
||||||
var (
|
var (
|
||||||
mt int
|
mt int
|
||||||
@ -85,9 +86,12 @@ func (d *DevWebServer) Run(ctx context.Context) error {
|
|||||||
d.logger.Error(err.Error())
|
d.logger.Error(err.Error())
|
||||||
}
|
}
|
||||||
if result != "" {
|
if result != "" {
|
||||||
|
locker.Lock()
|
||||||
if err = c.WriteMessage(mt, []byte(result)); err != nil {
|
if err = c.WriteMessage(mt, []byte(result)); err != nil {
|
||||||
|
locker.Unlock()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
locker.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -293,7 +297,7 @@ func (d *DevWebServer) newWebsocketSession(c *websocket.Conn) {
|
|||||||
d.LogDebug(fmt.Sprintf("Websocket client %p disconnected", c))
|
d.LogDebug(fmt.Sprintf("Websocket client %p disconnected", c))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
d.websocketClients[c] = struct{}{}
|
d.websocketClients[c] = &sync.Mutex{}
|
||||||
d.LogDebug(fmt.Sprintf("Websocket client %p connected", c))
|
d.LogDebug(fmt.Sprintf("Websocket client %p connected", c))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,16 +309,21 @@ type EventNotify struct {
|
|||||||
func (d *DevWebServer) broadcast(message string) {
|
func (d *DevWebServer) broadcast(message string) {
|
||||||
d.socketMutex.Lock()
|
d.socketMutex.Lock()
|
||||||
defer d.socketMutex.Unlock()
|
defer d.socketMutex.Unlock()
|
||||||
for client := range d.websocketClients {
|
for client, locker := range d.websocketClients {
|
||||||
if client == nil {
|
go func() {
|
||||||
d.logger.Error("Lost connection to websocket server")
|
if client == nil {
|
||||||
return
|
d.logger.Error("Lost connection to websocket server")
|
||||||
}
|
return
|
||||||
err := client.WriteMessage(websocket.TextMessage, []byte(message))
|
}
|
||||||
if err != nil {
|
locker.Lock()
|
||||||
d.logger.Error(err.Error())
|
err := client.WriteMessage(websocket.TextMessage, []byte(message))
|
||||||
return
|
if err != nil {
|
||||||
}
|
locker.Unlock()
|
||||||
|
d.logger.Error(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
locker.Unlock()
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,15 +344,20 @@ func (d *DevWebServer) notify(name string, data ...interface{}) {
|
|||||||
func (d *DevWebServer) broadcastExcludingSender(message string, sender *websocket.Conn) {
|
func (d *DevWebServer) broadcastExcludingSender(message string, sender *websocket.Conn) {
|
||||||
d.socketMutex.Lock()
|
d.socketMutex.Lock()
|
||||||
defer d.socketMutex.Unlock()
|
defer d.socketMutex.Unlock()
|
||||||
for client := range d.websocketClients {
|
for client, locker := range d.websocketClients {
|
||||||
if client == sender {
|
go func() {
|
||||||
continue
|
if client == sender {
|
||||||
}
|
return
|
||||||
err := client.WriteMessage(websocket.TextMessage, []byte(message))
|
}
|
||||||
if err != nil {
|
locker.Lock()
|
||||||
d.logger.Error(err.Error())
|
err := client.WriteMessage(websocket.TextMessage, []byte(message))
|
||||||
return
|
if err != nil {
|
||||||
}
|
locker.Unlock()
|
||||||
|
d.logger.Error(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
locker.Unlock()
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,7 +388,7 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.
|
|||||||
DisableStartupMessage: true,
|
DisableStartupMessage: true,
|
||||||
}),
|
}),
|
||||||
menuManager: menuManager,
|
menuManager: menuManager,
|
||||||
websocketClients: make(map[*websocket.Conn]struct{}),
|
websocketClients: make(map[*websocket.Conn]*sync.Mutex),
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user