Newton-Editor/src/app/common/services/lsp.service.ts

75 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-05-30 05:30:54 +00:00
import { Injectable } from '@angular/core';
import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
import { AceLanguageClient, LanguageClientConfig } from 'ace-linters/build/ace-language-client';
import { LanguageProvider } from "ace-linters";
@Injectable({
providedIn: 'root'
})
export class LSPService {
lspConfigData!: {};
languageProviders: {} = {};
2025-05-30 05:30:54 +00:00
constructor() {
this.loadLSPService();
}
private loadLSPService() {
this.getLspConfigData().then((lspConfigData: string) => {
this.lspConfigData = JSON.parse(lspConfigData);
if (this.lspConfigData["message"]) {
console.log(
"Warning: LSP this.lspConfigData is a 'message'",
this.lspConfigData
);
this.lspConfigData = {};
}
});
}
public registerEditor(editor: any): void {
let modeParts = editor.getSession()["$modeId"].split("/");
let mode = modeParts[ modeParts.length - 1 ];
if ( !this.languageProviders[mode] ) {
this.languageProviders[mode] = this.getLanguageProviderWithClientServer(mode);
}
this.languageProviders[mode].registerEditor(editor);
2025-05-30 05:30:54 +00:00
}
private getLspConfigData(): Promise<string> {
return window.fs.getLspConfigData();
}
private getLanguageProviderWithClientServer(mode: string) {
2025-05-30 05:30:54 +00:00
let _initializationOptions = {};
if (Object.keys(this.lspConfigData).length !== 0) {
_initializationOptions = this.lspConfigData[mode]["initialization-options"];
2025-05-30 05:30:54 +00:00
}
let servers: LanguageClientConfig[] = [
{
module: () => import("ace-linters/build/language-client"),
modes: mode,
2025-05-30 05:30:54 +00:00
type: "socket",
socket: new WebSocket(`ws://127.0.0.1:9999/${mode}`),
// socket: new WebSocket("ws://127.0.0.1:9999/?name=pylsp"),
2025-05-30 05:30:54 +00:00
initializationOptions: _initializationOptions
}
];
return AceLanguageClient.for(servers);
}
2025-05-30 05:30:54 +00:00
private getLanguageProviderWithWebWorker() {
let worker = new Worker(new URL('./webworker.js', import.meta.url));
return LanguageProvider.create(worker);
}
}