56 lines
1.7 KiB
Go
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
|
|
}
|