From 12085b9c4f1972b756c4366a33392c9ca1d60d73 Mon Sep 17 00:00:00 2001 From: Ricardo Junior Date: Fri, 17 Jul 2026 10:56:21 -0300 Subject: [PATCH] fix: converter item, timeout --- package.json | 6 ++++++ src/ccs/commands/converterItem.ts | 16 ++++++++++++++-- src/ccs/config/schema.md | 3 ++- src/ccs/config/settings.ts | 13 ++++++++++--- src/ccs/sourcecontrol/clients/converterClient.ts | 4 ++-- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 7a1f1485..3480813e 100644 --- a/package.json +++ b/package.json @@ -1475,6 +1475,12 @@ "cswutil80" ], "when": "config.consistem.converterItem.autoConvertOnSave" + }, + "consistem.converterItem.timeout": { + "markdownDescription": "Tempo limite (ms) aplicado às chamadas de conversão de item (`Converter Item`, `Converter Item Customizado` e conversão automática ao salvar). Use um valor mais alto em servidores/máquinas lentas. Use `0` para desativar o tempo limite. As demais chamadas do módulo continuam usando `objectscript.ccs.requestTimeout`.", + "type": "number", + "default": 180000, + "minimum": 0 } } }, diff --git a/src/ccs/commands/converterItem.ts b/src/ccs/commands/converterItem.ts index bcf76fad..2ff79438 100644 --- a/src/ccs/commands/converterItem.ts +++ b/src/ccs/commands/converterItem.ts @@ -91,7 +91,7 @@ export async function convertCurrentItemCustom(): Promise { strParamPersist, }; - const responseText = await sharedClient.convertCustom(editor.document, payload); + const responseText = await withConversionProgress(item, () => sharedClient.convertCustom(editor.document, payload)); renderConversionOutput(responseText); } catch (error) { @@ -131,7 +131,9 @@ async function convertDocumentItem( const item = getItemName(document); try { - const responseText = await sharedClient.convertDefault(document, item, flgDisplayLinasNaoConv); + const responseText = await withConversionProgress(item, () => + sharedClient.convertDefault(document, item, flgDisplayLinasNaoConv) + ); renderConversionOutput(responseText); } catch (error) { if (silentError) { @@ -157,6 +159,16 @@ function isInExcludedPackage(document: vscode.TextDocument, excludedPackages: st return pathParts.some((part) => normalizedExcluded.has(part)); } +function withConversionProgress(item: string, task: () => Promise): Thenable { + return vscode.window.withProgress( + { + location: vscode.ProgressLocation.Window, + title: `Convertendo item ${item}...`, + }, + task + ); +} + function renderConversionOutput(responseText: string): void { responseText .split(/\r?\n/) diff --git a/src/ccs/config/schema.md b/src/ccs/config/schema.md index 8fccf8b0..a0378877 100644 --- a/src/ccs/config/schema.md +++ b/src/ccs/config/schema.md @@ -5,11 +5,12 @@ As opções abaixo controlam as integrações específicas para o fork da Consis | Chave | Tipo | Padrão | Descrição | | ----------------------------------------- | ------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------- | | `objectscript.ccs.endpoint` | `string` | `undefined` | URL base alternativa para a API. Se não definida, a URL é derivada da conexão ativa do Atelier. | -| `objectscript.ccs.requestTimeout` | `number` | `5000` | Tempo limite (ms) aplicado às chamadas HTTP do módulo. Valores menores ou inválidos são normalizados para zero. | +| `objectscript.ccs.requestTimeout` | `number` | `5000` | Tempo limite (ms) aplicado às chamadas HTTP rápidas do módulo (definição, documentação, gatilhos etc.). Valores negativos/inválidos são normalizados; `0` desativa o tempo limite. Não se aplica à conversão de item. | | `objectscript.ccs.debugLogging` | `boolean` | `false` | Quando verdadeiro, registra mensagens detalhadas no `ObjectScript` Output Channel. | | `objectscript.ccs.flags` | `Record` | `{}` | Feature flags opcionais que podem ser lidas pelas features do módulo. | | `consistem.converterItem.autoConvertOnSave` | `boolean` | `true` | Quando verdadeiro, executa a conversão simples ao salvar arquivos `.mac`. | | `consistem.converterItem.autoConvertExcludePackages` | `string[]` | `["cswutil70","cswutil80"]` | Lista de pacotes/pastas excluídos da conversão automática ao salvar. | +| `consistem.converterItem.timeout` | `number` | `180000` | Tempo limite (ms) exclusivo das chamadas de conversão de item (manual, customizada e automática ao salvar). Aumente em servidores/máquinas lentas; `0` desativa o tempo limite. | > Compatibilidade: as chaves antigas `objectscript.ccs.autoConvertOnSave` e > `objectscript.ccs.autoConvertExcludePackages` ainda são lidas como fallback. diff --git a/src/ccs/config/settings.ts b/src/ccs/config/settings.ts index 89656293..0772a164 100644 --- a/src/ccs/config/settings.ts +++ b/src/ccs/config/settings.ts @@ -3,6 +3,7 @@ import * as vscode from "vscode"; export interface CcsSettings { endpoint?: string; requestTimeout: number; + convertTimeout: number; debugLogging: boolean; flags: Record; autoConvertOnSave: boolean; @@ -12,15 +13,20 @@ export interface CcsSettings { const CCS_CONFIGURATION_SECTION = "objectscript.ccs"; const CONSISTEM_CONFIGURATION_SECTION = "consistem"; const DEFAULT_TIMEOUT = 5000; +const DEFAULT_CONVERT_TIMEOUT = 180000; const DEFAULT_AUTO_CONVERT_EXCLUDE_PACKAGES = ["cswutil70", "cswutil80"]; export function getCcsSettings(): CcsSettings { const configuration = vscode.workspace.getConfiguration(CCS_CONFIGURATION_SECTION); const endpoint = sanitizeEndpoint(configuration.get("endpoint")); - const requestTimeout = coerceTimeout(configuration.get("requestTimeout")); + const requestTimeout = coerceTimeout(configuration.get("requestTimeout"), DEFAULT_TIMEOUT); const debugLogging = Boolean(configuration.get("debugLogging")); const flags = configuration.get>("flags") ?? {}; const consistemConfiguration = vscode.workspace.getConfiguration(CONSISTEM_CONFIGURATION_SECTION); + const convertTimeout = coerceTimeout( + consistemConfiguration.get("converterItem.timeout"), + DEFAULT_CONVERT_TIMEOUT + ); const autoConvertOnSave = getAutoConvertOnSaveSetting(consistemConfiguration); const autoConvertExcludePackages = sanitizeExcludePackages( getAutoConvertExcludePackagesSetting(consistemConfiguration) @@ -29,6 +35,7 @@ export function getCcsSettings(): CcsSettings { return { endpoint, requestTimeout, + convertTimeout, debugLogging, flags, autoConvertOnSave, @@ -53,9 +60,9 @@ function sanitizeEndpoint(endpoint?: string): string | undefined { return trimmed.replace(/\/+$/, ""); } -function coerceTimeout(timeout: number | undefined): number { +function coerceTimeout(timeout: number | undefined, defaultTimeout: number): number { if (typeof timeout !== "number" || Number.isNaN(timeout)) { - return DEFAULT_TIMEOUT; + return defaultTimeout; } return Math.max(0, Math.floor(timeout)); diff --git a/src/ccs/sourcecontrol/clients/converterClient.ts b/src/ccs/sourcecontrol/clients/converterClient.ts index c139492f..62ad3996 100644 --- a/src/ccs/sourcecontrol/clients/converterClient.ts +++ b/src/ccs/sourcecontrol/clients/converterClient.ts @@ -95,12 +95,12 @@ export class ConverterClient { ? ROUTES.converterArquivoCustomizado(api.ns) : ROUTES.converterArquivo(api.ns); - const { requestTimeout } = getCcsSettings(); + const { convertTimeout } = getCcsSettings(); const { signal, dispose } = createAbortSignal(token); try { const response = await sourceControlApi.post(route, body, { - timeout: requestTimeout, + timeout: convertTimeout, signal, responseType: "text", transformResponse: (data) => data,