@@ -35,24 +35,38 @@ enum CodeiumError: Error, LocalizedError {
3535public class CodeiumSuggestionService {
3636 static let sessionId = UUID ( ) . uuidString
3737 let projectRootURL : URL
38- var server : CodeiumLSP
38+ var server : CodeiumLSP ?
3939 var heartbeatTask : Task < Void , Error > ?
4040 var requestCounter : UInt64 = 0
4141 let openedDocumentPool = OpenedDocumentPool ( )
42+ let onServiceLaunched : ( ) -> Void
43+
44+ let languageServerURL : URL
45+ let supportURL : URL
4246
4347 init ( designatedServer: CodeiumLSP ) {
4448 projectRootURL = URL ( fileURLWithPath: " / " )
4549 server = designatedServer
50+ onServiceLaunched = { }
51+ languageServerURL = URL ( fileURLWithPath: " / " )
52+ supportURL = URL ( fileURLWithPath: " / " )
4653 }
4754
4855 public init ( projectRootURL: URL , onServiceLaunched: @escaping ( ) -> Void ) throws {
4956 self . projectRootURL = projectRootURL
50-
57+ self . onServiceLaunched = onServiceLaunched
5158 let urls = try CodeiumSuggestionService . createFoldersIfNeeded ( )
52- let languageServerURL = urls. executableURL. appendingPathComponent ( " language_server " )
59+ languageServerURL = urls. executableURL. appendingPathComponent ( " language_server " )
60+ supportURL = urls. supportURL
5361 guard FileManager . default. fileExists ( atPath: languageServerURL. path) else {
5462 throw CodeiumError . languageServerNotInstalled
5563 }
64+ try setupServerIfNeeded ( )
65+ }
66+
67+ @discardableResult
68+ func setupServerIfNeeded( ) throws -> CodeiumLSP {
69+ if let server { return server }
5670 let tempFolderURL = FileManager . default. temporaryDirectory
5771 let managerDirectoryURL = tempFolderURL
5872 . appendingPathComponent ( " com.intii.CopilotForXcode " )
@@ -63,32 +77,38 @@ public class CodeiumSuggestionService {
6377 withIntermediateDirectories: true
6478 )
6579 }
80+
6681 let server = CodeiumLanguageServer (
6782 languageServerExecutableURL: languageServerURL,
6883 managerDirectoryURL: managerDirectoryURL,
69- supportURL: urls . supportURL
84+ supportURL: supportURL
7085 )
7186
72- self . server = server
7387 server. terminationHandler = { [ weak self] in
74- Logger . codeium. info ( " Language server is terminated " )
75- guard let self else { return }
88+ self ? . server = nil
89+ self ? . heartbeatTask? . cancel ( )
90+ self ? . requestCounter = 0
91+ Logger . codeium. info ( " Language server is terminated, will be restarted when needed. " )
7692 }
93+
7794 server. launchHandler = { [ weak self] in
7895 guard let self else { return }
7996 let metadata = self . getMetadata ( )
80- onServiceLaunched ( )
97+ self . onServiceLaunched ( )
8198 self . heartbeatTask = Task { [ weak self] in
8299 while true {
83100 try Task . checkCancellation ( )
84- _ = try ? await self ? . server. sendRequest (
101+ _ = try ? await self ? . server? . sendRequest (
85102 CodeiumRequest . Heartbeat ( requestBody: . init( metadata: metadata) )
86103 )
87104 try await Task . sleep ( nanoseconds: 5_000_000_000 )
88105 }
89106 }
90107 }
108+
91109 server. start ( )
110+ self . server = server
111+ return server
92112 }
93113
94114 public static func createFoldersIfNeeded( ) throws -> (
@@ -200,7 +220,7 @@ extension CodeiumSuggestionService: CodeiumSuggestionServiceType {
200220 }
201221 ) )
202222
203- let result = try await server . sendRequest ( request)
223+ let result = try await ( try setupServerIfNeeded ( ) ) . sendRequest ( request)
204224
205225 return result. completionItems? . filter { item in
206226 if ignoreSpaceOnlySuggestions {
@@ -228,10 +248,11 @@ extension CodeiumSuggestionService: CodeiumSuggestionServiceType {
228248 }
229249
230250 public func notifyAccepted( _ suggestion: CodeSuggestion ) async {
231- _ = try ? await server. sendRequest ( CodeiumRequest . AcceptCompletion ( requestBody: . init(
232- metadata: getMetadata ( ) ,
233- completion_id: suggestion. uuid
234- ) ) )
251+ _ = try ? await ( try setupServerIfNeeded ( ) )
252+ . sendRequest ( CodeiumRequest . AcceptCompletion ( requestBody: . init(
253+ metadata: getMetadata ( ) ,
254+ completion_id: suggestion. uuid
255+ ) ) )
235256 }
236257
237258 public func notifyOpenTextDocument( fileURL: URL , content: String ) async throws {
0 commit comments