feat: support explicit instance data deletion
This commit is contained in:
@@ -133,6 +133,12 @@ func runWindow(logger *slog.Logger) {
|
||||
monitor: exitMonitor,
|
||||
}.Start, window.Invalidate)
|
||||
shell.OnStopInstance(instanceStopper{launcher: launcher, managedProfiles: launcher, monitor: exitMonitor}.Stop, window.Invalidate)
|
||||
dataRemover := files.NewInstanceDataRemover()
|
||||
shell.OnDeleteInstanceData(instanceDataDeleter{
|
||||
managedProfiles: launcher,
|
||||
externalProfiles: externalProfiles,
|
||||
dataRemover: dataRemover,
|
||||
}.Delete, window.Invalidate)
|
||||
shell.OnRefreshInstances(instanceStatusRefresher{
|
||||
managedProfiles: launcher,
|
||||
externalProfiles: externalProfiles,
|
||||
@@ -483,6 +489,43 @@ func (s instanceStatusRefresher) refreshOne(ctx context.Context, row ui.Instance
|
||||
return result
|
||||
}
|
||||
|
||||
type instanceDataDeleter struct {
|
||||
managedProfiles managedProfileInspector
|
||||
externalProfiles browser.ExternalProfileInspector
|
||||
dataRemover files.InstanceDataRemover
|
||||
}
|
||||
|
||||
func (d instanceDataDeleter) Delete(ctx context.Context, row ui.InstanceRow) error {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
if d.managedProfiles == nil || d.externalProfiles == nil || d.dataRemover == nil {
|
||||
return errors.New("实例数据删除服务尚未准备好")
|
||||
}
|
||||
if strings.TrimSpace(row.UserDataDir) == "" || !filepath.IsAbs(row.UserDataDir) {
|
||||
return files.ErrUnsafeInstanceDataDirectory
|
||||
}
|
||||
kind, err := browserKind(row.Browser)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
managed, err := d.managedProfiles.InspectProfile(ctx, row.UserDataDir)
|
||||
if err != nil {
|
||||
return fmt.Errorf("检查 Chub 实例占用失败:%w", err)
|
||||
}
|
||||
if managed.Occupied {
|
||||
return domain.ErrProfileOccupied
|
||||
}
|
||||
external, err := d.externalProfiles.InspectProfile(ctx, kind, row.UserDataDir, row.PID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("检查外部浏览器占用失败:%w", err)
|
||||
}
|
||||
if external.Occupied {
|
||||
return domain.ErrProfileOccupied
|
||||
}
|
||||
return d.dataRemover.RemoveInstanceData(ctx, row.UserDataDir)
|
||||
}
|
||||
|
||||
func (s instanceStarter) Start(ctx context.Context, row ui.InstanceRow, settings ui.SettingsState, launchGeneration uint64) (ui.InstanceStartOutcome, error) {
|
||||
kind, err := browserKind(row.Browser)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user