From 75ccd72c660c3b20cafa38da01d18a91ea24c7db Mon Sep 17 00:00:00 2001 From: A-N-uraag Date: Sat, 18 Nov 2023 22:34:28 +0530 Subject: [PATCH] fix: LSP server crashing in case of error in schema - Added try-catch block around handleWatchedFilesChangedNotification handler to prevent server crash on schema update. --- .changeset/lovely-steaks-knock.md | 5 ++ .../src/MessageProcessor.ts | 73 ++++++++++--------- 2 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 .changeset/lovely-steaks-knock.md diff --git a/.changeset/lovely-steaks-knock.md b/.changeset/lovely-steaks-knock.md new file mode 100644 index 00000000000..66301f88aa4 --- /dev/null +++ b/.changeset/lovely-steaks-knock.md @@ -0,0 +1,5 @@ +--- +'graphql-language-service-server': patch +--- + +Fixed crashing of LSP server on saving a schema with errors diff --git a/packages/graphql-language-service-server/src/MessageProcessor.ts b/packages/graphql-language-service-server/src/MessageProcessor.ts index 4772d8f1058..3d916c77954 100644 --- a/packages/graphql-language-service-server/src/MessageProcessor.ts +++ b/packages/graphql-language-service-server/src/MessageProcessor.ts @@ -664,42 +664,47 @@ export class MessageProcessor { await this._updateFragmentDefinition(uri, contents); await this._updateObjectTypeDefinition(uri, contents); - const project = this._graphQLCache.getProjectForFile(uri); - if (project) { - await this._updateSchemaIfChanged(project, uri); - } + try { + const project = this._graphQLCache.getProjectForFile(uri); + if (project) { + await this._updateSchemaIfChanged(project, uri); + } - let diagnostics: Diagnostic[] = []; - - if ( - project?.extensions?.languageService?.enableValidation !== false - ) { - diagnostics = ( - await Promise.all( - contents.map(async ({ query, range }) => { - const results = await this._languageService.getDiagnostics( - query, - uri, - this._isRelayCompatMode(query), - ); - if (results && results.length > 0) { - return processDiagnosticsMessage(results, query, range); - } - return []; - }), - ) - ).reduce((left, right) => left.concat(right), diagnostics); - } + let diagnostics: Diagnostic[] = []; + + if ( + project?.extensions?.languageService?.enableValidation !== false + ) { + diagnostics = ( + await Promise.all( + contents.map(async ({ query, range }) => { + const results = await this._languageService.getDiagnostics( + query, + uri, + this._isRelayCompatMode(query), + ); + if (results && results.length > 0) { + return processDiagnosticsMessage(results, query, range); + } + return []; + }), + ) + ).reduce((left, right) => left.concat(right), diagnostics); + } - this._logger.log( - JSON.stringify({ - type: 'usage', - messageType: 'workspace/didChangeWatchedFiles', - projectName: project?.name, - fileName: uri, - }), - ); - return { uri, diagnostics }; + this._logger.log( + JSON.stringify({ + type: 'usage', + messageType: 'workspace/didChangeWatchedFiles', + projectName: project?.name, + fileName: uri, + }), + ); + return { uri, diagnostics }; + } catch (err) { + this._handleConfigError({ err, uri }); + return { uri, diagnostics: [] }; + } } if (change.type === FileChangeTypeKind.Deleted) { await this._graphQLCache.updateFragmentDefinitionCache(