Skip to content

Commit f2ac09a

Browse files
committed
Restart language server if possible
1 parent ae9308f commit f2ac09a

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

Core/Sources/CodeiumService/CodeiumService.swift

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,38 @@ enum CodeiumError: Error, LocalizedError {
3535
public 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

Comments
 (0)