Skip to content

Commit f286f19

Browse files
authored
feat: implement single instance lock (#31)
1 parent 9f8c2a0 commit f286f19

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

binding/ai/service.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,13 @@ import (
1010
)
1111

1212
// Service provides AI methods for the frontend
13-
type Service struct {
14-
ctx context.Context
15-
}
13+
type Service struct{}
1614

1715
// NewService creates a new AI Service
1816
func NewService() *Service {
1917
return &Service{}
2018
}
2119

22-
// SetContext sets the context for the service
23-
func (s *Service) SetContext(ctx context.Context) {
24-
s.ctx = ctx
25-
}
26-
2720
// TextRequest defines the parameters for text generation
2821
type TextRequest struct {
2922
Prompt string `json:"prompt"`
@@ -102,6 +95,7 @@ func (s *Service) getClient(providerID int) (aiservice.AIClient, error) {
10295

10396
// GenerateText generates text based on the prompt
10497
func (s *Service) GenerateText(req TextRequest) (*AIResponse, error) {
98+
ctx := context.Background()
10599
client, err := s.getClient(req.ProviderID)
106100
if err != nil {
107101
return nil, err
@@ -119,7 +113,7 @@ func (s *Service) GenerateText(req TextRequest) (*AIResponse, error) {
119113
Options: req.Options,
120114
}
121115

122-
resp, err := client.GenerateText(s.ctx, aiReq)
116+
resp, err := client.GenerateText(ctx, aiReq)
123117
if err != nil {
124118
return nil, err
125119
}
@@ -137,6 +131,7 @@ func (s *Service) GenerateText(req TextRequest) (*AIResponse, error) {
137131

138132
// GenerateImage generates an image based on the prompt
139133
func (s *Service) GenerateImage(req ImageRequest) (*AIResponse, error) {
134+
ctx := context.Background()
140135
client, err := s.getClient(req.ProviderID)
141136
if err != nil {
142137
return nil, err
@@ -154,7 +149,7 @@ func (s *Service) GenerateImage(req ImageRequest) (*AIResponse, error) {
154149
Options: req.Options,
155150
}
156151

157-
resp, err := client.GenerateImage(s.ctx, aiReq)
152+
resp, err := client.GenerateImage(ctx, aiReq)
158153
if err != nil {
159154
return nil, err
160155
}
@@ -172,6 +167,7 @@ func (s *Service) GenerateImage(req ImageRequest) (*AIResponse, error) {
172167

173168
// GenerateVideo generates a video based on the prompt
174169
func (s *Service) GenerateVideo(req VideoRequest) (*AIResponse, error) {
170+
ctx := context.Background()
175171
client, err := s.getClient(req.ProviderID)
176172
if err != nil {
177173
return nil, err
@@ -188,7 +184,7 @@ func (s *Service) GenerateVideo(req VideoRequest) (*AIResponse, error) {
188184
Options: req.Options,
189185
}
190186

191-
resp, err := client.GenerateVideo(s.ctx, aiReq)
187+
resp, err := client.GenerateVideo(ctx, aiReq)
192188
if err != nil {
193189
return nil, err
194190
}
@@ -206,6 +202,7 @@ func (s *Service) GenerateVideo(req VideoRequest) (*AIResponse, error) {
206202

207203
// GenerateAudio generates audio based on the prompt
208204
func (s *Service) GenerateAudio(req AudioRequest) (*AIResponse, error) {
205+
ctx := context.Background()
209206
client, err := s.getClient(req.ProviderID)
210207
if err != nil {
211208
return nil, err
@@ -222,7 +219,7 @@ func (s *Service) GenerateAudio(req AudioRequest) (*AIResponse, error) {
222219
Options: req.Options,
223220
}
224221

225-
resp, err := client.GenerateAudio(s.ctx, aiReq)
222+
resp, err := client.GenerateAudio(ctx, aiReq)
226223
if err != nil {
227224
return nil, err
228225
}
@@ -243,6 +240,7 @@ func (s *Service) GenerateAudio(req AudioRequest) (*AIResponse, error) {
243240

244241
// ListModels lists available models for a given provider ID. If providerId is nil, lists from all providers.
245242
func (s *Service) ListModels(providerId *int) ([]aiservice.Model, error) {
243+
ctx := context.Background()
246244
if providerId == nil {
247245
configs, err := database.ListModelProviders()
248246
if err != nil {
@@ -256,7 +254,7 @@ func (s *Service) ListModels(providerId *int) ([]aiservice.Model, error) {
256254
fmt.Printf("failed to create client for %s: %v\n", config.Name, err)
257255
continue
258256
}
259-
models, err := client.ListModels(s.ctx)
257+
models, err := client.ListModels(ctx)
260258
if err != nil {
261259
fmt.Printf("failed to list models for %s: %v\n", config.Name, err)
262260
continue
@@ -279,7 +277,7 @@ func (s *Service) ListModels(providerId *int) ([]aiservice.Model, error) {
279277
return nil, fmt.Errorf("failed to create client for provider id %d: %w", *providerId, err)
280278
}
281279

282-
return client.ListModels(s.ctx)
280+
return client.ListModels(ctx)
283281
}
284282

285283
func (s *Service) processContent(projectID int, data []byte, b64 string, url string, prefix string, ext string, assetType database.AssetType) (string, error) {

frontend/package.json.md5

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
c8890003b031e7458f91b09c2b9f2c7b
1+
ab9312e57027b02a237c20c47f8e7d38

main.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"context"
45
"embed"
56
"fmt"
67
"io"
@@ -22,6 +23,7 @@ import (
2223
"github.com/wailsapp/wails/v2/pkg/options"
2324
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
2425
"github.com/wailsapp/wails/v2/pkg/options/mac"
26+
"github.com/wailsapp/wails/v2/pkg/runtime"
2527
)
2628

2729
//go:embed all:frontend/dist
@@ -30,6 +32,8 @@ var assets embed.FS
3032
//go:embed wails.json
3133
var wailsJSON string
3234

35+
var wailsContext *context.Context
36+
3337
// startFileServer starts a local HTTP server to serve generated files with CORS enabled.
3438
func startFileServer() {
3539
genDir, err := storage.GetGeneratedDir()
@@ -144,7 +148,20 @@ func main() {
144148
appService,
145149
},
146150
HideWindowOnClose: true,
147-
OnStartup: aiService.SetContext,
151+
OnStartup: func(ctx context.Context) {
152+
wailsContext = &ctx
153+
},
154+
SingleInstanceLock: &options.SingleInstanceLock{
155+
UniqueId: "3e347bce-745e-4dd3-a6de-c6e6e2a44c86",
156+
OnSecondInstanceLaunch: func(secondInstanceData options.SecondInstanceData) {
157+
secondInstanceArgs := secondInstanceData.Args
158+
println("user opened second instance", strings.Join(secondInstanceData.Args, ","))
159+
println("user opened second from", secondInstanceData.WorkingDirectory)
160+
runtime.WindowUnminimise(*wailsContext)
161+
runtime.Show(*wailsContext)
162+
go runtime.EventsEmit(*wailsContext, "launchArgs", secondInstanceArgs)
163+
},
164+
},
148165
Mac: &mac.Options{
149166
TitleBar: mac.TitleBarHiddenInset(),
150167
},

0 commit comments

Comments
 (0)