mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 22:13:36 +08:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
//go:build dev
|
|
// +build dev
|
|
|
|
package assetserver
|
|
|
|
import (
|
|
"bytes"
|
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
|
"github.com/wailsapp/wails/v2/pkg/options"
|
|
"path/filepath"
|
|
)
|
|
|
|
/*
|
|
|
|
The assetserver for dev serves assets from disk.
|
|
It injects a websocket based IPC script into `index.html`.
|
|
|
|
*/
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
type AssetServer struct {
|
|
indexFile []byte
|
|
runtimeJS []byte
|
|
assetdir string
|
|
appOptions *options.App
|
|
}
|
|
|
|
func NewAssetServer(assetdir string, bindingsJSON string, appOptions *options.App) (*AssetServer, error) {
|
|
result := &AssetServer{
|
|
assetdir: assetdir,
|
|
appOptions: appOptions,
|
|
}
|
|
|
|
err := result.init()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var buffer bytes.Buffer
|
|
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
|
buffer.Write(runtime.RuntimeDesktopJS)
|
|
result.runtimeJS = buffer.Bytes()
|
|
err = result.init()
|
|
return result, err
|
|
}
|
|
|
|
func (a *AssetServer) loadFileFromDisk(filename string) ([]byte, error) {
|
|
return os.ReadFile(filepath.Join(a.assetdir, filename))
|
|
}
|
|
|
|
func (a *AssetServer) init() error {
|
|
indexHTML, err := a.loadFileFromDisk("index.html")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
a.indexFile, err = injectScript(string(indexHTML), `<script src="/wails/runtime.js"></script>`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
a.indexFile, err = injectScript(string(a.indexFile), `<script src="/wails/ipc.js"></script>`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *AssetServer) Load(filename string) ([]byte, string, error) {
|
|
var content []byte
|
|
var err error
|
|
switch filename {
|
|
case "/":
|
|
content = a.indexFile
|
|
case "/wails/runtime.js":
|
|
content = a.runtimeJS
|
|
case "/wails/ipc.js":
|
|
content = runtime.WebsocketIPC
|
|
default:
|
|
content, err = a.loadFileFromDisk(filename)
|
|
}
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
mimeType := http.DetectContentType(content)
|
|
return content, mimeType, nil
|
|
}
|