feat: initial commit
This commit is contained in:
110
pkg/wails3kit/updates/wails/service.go
Normal file
110
pkg/wails3kit/updates/wails/service.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package wails
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/Eriyc/rules_wails/pkg/wails3kit/updates"
|
||||
"github.com/wailsapp/wails/v3/pkg/application"
|
||||
)
|
||||
|
||||
type Options struct {
|
||||
App *application.App
|
||||
Controller *updates.Controller
|
||||
EventName string
|
||||
AutoCheckOnStartup bool
|
||||
Emitter func(string, any)
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
controller *updates.Controller
|
||||
eventName string
|
||||
autoCheckOnStartup bool
|
||||
emitter func(string, any)
|
||||
stop func()
|
||||
done chan struct{}
|
||||
}
|
||||
|
||||
func RegisterEvents(eventName string) {
|
||||
if eventName == "" {
|
||||
eventName = "updates:state"
|
||||
}
|
||||
application.RegisterEvent[updates.Snapshot](eventName)
|
||||
}
|
||||
|
||||
func NewService(opts Options) *Service {
|
||||
eventName := opts.EventName
|
||||
if eventName == "" {
|
||||
eventName = "updates:state"
|
||||
}
|
||||
|
||||
emitter := opts.Emitter
|
||||
if emitter == nil && opts.App != nil {
|
||||
emitter = func(name string, data any) {
|
||||
opts.App.Event.Emit(name, data)
|
||||
}
|
||||
}
|
||||
|
||||
return &Service{
|
||||
controller: opts.Controller,
|
||||
eventName: eventName,
|
||||
autoCheckOnStartup: opts.AutoCheckOnStartup,
|
||||
emitter: emitter,
|
||||
done: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
func (service *Service) ServiceStartup(_ context.Context, _ application.ServiceOptions) error {
|
||||
if service.controller == nil {
|
||||
return updates.ErrInvalidConfig
|
||||
}
|
||||
|
||||
channel, stop := service.controller.Subscribe(4)
|
||||
service.stop = stop
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-service.done:
|
||||
return
|
||||
case snapshot := <-channel:
|
||||
if service.emitter != nil {
|
||||
service.emitter(service.eventName, snapshot)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
if service.autoCheckOnStartup {
|
||||
go func() {
|
||||
_, _ = service.Check()
|
||||
}()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service *Service) ServiceShutdown() error {
|
||||
if service.stop != nil {
|
||||
service.stop()
|
||||
}
|
||||
select {
|
||||
case <-service.done:
|
||||
default:
|
||||
close(service.done)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (service *Service) Snapshot() updates.Snapshot {
|
||||
return service.controller.Snapshot()
|
||||
}
|
||||
|
||||
func (service *Service) Check() (updates.Snapshot, error) {
|
||||
return service.controller.Check(context.Background(), updates.CheckRequest{})
|
||||
}
|
||||
|
||||
func (service *Service) Download() (updates.Snapshot, error) {
|
||||
return service.controller.Download(context.Background())
|
||||
}
|
||||
|
||||
func (service *Service) ApplyAndRestart() error {
|
||||
return service.controller.ApplyAndRestart(context.Background())
|
||||
}
|
||||
Reference in New Issue
Block a user