Files

56 lines
1.7 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package review
import (
"context"
"time"
"git.stormux.org/storm/cthulhu/internal/atspi"
)
type focusedSnapshotReader interface {
ReadFocusedSnapshot(context.Context, atspi.ObjectID) (atspi.DocumentContent, error)
}
// ReadWhereAmI queues privacy verification without blocking the command loop.
// Providers without a focused snapshot operation retain their local-only path.
func (worker *Worker) ReadWhereAmI(revision uint64) error {
focus := worker.Focus()
if !focus.Valid() {
return ErrNoCurrent
}
if _, ok := worker.nativeCapturerFor(focus).(focusedSnapshotReader); !ok {
return ErrNoCurrent
}
select {
case worker.requests <- request{whereAmI: true, whereAmIRevision: revision, readFocus: focus,
documentEpoch: worker.documentEpoch.Load(), queuedAt: time.Now()}:
return nil
default:
return ErrRequestQueueFull
}
}
func (worker *Worker) read_where_am_i(ctx context.Context, request request) Result {
result := Result{WhereAmI: true, WhereAmIRevision: request.whereAmIRevision, DocumentFocus: request.readFocus}
if !result.DocumentFocus.Valid() || result.DocumentFocus != worker.Focus() {
result.Err = ErrNoCurrent
return result
}
reader, ok := worker.nativeCapturerFor(result.DocumentFocus).(focusedSnapshotReader)
if !ok {
result.Err = ErrNoCurrent
return result
}
deadline, cancel := context.WithTimeout(ctx, worker.captureTimeout)
defer cancel()
content, err := reader.ReadFocusedSnapshot(deadline, result.DocumentFocus)
result.Err = err
result.DocumentPosition.Snapshot = content.Snapshot
result.DocumentCaretContext = content.SourceContext
return result
}