mirror of
https://github.com/taigrr/wails.git
synced 2026-04-02 05:08:54 -07:00
* Support Distribution 'ArcoLinux' #310 (#312) * Support Distribution 'ArcoLinux' #310 * Vuetify2 support (resurrected from git@github.com:MichaelHipp/wails.git) (#315) * Initial create of vuetify2-basic folder * Change template descr of vuetify-basic to say Vuetify 1.5 * Get vuetify2 template installing vuetify v2.0 (but with styling probs) * Update App.vue, HelloWorld.vue for Vuetify v2 * Remove babel-polyfill, add mdi/font * fix: codacy corrections * fix: babel -> core-js, regenerator-runtime Co-authored-by: Michael Hipp <michael@redmule.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * Update Contributors * v1.0.2-pre1 * [313-remote-conn] allow remote connections to the websocket bridge (#314) * [313-remote-conn] feat: compute wsURL based on window.location * [313-remote-conn] feat: allow any host to connect to vue server removing the 'host: "localhost"' specification causes the development server to listen on all interfaces. * [313-remote-conn] feat: allow any host to connect to angular dev server * test: reinject tabs Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * fix: disable host check for vuetify 2 template * v1.0.2-pre2 * fix: shutdown ipcmanager * use channel to trigger shutdown * load linuxdb from relative path * Feat manjaro arm & deepin (#324) * feat: new distros: manjaroARM & Deepin * v1.0.2-pre3 * [326-platform-raspbian] feat: implement raspbian support (#327) * fix: emit arguments (#306) * v1.0.2-pre4 Raspbarian support * Initial support for Typescript decl file (#330) * v1.0.2-pre5 * revert to Go 1.12 * New CI (#331) * prepare * new CI/github actions * Rename later-pre.yml to latest-pre.yml * Update latest-pre.yml * Update README.md * Ensure version in go.mod is up to date (#339) * release v1.0.2-pre6 * Fix typescript generation * Release v1.0.2-pre7 * 316-multi-bridge-conn (#317) * [316-multi-bridge-conn] feat: use callback func for bridge response * [316-multi-bridge-conn] feat: implement multiple session support * split client handling portion into 'session' * keep track of sessions by remote address (ip & port) * notify each of the sessions anytime an event comes across the bus * [316-multi-bridge-conn] chore: move bridge files to package * [316-multi-bridge-conn] chore: remove deprecated Callback function The Callback function is no longer needed for the operation of the frontend callback since the ipc.Dispatch function now requires a callback function to be provided as an argument. This function can be a private function since it is passed by reference. * [316-multi-bridge-conn] chore: make webview.Callback private * [316-multi-bridge-conn] chore: remove unused injectCSS function I believe a slightly better method of doing this might need to be devised if it is needed in the future. I presume it should collect the values into a cache and then inject it into each sesssion as it appears. * [316-multi-bridge-conn] ensure wails:ready event is emitted Event is only emitted for the first session created from the Bridge. * [316-multi-bridge-conn] emit events for session lifecycle Emit an event for each session started and ended. * [316-multi-bridge-conn] fix: session handling fixes Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * Release v1.0.2-pre8 * Release v1.0.2 Co-authored-by: Byron <ktc@protonmail.com> Co-authored-by: Travis McLane <tmclane@gmail.com> Co-authored-by: Michael Hipp <michael@redmule.com>
91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
package renderer
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/gorilla/websocket"
|
|
"github.com/leaanthony/mewn"
|
|
"github.com/wailsapp/wails/lib/interfaces"
|
|
"github.com/wailsapp/wails/lib/logger"
|
|
)
|
|
|
|
// TODO Move this back into bridge.go
|
|
|
|
// session represents a single websocket session
|
|
type session struct {
|
|
bindingCache []string
|
|
conn *websocket.Conn
|
|
eventManager interfaces.EventManager
|
|
log *logger.CustomLogger
|
|
ipc interfaces.IPCManager
|
|
|
|
// Mutex for writing to the socket
|
|
lock sync.Mutex
|
|
}
|
|
|
|
// Identifier returns a string identifier for the remote connection.
|
|
// Taking the form of the client's <ip address>:<port>.
|
|
func (s *session) Identifier() string {
|
|
if s.conn != nil {
|
|
return s.conn.RemoteAddr().String()
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (s *session) sendMessage(msg string) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
if err := s.conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil {
|
|
s.log.Debug(err.Error())
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *session) start(firstSession bool) {
|
|
s.log.Infof("Connected to frontend.")
|
|
|
|
wailsRuntime := mewn.String("../../runtime/assets/wails.js")
|
|
s.evalJS(wailsRuntime, wailsRuntimeMessage)
|
|
|
|
// Inject bindings
|
|
for _, binding := range s.bindingCache {
|
|
s.evalJS(binding, bindingMessage)
|
|
}
|
|
s.eventManager.Emit("wails:bridge:session:started", s.Identifier())
|
|
|
|
// Emit that everything is loaded and ready
|
|
if firstSession {
|
|
s.eventManager.Emit("wails:ready")
|
|
}
|
|
|
|
for {
|
|
messageType, buffer, err := s.conn.ReadMessage()
|
|
if messageType == -1 {
|
|
return
|
|
}
|
|
if err != nil {
|
|
s.log.Errorf("Error reading message: %v", err)
|
|
continue
|
|
}
|
|
|
|
s.log.Debugf("Got message: %#v\n", string(buffer))
|
|
|
|
s.ipc.Dispatch(string(buffer), s.Callback)
|
|
}
|
|
}
|
|
|
|
// Callback sends a callback to the frontend
|
|
func (s *session) Callback(data string) error {
|
|
return s.evalJS(data, callbackMessage)
|
|
}
|
|
|
|
func (s *session) evalJS(js string, mtype messageType) error {
|
|
|
|
// Prepend message type to message
|
|
return s.sendMessage(mtype.toString() + js)
|
|
|
|
}
|