From f35dfa09176f80d63dc98483688836949edeb145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=B1=E5=90=B9=E8=89=B2=E5=BE=A1=E5=AE=88?= <85992002+KazariEX@users.noreply.github.com> Date: Sat, 21 Dec 2024 04:10:24 +0800 Subject: [PATCH] feat(vscode): add timeout logic for insiders fetching (#5048) --- extensions/vscode/src/insiders.ts | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/extensions/vscode/src/insiders.ts b/extensions/vscode/src/insiders.ts index 33fda238cd..b6b1159ed0 100644 --- a/extensions/vscode/src/insiders.ts +++ b/extensions/vscode/src/insiders.ts @@ -4,30 +4,49 @@ import * as vscode from 'vscode'; export function useInsidersStatusItem(context: vscode.ExtensionContext) { const item = vscode.languages.createLanguageStatusItem('vue-insider', 'vue'); - item.text = 'Checking for Updates...'; - item.busy = true; - let succeed = false; + item.command = { + title: 'Fetch Versions', + command: 'vue-insiders.fetch', + }; + let status: 'idle' | 'pending' | 'success' = 'idle'; + + useCommand('vue-insiders.fetch', () => { + if (status === 'idle') { + fetchJson(); + } + }); fetchJson(); async function fetchJson() { + item.busy = true; + item.text = 'Checking for Updates...'; + item.severity = vscode.LanguageStatusSeverity.Warning; + status = 'pending'; + for (const url of [ 'https://raw.githubusercontent.com/vuejs/language-tools/HEAD/insiders.json', 'https://cdn.jsdelivr.net/gh/vuejs/language-tools/insiders.json', ]) { try { - const res = await fetch(url); + const controller = new AbortController(); + setTimeout(() => controller.abort(), 15000); + + const res = await fetch(url, { + signal: controller.signal, + }); onJson(await res.json() as any); - succeed = true; + status = 'success'; break; } catch { }; } item.busy = false; - if (!succeed) { + if (status !== 'success') { item.text = 'Failed to Fetch Versions'; item.severity = vscode.LanguageStatusSeverity.Error; + status = 'idle'; } }