11import Foundation
22import LanguageClient
33import LanguageServerProtocol
4+ import Logger
45import SuggestionModel
56
67public protocol CodeiumSuggestionServiceType {
@@ -26,11 +27,13 @@ enum CodeiumError: Error, LocalizedError {
2627 }
2728}
2829
29- let token = " "
3030
3131public class CodeiumSuggestionService : CodeiumSuggestionServiceType {
32+ static let sessionId = UUID ( ) . uuidString
3233 let projectRootURL : URL
3334 var server : CodeiumLSP
35+ var heartbeatTask : Task < Void , Error > ?
36+ var requestCounter : UInt64 = 0
3437
3538 init ( designatedServer: CodeiumLSP ) {
3639 projectRootURL = URL ( fileURLWithPath: " / " )
@@ -62,11 +65,22 @@ public class CodeiumSuggestionService: CodeiumSuggestionServiceType {
6265 )
6366
6467 self . server = server
65- server. terminationHandler = {
66- print ( " terminated " )
68+ server. terminationHandler = { [ weak self] in
69+ Logger . codeium. info ( " Language server is terminated " )
70+ guard let self else { return }
6771 }
68- server. launchHandler = {
69- print ( " launched " )
72+ server. launchHandler = { [ weak self] in
73+ guard let self else { return }
74+ let metadata = self . getMetadata ( )
75+ self . heartbeatTask = Task { [ weak self] in
76+ while true {
77+ try Task . checkCancellation ( )
78+ _ = try ? await self ? . server. sendRequest (
79+ CodeiumRequest . Heartbeat ( requestBody: . init( metadata: metadata) )
80+ )
81+ try await Task . sleep ( nanoseconds: 5_000_000_000 )
82+ }
83+ }
7084 }
7185 server. start ( )
7286 }
@@ -80,6 +94,7 @@ public class CodeiumSuggestionService: CodeiumSuggestionServiceType {
8094 usesTabsForIndentation: Bool ,
8195 ignoreSpaceOnlySuggestions: Bool
8296 ) async throws -> [ CodeSuggestion ] {
97+ requestCounter += 1
8398 let languageId = languageIdentifierFromFileURL ( fileURL)
8499
85100 let relativePath = {
@@ -98,12 +113,7 @@ public class CodeiumSuggestionService: CodeiumSuggestionServiceType {
98113 } ( )
99114
100115 let request = CodeiumRequest . GetCompletion ( requestBody: . init(
101- metadata: . init(
102- ide_name: " jetbrains " , ide_version: " 14.3 " , extension_name: " Copilot for Xcode " ,
103- extension_version: " 14.0.0 " ,
104- api_key: token,
105- session_id: UUID ( ) . uuidString, request_id: 100
106- ) ,
116+ metadata: getMetadata ( ) ,
107117 document: . init(
108118 absolute_path: fileURL. path,
109119 relative_path: relativePath,
@@ -184,3 +194,17 @@ public class CodeiumSuggestionService: CodeiumSuggestionServiceType {
184194 }
185195}
186196
197+ extension CodeiumSuggestionService {
198+ func getMetadata( ) -> Metadata {
199+ Metadata (
200+ ide_name: " jetbrains " ,
201+ ide_version: " 14.3 " ,
202+ extension_name: " Copilot for Xcode " ,
203+ extension_version: " 14.0.0 " ,
204+ api_key: token,
205+ session_id: CodeiumSuggestionService . sessionId,
206+ request_id: requestCounter
207+ )
208+ }
209+ }
210+
0 commit comments