50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { MessageConnection } from '@codingame/monaco-jsonrpc'
|
|
import {
|
|
MonacoLanguageClient,
|
|
ErrorAction,
|
|
CloseAction,
|
|
createConnection
|
|
} from '@codingame/monaco-languageclient'
|
|
import normalizeUrl from 'normalize-url'
|
|
import ReconnectingWebSocket from 'reconnecting-websocket'
|
|
|
|
export function createLanguageClient(connection: MessageConnection): MonacoLanguageClient {
|
|
return new MonacoLanguageClient({
|
|
name: 'Clangd Language Client',
|
|
clientOptions: {
|
|
// use a language id as a document selector
|
|
documentSelector: ['c', 'h'],
|
|
// disable the default error handler
|
|
errorHandler: {
|
|
error: () => ErrorAction.Continue,
|
|
closed: () => {
|
|
return CloseAction.DoNotRestart
|
|
}
|
|
}
|
|
},
|
|
// create a language client connection from the JSON RPC connection on demand
|
|
connectionProvider: {
|
|
get: (errorHandler, closeHandler) => {
|
|
return Promise.resolve(createConnection(connection, errorHandler, closeHandler))
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
export function createUrl(path: string): string {
|
|
const protocol = location.protocol === 'https:' ? 'wss' : 'ws'
|
|
return normalizeUrl(`${protocol}://${location.host}${location.pathname}${path}`)
|
|
}
|
|
|
|
export function createWebSocket(url: string) {
|
|
const socketOptions = {
|
|
maxReconnectionDelay: 10000,
|
|
minReconnectionDelay: 1000,
|
|
reconnectionDelayGrowFactor: 1.3,
|
|
connectionTimeout: 10000,
|
|
maxRetries: Infinity,
|
|
debug: false
|
|
}
|
|
return new ReconnectingWebSocket(url, [], socketOptions)
|
|
}
|