forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAutoTrigger.swift
More file actions
58 lines (53 loc) · 2.06 KB
/
AutoTrigger.swift
File metadata and controls
58 lines (53 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import Foundation
import XPCShared
actor AutoTrigger {
static let shared = AutoTrigger()
private var listeners = Set<ObjectIdentifier>()
var eventObserver: CGEventObserverType = CGEventObserver()
var task: Task<Void, Error>?
private init() {
Task { @ServiceActor in
while !Task.isCancelled {
try await Task.sleep(nanoseconds: 8 * 60 * 60 * 1_000_000_000)
for (url, workspace) in workspaces {
if workspace.isExpired {
workspaces[url] = nil
} else {
workspaces[url]?.cleanUp()
}
}
}
}
}
func start(by listener: ObjectIdentifier) {
listeners.insert(listener)
if task == nil {
task = Task { [stream = eventObserver.stream] in
var triggerTask: Task<Void, Error>?
try? await Environment.triggerAction("Realtime Suggestions")
for await _ in stream {
triggerTask?.cancel()
if Task.isCancelled { break }
triggerTask = Task { @ServiceActor in
try? await Task.sleep(nanoseconds: 2_000_000_000)
if Task.isCancelled { return }
let fileURL = try? await Environment.fetchCurrentFileURL()
guard let folderURL = try? await Environment.fetchCurrentProjectRootURL(fileURL),
let workspace = workspaces[folderURL],
workspace.isRealtimeSuggestionEnabled
else { return }
try? await Environment.triggerAction("Realtime Suggestions")
}
}
}
}
eventObserver.activateIfPossible()
}
func stop(by listener: ObjectIdentifier) {
listeners.remove(listener)
guard listeners.isEmpty else { return }
task?.cancel()
task = nil
eventObserver.deactivate()
}
}