mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 23:02:19 +08:00

Reloading changed asset files in dev mode will only work if an embed.FS has been provided for the assets.
100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
package assetserver
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io/fs"
|
|
"log"
|
|
"strings"
|
|
|
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
|
"github.com/wailsapp/wails/v2/internal/logger"
|
|
)
|
|
|
|
type DesktopAssetServer struct {
|
|
assets fs.FS
|
|
runtimeJS []byte
|
|
logger *logger.Logger
|
|
fromDisk bool
|
|
}
|
|
|
|
func NewDesktopAssetServer(ctx context.Context, assets fs.FS, bindingsJSON string) (*DesktopAssetServer, error) {
|
|
result := &DesktopAssetServer{}
|
|
|
|
_logger := ctx.Value("logger")
|
|
if _logger != nil {
|
|
result.logger = _logger.(*logger.Logger)
|
|
}
|
|
|
|
var err error
|
|
result.assets, result.fromDisk, err = prepareAssetsForServing(ctx, "DesktopAssetServer", assets)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var buffer bytes.Buffer
|
|
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
|
|
buffer.Write(runtime.RuntimeDesktopJS)
|
|
result.runtimeJS = buffer.Bytes()
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (d *DesktopAssetServer) LogDebug(message string, args ...interface{}) {
|
|
if d.logger != nil {
|
|
d.logger.Debug("[DesktopAssetServer] "+message, args...)
|
|
}
|
|
}
|
|
|
|
func (a *DesktopAssetServer) processIndexHTML() ([]byte, error) {
|
|
indexHTML, err := fs.ReadFile(a.assets, "index.html")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
wailsOptions, err := extractOptions(indexHTML)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return nil, err
|
|
}
|
|
if wailsOptions.disableRuntimeInjection == false {
|
|
indexHTML, err = injectHTML(string(indexHTML), `<script src="/wails/runtime.js"></script>`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
if wailsOptions.disableIPCInjection == false {
|
|
indexHTML, err = injectHTML(string(indexHTML), `<script src="/wails/ipc.js"></script>`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return indexHTML, nil
|
|
}
|
|
|
|
func (a *DesktopAssetServer) Load(filename string) ([]byte, string, error) {
|
|
var content []byte
|
|
var err error
|
|
switch filename {
|
|
case "/":
|
|
content, err = a.processIndexHTML()
|
|
case "/wails/runtime.js":
|
|
content = a.runtimeJS
|
|
case "/wails/ipc.js":
|
|
content = runtime.DesktopIPC
|
|
default:
|
|
filename = strings.TrimPrefix(filename, "/")
|
|
fromDisk := ""
|
|
if a.fromDisk {
|
|
fromDisk = " (disk)"
|
|
}
|
|
a.LogDebug("Loading file: %s%s", filename, fromDisk)
|
|
content, err = fs.ReadFile(a.assets, filename)
|
|
}
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
mimeType := GetMimetype(filename, content)
|
|
return content, mimeType, nil
|
|
}
|