|
1 | | -import * as lc from "vscode-languageclient/node"; |
2 | 1 | import * as vscode from "vscode"; |
3 | 2 | import { strict as nativeAssert } from "assert"; |
4 | 3 | import { exec, ExecOptions, spawnSync } from "child_process"; |
@@ -57,41 +56,6 @@ export const log = new (class { |
57 | 56 | } |
58 | 57 | })(); |
59 | 58 |
|
60 | | -export async function sendRequestWithRetry<TParam, TRet>( |
61 | | - client: lc.LanguageClient, |
62 | | - reqType: lc.RequestType<TParam, TRet, unknown>, |
63 | | - param: TParam, |
64 | | - token?: vscode.CancellationToken |
65 | | -): Promise<TRet> { |
66 | | - // The sequence is `10 * (2 ** (2 * n))` where n is 1, 2, 3... |
67 | | - for (const delay of [40, 160, 640, 2560, 10240, null]) { |
68 | | - try { |
69 | | - return await (token |
70 | | - ? client.sendRequest(reqType, param, token) |
71 | | - : client.sendRequest(reqType, param)); |
72 | | - } catch (error: unknown) { |
73 | | - if (delay === null) { |
74 | | - log.warn("LSP request timed out", { method: reqType.method, param, error }); |
75 | | - throw error; |
76 | | - } |
77 | | - |
78 | | - if (error instanceof lc.ResponseError) { |
79 | | - switch (error.code) { |
80 | | - case lc.LSPErrorCodes.RequestCancelled: |
81 | | - throw error; |
82 | | - case lc.LSPErrorCodes.ContentModified: |
83 | | - await sleep(delay); |
84 | | - continue; |
85 | | - } |
86 | | - } |
87 | | - |
88 | | - log.warn("LSP request failed", { method: reqType.method, param, error }); |
89 | | - throw error; |
90 | | - } |
91 | | - } |
92 | | - throw "unreachable"; |
93 | | -} |
94 | | - |
95 | 59 | export function sleep(ms: number) { |
96 | 60 | return new Promise((resolve) => setTimeout(resolve, ms)); |
97 | 61 | } |
|
0 commit comments