mirror of
https://github.com/taigrr/wails.git
synced 2026-04-14 02:48:21 -07:00
Compare commits
1 Commits
116-Add-br
...
119---Init
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a17f385749 |
39
CHANGELOG.md
39
CHANGELOG.md
@@ -1,28 +1,19 @@
|
|||||||
2019-06-18 **v0.16.0**
|
|
||||||
* React template FTW! - Thanks [admin_3.exe](https://github.com/bh90210)!
|
|
||||||
* Updated contributors
|
|
||||||
* Arch Linux detection without lsb-release
|
|
||||||
* Removed deprecated methods for dealing with JS/CSS in the backend
|
|
||||||
|
|
||||||
2019-05-29 **v0.14.11-pre**
|
<a name="v0.13.0"></a>
|
||||||
* Windows fix for spinner
|
## [v0.13.0] - 2019-05-12
|
||||||
|
|
||||||
2019-05-29 **v0.14.10-pre**
|
### Feat
|
||||||
* Windows fix for Vuetify
|
- revamped 'update' system
|
||||||
|
- no need for explicit GO111MODULE=on
|
||||||
|
|
||||||
2019-05-29 **v0.14.9-pre**
|
### Fix
|
||||||
* Vuetify project template 🎉
|
- documentation typo fixes
|
||||||
|
- windows init project
|
||||||
|
- windows 10 colour
|
||||||
|
- leave windows assets on -p flag
|
||||||
|
- show prerequisite errors
|
||||||
|
|
||||||
2019-05-29 **v0.14.8-pre**
|
### Docs
|
||||||
* Updated Ubuntu npm install command
|
- updated contributors
|
||||||
|
- added awesomego logo
|
||||||
2019-05-22 **v0.14.7-pre**
|
- added Redhat distro
|
||||||
* New projects are built automatically when initialised
|
|
||||||
* Go 1.12 is now a minimum requirement
|
|
||||||
|
|
||||||
2019-05-21 **v0.14.6-pre**
|
|
||||||
* Hotfix for module dependency issue
|
|
||||||
|
|
||||||
2019-05-20 **v0.14.5-pre**
|
|
||||||
* Added developer tooling - New Template Generator
|
|
||||||
* Documentation fixes - Thanks [admin_3.exe](https://github.com/bh90210)!
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
<a href="https://github.com/wailsapp/wails/issues"><img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" /></a>
|
<a href="https://github.com/wailsapp/wails/issues"><img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat" alt="CodeFactor" /></a>
|
||||||
<a href="https://houndci.com"><img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/></a>
|
<a href="https://houndci.com"><img src="https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg"/></a>
|
||||||
<a href="https://github.com/avelino/awesome-go" rel="nofollow"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"></a>
|
<a href="https://github.com/avelino/awesome-go" rel="nofollow"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome"></a>
|
||||||
<a href="https://dashboard.guardrails.io/default/gh/wailsapp/wails"><img src="https://badges.guardrails.io/wailsapp/wails.svg?token=53657bc22ec360d7673c894fdd70568e918ec581d10d84427ed4de5fe1eeff1a"></a>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative!
|
The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative!
|
||||||
@@ -19,7 +18,6 @@ The traditional method of providing web interfaces to Go programs is via a built
|
|||||||
|
|
||||||
- Use standard Go libraries/frameworks for the backend
|
- Use standard Go libraries/frameworks for the backend
|
||||||
- Use any frontend technology to build your UI
|
- Use any frontend technology to build your UI
|
||||||
- Quickly create Vue, Vuetify or React frontends for your Go programs
|
|
||||||
- Expose Go methods/functions to the frontend via a single bind command
|
- Expose Go methods/functions to the frontend via a single bind command
|
||||||
- Uses native rendering engines - no embedded browser
|
- Uses native rendering engines - no embedded browser
|
||||||
- Shared events system
|
- Shared events system
|
||||||
@@ -99,7 +97,7 @@ Without the following people, this project would never have existed:
|
|||||||
* [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!).
|
* [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!).
|
||||||
* [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing.
|
* [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing.
|
||||||
|
|
||||||
And without [these people](CONTRIBUTORS.md), it wouldn't be what it is today. A huge thank you to each and every one of you!
|
And without [these people](CONTRIBUTORS.md), it wouldn't be what it is today.
|
||||||
|
|
||||||
Special Mentions:
|
Special Mentions:
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
package wails
|
|
||||||
|
|
||||||
import "strings"
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
type internalMethods struct{
|
|
||||||
log *CustomLogger
|
|
||||||
browser *RuntimeBrowser
|
|
||||||
}
|
|
||||||
|
|
||||||
func newInternalMethods() *internalMethods {
|
|
||||||
return &internalMethods{
|
|
||||||
log: newCustomLogger("InternalCall"),
|
|
||||||
browser: newRuntimeBrowser(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *internalMethods) processCall(callData *callData) (interface{}, error) {
|
|
||||||
if !strings.HasPrefix(callData.BindingName, ".wails.") {
|
|
||||||
return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip prefix
|
|
||||||
var splitCall = strings.Split(callData.BindingName,".")[2:]
|
|
||||||
if len(splitCall) != 2 {
|
|
||||||
return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName)
|
|
||||||
}
|
|
||||||
|
|
||||||
group := splitCall[0]
|
|
||||||
switch group {
|
|
||||||
case "Browser":
|
|
||||||
return i.processBrowserCommand(splitCall[1], callData.Data)
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("Unknown internal command group '%s'", group)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *internalMethods) processBrowserCommand(command string, data interface{}) (interface{}, error) {
|
|
||||||
switch command {
|
|
||||||
case "OpenURL":
|
|
||||||
url := data.(string)
|
|
||||||
// Strip string quotes. Credit: https://stackoverflow.com/a/44222648
|
|
||||||
if url[0] == '"' {
|
|
||||||
url = url[1:]
|
|
||||||
}
|
|
||||||
if i := len(url)-1; url[i] == '"' {
|
|
||||||
url = url[:i]
|
|
||||||
}
|
|
||||||
i.log.Debugf("Calling Browser.OpenURL with '%s'", url)
|
|
||||||
return nil, i.browser.OpenURL(url)
|
|
||||||
case "OpenFile":
|
|
||||||
filename := data.(string)
|
|
||||||
// Strip string quotes. Credit: https://stackoverflow.com/a/44222648
|
|
||||||
if filename[0] == '"' {
|
|
||||||
filename = filename[1:]
|
|
||||||
}
|
|
||||||
if i := len(filename)-1; filename[i] == '"' {
|
|
||||||
filename = filename[:i]
|
|
||||||
}
|
|
||||||
i.log.Debugf("Calling Browser.OpenFile with '%s'", filename)
|
|
||||||
return nil, i.browser.OpenFile(filename)
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("Unknown Browser command '%s'", command)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -17,7 +17,6 @@ binding:
|
|||||||
type bindingManager struct {
|
type bindingManager struct {
|
||||||
methods map[string]*boundMethod
|
methods map[string]*boundMethod
|
||||||
functions map[string]*boundFunction
|
functions map[string]*boundFunction
|
||||||
internalMethods *internalMethods
|
|
||||||
initMethods []*boundMethod
|
initMethods []*boundMethod
|
||||||
log *CustomLogger
|
log *CustomLogger
|
||||||
renderer Renderer
|
renderer Renderer
|
||||||
@@ -28,10 +27,9 @@ type bindingManager struct {
|
|||||||
|
|
||||||
func newBindingManager() *bindingManager {
|
func newBindingManager() *bindingManager {
|
||||||
result := &bindingManager{
|
result := &bindingManager{
|
||||||
methods: make(map[string]*boundMethod),
|
methods: make(map[string]*boundMethod),
|
||||||
functions: make(map[string]*boundFunction),
|
functions: make(map[string]*boundFunction),
|
||||||
log: newCustomLogger("Bind"),
|
log: newCustomLogger("Bind"),
|
||||||
internalMethods: newInternalMethods(),
|
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@@ -165,11 +163,6 @@ func (b *bindingManager) bind(object interface{}) {
|
|||||||
b.objectsToBind = append(b.objectsToBind, object)
|
b.objectsToBind = append(b.objectsToBind, object)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *bindingManager) processInternalCall(callData *callData) (interface{}, error) {
|
|
||||||
// Strip prefix
|
|
||||||
return b.internalMethods.processCall(callData)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *bindingManager) processFunctionCall(callData *callData) (interface{}, error) {
|
func (b *bindingManager) processFunctionCall(callData *callData) (interface{}, error) {
|
||||||
// Return values
|
// Return values
|
||||||
var result []reflect.Value
|
var result []reflect.Value
|
||||||
@@ -261,8 +254,6 @@ func (b *bindingManager) processCall(callData *callData) (result interface{}, er
|
|||||||
result, err = b.processFunctionCall(callData)
|
result, err = b.processFunctionCall(callData)
|
||||||
case 2:
|
case 2:
|
||||||
result, err = b.processMethodCall(callData)
|
result, err = b.processMethodCall(callData)
|
||||||
case 3:
|
|
||||||
result, err = b.processInternalCall(callData)
|
|
||||||
default:
|
default:
|
||||||
result = nil
|
result = nil
|
||||||
err = fmt.Errorf("Invalid binding name '%s'", callData.BindingName)
|
err = fmt.Errorf("Invalid binding name '%s'", callData.BindingName)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -58,6 +58,8 @@ func GetLinuxDistroInfo() *DistroInfo {
|
|||||||
result.Distribution = Ubuntu
|
result.Distribution = Ubuntu
|
||||||
case "Arch", "ManjaroLinux":
|
case "Arch", "ManjaroLinux":
|
||||||
result.Distribution = Arch
|
result.Distribution = Arch
|
||||||
|
default:
|
||||||
|
result.Distribution = Unknown
|
||||||
}
|
}
|
||||||
case "Description":
|
case "Description":
|
||||||
result.Description = value
|
result.Description = value
|
||||||
@@ -87,6 +89,8 @@ func GetLinuxDistroInfo() *DistroInfo {
|
|||||||
result.Distribution = RedHat
|
result.Distribution = RedHat
|
||||||
case "Arch Linux":
|
case "Arch Linux":
|
||||||
result.Distribution = Arch
|
result.Distribution = Arch
|
||||||
|
default:
|
||||||
|
result.Distribution = Unknown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -295,7 +295,6 @@ func CheckDependencies(logger *Logger) (bool, error) {
|
|||||||
logger.Green("Library '%s' installed.", library.Name)
|
logger.Green("Library '%s' installed.", library.Name)
|
||||||
}
|
}
|
||||||
case RedHat:
|
case RedHat:
|
||||||
|
|
||||||
installed, err := RpmInstalled(library.Name)
|
installed, err := RpmInstalled(library.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@@ -307,6 +306,7 @@ func CheckDependencies(logger *Logger) (bool, error) {
|
|||||||
logger.Green("Library '%s' installed.", library.Name)
|
logger.Green("Library '%s' installed.", library.Name)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
fmt.Printf("here 1. DistroInfo = %+v\n", distroInfo)
|
||||||
return false, fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name)
|
return false, fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
// Version - Wails version
|
// Version - Wails version
|
||||||
const Version = "v0.16.0"
|
const Version = "v0.15.0"
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ func checkLibraries() (errors bool, err error) {
|
|||||||
logger.Green("Library '%s' installed.", library.Name)
|
logger.Green("Library '%s' installed.", library.Name)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
fmt.Printf("here 2. DistroInfo = %+v\n", distroInfo)
|
||||||
return false, fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name)
|
return false, fmt.Errorf("unable to check libraries on distribution '%s'. Please ensure that the '%s' equivalent is installed", distroInfo.DistributorID, library.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ type Runtime struct {
|
|||||||
Log *RuntimeLog
|
Log *RuntimeLog
|
||||||
Dialog *RuntimeDialog
|
Dialog *RuntimeDialog
|
||||||
Window *RuntimeWindow
|
Window *RuntimeWindow
|
||||||
Browser *RuntimeBrowser
|
|
||||||
FileSystem *RuntimeFileSystem
|
FileSystem *RuntimeFileSystem
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,7 +15,6 @@ func newRuntime(eventManager *eventManager, renderer Renderer) *Runtime {
|
|||||||
Log: newRuntimeLog(),
|
Log: newRuntimeLog(),
|
||||||
Dialog: newRuntimeDialog(renderer),
|
Dialog: newRuntimeDialog(renderer),
|
||||||
Window: newRuntimeWindow(renderer),
|
Window: newRuntimeWindow(renderer),
|
||||||
Browser: newRuntimeBrowser(),
|
|
||||||
FileSystem: newRuntimeFileSystem(),
|
FileSystem: newRuntimeFileSystem(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
package wails
|
|
||||||
|
|
||||||
import "github.com/pkg/browser"
|
|
||||||
|
|
||||||
// GlobalRuntimeBrowser is the global instance of the RuntimeBrowser object
|
|
||||||
// Why? Because we need to use it in both the runtime and from the frontend
|
|
||||||
var GlobalRuntimeBrowser = newRuntimeBrowser()
|
|
||||||
|
|
||||||
// RuntimeBrowser exposes browser methods to the runtime
|
|
||||||
type RuntimeBrowser struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func newRuntimeBrowser() *RuntimeBrowser {
|
|
||||||
return &RuntimeBrowser{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OpenURL opens the given url in the system's default browser
|
|
||||||
func (r *RuntimeBrowser) OpenURL(url string) error {
|
|
||||||
return browser.OpenURL(url)
|
|
||||||
}
|
|
||||||
|
|
||||||
// OpenFile opens the given file in the system's default browser
|
|
||||||
func (r *RuntimeBrowser) OpenFile(filePath string) error {
|
|
||||||
return browser.OpenFile(filePath)
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
40
wailsruntimeassets/default/wails.min.1.js
Normal file
40
wailsruntimeassets/default/wails.min.1.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
(function(){window.wails=window.wails||{};window.backend={};function cryptoRandom(){var array=new Uint32Array(1);return window.crypto.getRandomValues(array)[0]}function basicRandom(){return Math.random()*9007199254740991}var randomFunc;if(window.crypto){randomFunc=cryptoRandom}else{randomFunc=basicRandom}function isValidIdentifier(name){try{new Function("var "+name);return true}catch(e){return false}}function addScript(js,callbackID){var script=document.createElement("script");script.text=js;document.body.appendChild(script);window.wails.events.emit(callbackID)}function injectCSS(css){var elem=document.createElement('style');elem.setAttribute('type','text/css');if(elem.styleSheet){elem.styleSheet.cssText=css}else{elem.appendChild(document.createTextNode(css))}var head=document.head||document.getElementsByTagName('head')[0];head.appendChild(elem)}var bindingsBasePath=window.backend;function addBindingPath(pathSections){var currentPath=bindingsBasePath;for(var sectionIndex in pathSections){var section=pathSections[sectionIndex];if(!isValidIdentifier(section)){var errMessage=section+" is not a valid javascript identifier.";var err=new Error(errMessage);return[null,err]}if(!currentPath[section]){currentPath[section]={}}currentPath=currentPath[section]}return[currentPath,null]}function newBinding(bindingName){var bindingSections=bindingName.split('.').splice(1);var callName=bindingSections.pop();var pathToBinding;var err;var bs=addBindingPath(bindingSections);var pathToBinding=bs[0];var err=bs[1];if(err!=null){return err}pathToBinding[callName]=function(){var timeout=0;function dynamic(){var args=[].slice.call(arguments);return call(bindingName,args,timeout)}dynamic.setTimeout=function(newTimeout){timeout=newTimeout};dynamic.getTimeout=function(){return timeout};return dynamic}()}var callbacks={};function call(bindingName,data,timeout){if(timeout==null||timeout==undefined){timeout=0}return new Promise(function(resolve,reject){var callbackID;do{callbackID=bindingName+"-"+randomFunc()}while(callbacks[callbackID]);if(timeout>0){var timeoutHandle=setTimeout(function(){reject(Error("Call to "+bindingName+" timed out. Request ID: "+callbackID))},timeout)}callbacks[callbackID]={timeoutHandle:timeoutHandle,reject:reject,resolve:resolve};try{var payloaddata=JSON.stringify(data);message={type:"call",callbackid:callbackID,payload:{bindingName:bindingName,data:payloaddata}};var payload=JSON.stringify(message);external.invoke(payload)}catch(e){console.error(e)}})}function callback(incomingMessage){var message;try{message=JSON.parse(incomingMessage)}catch(e){wails.log.debug("Invalid JSON passed to callback: "+e.message);wails.log.debug("Message: "+incomingMessage);return}callbackID=message.callbackid;callbackData=callbacks[callbackID];if(!callbackData){console.error("Callback '"+callbackID+"' not registed!!!");return}clearTimeout(callbackData.timeoutHandle);delete callbacks[callbackID];if(message.error){return callbackData.reject(message.error)}return callbackData.resolve(message.data)}var eventListeners={};function on(eventName,callback){eventListeners[eventName]=eventListeners[eventName]||[];eventListeners[eventName].push(callback)}function notify(eventName,data){if(eventListeners[eventName]){eventListeners[eventName].forEach(function(element){var parsedData=[];if(data){try{parsedData=JSON.parse(data)}catch(e){wails.log.error("Invalid JSON data sent to notify. Event name = "+eventName)}}element.apply(null,parsedData)})}}function emit(eventName){var data=JSON.stringify([].slice.apply(arguments).slice(1));message={type:"event",payload:{name:eventName,data:data}};external.invoke(JSON.stringify(message))}window.wails.events={emit:emit,on:on};function sendLogMessage(level,message){message={type:"log",payload:{level:level,message:message}};external.invoke(JSON.stringify(message))}function logDebug(message){sendLogMessage("debug",message)}function logInfo(message){sendLogMessage("info",message)}function logWarning(message){sendLogMessage("warning",message)}function logError(message){sendLogMessage("error",message)}function logFatal(message){sendLogMessage("fatal",message)}window.wails.log={debug:logDebug,info:logInfo,warning:logWarning,error:logError,fatal:logFatal};window.wails._={newBinding:newBinding,callback:callback,notify:notify,sendLogMessage:sendLogMessage,callbacks:callbacks,injectCSS:injectCSS,addScript:addScript};window.wails.events.emit("wails:loaded");})();
|
||||||
|
(function(){window.wails=window.wails||{};window.backend={};function cryptoRandom(){var array=new Uint32Array(1);return window.crypto.getRandomValues(array)[0]}
|
||||||
|
function basicRandom(){return Math.random()*9007199254740991}
|
||||||
|
var randomFunc;if(window.crypto){randomFunc=cryptoRandom}else{randomFunc=basicRandom}
|
||||||
|
function isValidIdentifier(name){try{new Function("var "+name);return!0}catch(e){return!1}}
|
||||||
|
function addScript(js,callbackID){var script=document.createElement("script");script.text=js;document.body.appendChild(script);window.wails.events.emit(callbackID)}
|
||||||
|
function injectCSS(css){var elem=document.createElement('style');elem.setAttribute('type','text/css');if(elem.styleSheet){elem.styleSheet.cssText=css}else{elem.appendChild(document.createTextNode(css))}
|
||||||
|
var head=document.head||document.getElementsByTagName('head')[0];head.appendChild(elem)}
|
||||||
|
var bindingsBasePath=window.backend;function addBindingPath(pathSections){var currentPath=bindingsBasePath;for(var sectionIndex in pathSections){var section=pathSections[sectionIndex];if(!isValidIdentifier(section)){var errMessage=section+" is not a valid javascript identifier.";var err=new Error(errMessage);return[null,err]}
|
||||||
|
if(!currentPath[section]){currentPath[section]={}}
|
||||||
|
currentPath=currentPath[section]}
|
||||||
|
return[currentPath,null]}
|
||||||
|
function newBinding(bindingName){var bindingSections=bindingName.split('.').splice(1);var callName=bindingSections.pop();var pathToBinding;var err;var bs=addBindingPath(bindingSections);var pathToBinding=bs[0];var err=bs[1];if(err!=null){return err}
|
||||||
|
pathToBinding[callName]=function(){var timeout=0;function dynamic(){var args=[].slice.call(arguments);return call(bindingName,args,timeout)}
|
||||||
|
dynamic.setTimeout=function(newTimeout){timeout=newTimeout}
|
||||||
|
dynamic.getTimeout=function(){return timeout}
|
||||||
|
return dynamic}()}
|
||||||
|
var callbacks={};function call(bindingName,data,timeout){if(timeout==null||timeout==undefined){timeout=0}
|
||||||
|
return new Promise(function(resolve,reject){var callbackID;do{callbackID=bindingName+"-"+randomFunc()}while(callbacks[callbackID]);if(timeout>0){var timeoutHandle=setTimeout(function(){reject(Error("Call to "+bindingName+" timed out. Request ID: "+callbackID))},timeout)}
|
||||||
|
callbacks[callbackID]={timeoutHandle:timeoutHandle,reject:reject,resolve:resolve}
|
||||||
|
try{var payloaddata=JSON.stringify(data);message={type:"call",callbackid:callbackID,payload:{bindingName:bindingName,data:payloaddata,}}
|
||||||
|
var payload=JSON.stringify(message);external.invoke(payload)}catch(e){console.error(e)}})}
|
||||||
|
function callback(incomingMessage){incomingMessage=decodeURIComponent(incomingMessage.replace(/\s+/g,'').replace(/[0-9a-f]{2}/g,'%$&'));var message;try{message=JSON.parse(incomingMessage)}catch(e){wails.log.debug("Invalid JSON passed to callback: "+e.message);wails.log.debug("Message: "+incomingMessage);return}
|
||||||
|
callbackID=message.callbackid;callbackData=callbacks[callbackID];if(!callbackData){console.error("Callback '"+callbackID+"' not registed!!!");return}
|
||||||
|
clearTimeout(callbackData.timeoutHandle);delete callbacks[callbackID];if(message.error){return callbackData.reject(message.error)}
|
||||||
|
return callbackData.resolve(message.data)}
|
||||||
|
var eventListeners={};function on(eventName,callback){eventListeners[eventName]=eventListeners[eventName]||[];eventListeners[eventName].push(callback)}
|
||||||
|
function notify(eventName,data){if(eventListeners[eventName]){eventListeners[eventName].forEach(function(element){var parsedData=[];if(data){try{parsedData=JSON.parse(data)}catch(e){wails.log.error("Invalid JSON data sent to notify. Event name = "+eventName)}}
|
||||||
|
element.apply(null,parsedData)})}}
|
||||||
|
function emit(eventName){var data=JSON.stringify([].slice.apply(arguments).slice(1));message={type:"event",payload:{name:eventName,data:data,}}
|
||||||
|
external.invoke(JSON.stringify(message))}
|
||||||
|
window.wails.events={emit:emit,on:on};function sendLogMessage(level,message){message={type:"log",payload:{level:level,message:message,}}
|
||||||
|
external.invoke(JSON.stringify(message))}
|
||||||
|
function logDebug(message){sendLogMessage("debug",message)}
|
||||||
|
function logInfo(message){sendLogMessage("info",message)}
|
||||||
|
function logWarning(message){sendLogMessage("warning",message)}
|
||||||
|
function logError(message){sendLogMessage("error",message)}
|
||||||
|
function logFatal(message){sendLogMessage("fatal",message)}
|
||||||
|
window.wails.log={debug:logDebug,info:logInfo,warning:logWarning,error:logError,fatal:logFatal,};window.wails._={newBinding:newBinding,callback:callback,notify:notify,sendLogMessage:sendLogMessage,callbacks:callbacks,injectCSS:injectCSS,addScript:addScript,}
|
||||||
|
window.wails.events.emit("wails:loaded")})()
|
||||||
2
wailsruntimeassets/default/wails.min.js
vendored
2
wailsruntimeassets/default/wails.min.js
vendored
@@ -1 +1 @@
|
|||||||
!function(){var e;function n(e){try{return new Function("var "+e),!0}catch(e){return!1}}window.wails=window.wails||{},window.backend={},e=window.crypto?function(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}:function(){return 9007199254740991*Math.random()};var a=window.backend;var t={};function r(n,a,r){return null!=r&&null!=r||(r=0),new Promise(function(i,o){var l;do{l=n+"-"+e()}while(t[l]);if(r>0)var c=setTimeout(function(){o(Error("Call to "+n+" timed out. Request ID: "+l))},r);t[l]={timeoutHandle:c,reject:o,resolve:i};try{var s=JSON.stringify(a);message={type:"call",callbackid:l,payload:{bindingName:n,data:s}};var u=JSON.stringify(message);external.invoke(u)}catch(e){console.error(e)}})}function i(e,n){return r(".wails."+e,n)}var o={};function l(e,n){n={type:"log",payload:{level:e,message:n}},external.invoke(JSON.stringify(n))}window.wails.events={emit:function(e){var n=JSON.stringify([].slice.apply(arguments).slice(1));message={type:"event",payload:{name:e,data:n}},external.invoke(JSON.stringify(message))},on:function(e,n){o[e]=o[e]||[],o[e].push(n)}},window.wails.Browser={OpenURL:function(e){return i("Browser.OpenURL",e)},OpenFile:function(e){return i("Browser.OpenFile",e)}},window.wails.log={debug:function(e){l("debug",e)},info:function(e){l("info",e)},warning:function(e){l("warning",e)},error:function(e){l("error",e)},fatal:function(e){l("fatal",e)}},window.wails._={newBinding:function(e){var t,i=e.split(".").splice(1),o=i.pop(),l=function(e){var t=a;for(var r in e){var i=e[r];if(!n(i))return[null,new Error(i+" is not a valid javascript identifier.")];t[i]||(t[i]={}),t=t[i]}return[t,null]}(i),c=l[0];if(null!=(t=l[1]))return t;c[o]=function(){var n=0;function a(){var a=[].slice.call(arguments);return r(e,a,n)}return a.setTimeout=function(e){n=e},a.getTimeout=function(){return n},a}()},callback:function(e){var n;e=decodeURIComponent(e.replace(/\s+/g,"").replace(/[0-9a-f]{2}/g,"%$&"));try{n=JSON.parse(e)}catch(n){return wails.log.debug("Invalid JSON passed to callback: "+n.message),void wails.log.debug("Message: "+e)}if(callbackID=n.callbackid,callbackData=t[callbackID],callbackData)return clearTimeout(callbackData.timeoutHandle),delete t[callbackID],n.error?callbackData.reject(n.error):callbackData.resolve(n.data);console.error("Callback '"+callbackID+"' not registed!!!")},notify:function(e,n){o[e]&&o[e].forEach(function(a){var t=[];if(n)try{t=JSON.parse(n)}catch(n){wails.log.error("Invalid JSON data sent to notify. Event name = "+e)}a.apply(null,t)})},sendLogMessage:l,callbacks:t,injectCSS:function(e){var n=document.createElement("style");n.setAttribute("type","text/css"),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)),(document.head||document.getElementsByTagName("head")[0]).appendChild(n)},addScript:function(e,n){var a=document.createElement("script");a.text=e,document.body.appendChild(a),window.wails.events.emit(n)}},window.wails.events.emit("wails:loaded")}();
|
!function(){var e;function n(e){try{return new Function("var "+e),!0}catch(e){return!1}}window.wails=window.wails||{},window.backend={},e=window.crypto?function(){var e=new Uint32Array(1);return window.crypto.getRandomValues(e)[0]}:function(){return 9007199254740991*Math.random()};var a=window.backend;var t={};var i={};function r(e,n){n={type:"log",payload:{level:e,message:n}},external.invoke(JSON.stringify(n))}window.wails.events={emit:function(e){var n=JSON.stringify([].slice.apply(arguments).slice(1));message={type:"event",payload:{name:e,data:n}},external.invoke(JSON.stringify(message))},on:function(e,n){i[e]=i[e]||[],i[e].push(n)}},window.wails.log={debug:function(e){r("debug",e)},info:function(e){r("info",e)},warning:function(e){r("warning",e)},error:function(e){r("error",e)},fatal:function(e){r("fatal",e)}},window.wails._={newBinding:function(i){var r,l=i.split(".").splice(1),o=l.pop(),c=function(e){var t=a;for(var i in e){var r=e[i];if(!n(r))return[null,new Error(r+" is not a valid javascript identifier.")];t[r]||(t[r]={}),t=t[r]}return[t,null]}(l),s=c[0];if(null!=(r=c[1]))return r;s[o]=function(){var n=0;function a(){var a=[].slice.call(arguments);return function(n,a,i){return null!=i&&null!=i||(i=0),new Promise(function(r,l){var o;do{o=n+"-"+e()}while(t[o]);if(i>0)var c=setTimeout(function(){l(Error("Call to "+n+" timed out. Request ID: "+o))},i);t[o]={timeoutHandle:c,reject:l,resolve:r};try{var s=JSON.stringify(a);message={type:"call",callbackid:o,payload:{bindingName:n,data:s}};var u=JSON.stringify(message);external.invoke(u)}catch(e){console.error(e)}})}(i,a,n)}return a.setTimeout=function(e){n=e},a.getTimeout=function(){return n},a}()},callback:function(e){var n;e=decodeURIComponent(e.replace(/\s+/g,"").replace(/[0-9a-f]{2}/g,"%$&"));try{n=JSON.parse(e)}catch(n){return wails.log.debug("Invalid JSON passed to callback: "+n.message),void wails.log.debug("Message: "+e)}if(callbackID=n.callbackid,callbackData=t[callbackID],callbackData)return clearTimeout(callbackData.timeoutHandle),delete t[callbackID],n.error?callbackData.reject(n.error):callbackData.resolve(n.data);console.error("Callback '"+callbackID+"' not registed!!!")},notify:function(e,n){i[e]&&i[e].forEach(function(a){var t=[];if(n)try{t=JSON.parse(n)}catch(n){wails.log.error("Invalid JSON data sent to notify. Event name = "+e)}a.apply(null,t)})},sendLogMessage:r,callbacks:t,injectCSS:function(e){var n=document.createElement("style");n.setAttribute("type","text/css"),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)),(document.head||document.getElementsByTagName("head")[0]).appendChild(n)},addScript:function(e,n){var a=document.createElement("script");a.text=e,document.body.appendChild(a),window.wails.events.emit(n)}},window.wails.events.emit("wails:loaded")}();
|
||||||
@@ -200,11 +200,6 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// systemCall is used to call wails methods from the frontend
|
|
||||||
function systemCall(method, data) {
|
|
||||||
return call(".wails." + method, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called by the backend to return data to a previously called
|
// Called by the backend to return data to a previously called
|
||||||
// binding invocation
|
// binding invocation
|
||||||
function callback(incomingMessage) {
|
function callback(incomingMessage) {
|
||||||
@@ -290,22 +285,6 @@
|
|||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
|
|
||||||
/************************* Browser **************************/
|
|
||||||
|
|
||||||
|
|
||||||
function OpenURL(url) {
|
|
||||||
return systemCall("Browser.OpenURL", url);
|
|
||||||
}
|
|
||||||
|
|
||||||
function OpenFile(filename) {
|
|
||||||
return systemCall("Browser.OpenFile", filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.wails.Browser = {
|
|
||||||
OpenURL,
|
|
||||||
OpenFile,
|
|
||||||
};
|
|
||||||
|
|
||||||
/************************* Logging **************************/
|
/************************* Logging **************************/
|
||||||
|
|
||||||
// Sends a log message to the backend with the given
|
// Sends a log message to the backend with the given
|
||||||
|
|||||||
Reference in New Issue
Block a user