feat: support explicit instance data deletion

This commit is contained in:
QiuSW
2026-07-27 23:16:11 +08:00
parent e400172d04
commit cab7e6ac7b
12 changed files with 670 additions and 28 deletions
+43
View File
@@ -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 {