From cb8092da68d20f16dc812690811777c2ea2a424a Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Mon, 3 Feb 2025 14:01:06 +0100 Subject: [PATCH 1/9] refactor: wrap clients with sdk v2 runtime configurator --- .../src/client/sigv4/codewhisperer.ts | 12 ++++++++---- .../src/client/token/codewhisperer.ts | 14 +++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts b/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts index 095e3d23..bbb89e78 100644 --- a/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts +++ b/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts @@ -2,14 +2,18 @@ import { Service } from 'aws-sdk' import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' const apiConfig = require('./service.json') import CodeWhispererClient = require('./codewhisperersigv4client') +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' export type CodeWhispererSigv4ClientConfigurationOptions = ServiceConfigurationOptions -export function createCodeWhispererSigv4Client(options: ServiceConfigurationOptions): CodeWhispererClient { - return createService(options) as CodeWhispererClient +export function createCodeWhispererSigv4Client( + options: ServiceConfigurationOptions, + sdkRuntimeConfigurator: SDKRuntimeConfigurator +): CodeWhispererClient { + return createService(options, sdkRuntimeConfigurator) as CodeWhispererClient } -function createService(options: ServiceConfigurationOptions): Service { - const client = new Service({ apiConfig, ...options } as any) +function createService(options: ServiceConfigurationOptions, sdkRuntimeConfigurator: SDKRuntimeConfigurator): Service { + const client = sdkRuntimeConfigurator.v2(Service, { apiConfig, ...options } as any) return client } diff --git a/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts b/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts index 000df265..e41cf5c6 100644 --- a/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts +++ b/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts @@ -2,6 +2,7 @@ import { AWSError, Request, Service } from 'aws-sdk' import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' const apiConfig = require('./bearer-token-service.json') import CodeWhispererClient = require('./codewhispererbearertokenclient') +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' // PROOF OF CONCEPT // This client fiddling was copied from the AWS Toolkit for VS Code @@ -20,18 +21,21 @@ export interface CodeWhispererTokenClientConfigurationOptions extends ServiceCon } export function createCodeWhispererTokenClient( - options: CodeWhispererTokenClientConfigurationOptions + options: CodeWhispererTokenClientConfigurationOptions, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ): CodeWhispererClient { - return createService(options) as CodeWhispererClient + return createService(options, sdkRuntimeConfigurator) as CodeWhispererClient } -function createService(options: CodeWhispererTokenClientConfigurationOptions): Service { +function createService( + options: CodeWhispererTokenClientConfigurationOptions, + sdkRuntimeConfigurator: SDKRuntimeConfigurator +): Service { const onRequest = options?.onRequestSetup ?? [] const listeners = Array.isArray(onRequest) ? onRequest : [onRequest] const opt = { ...options } delete opt.onRequestSetup - - const client = new Service({ apiConfig, ...options } as any) + const client = sdkRuntimeConfigurator.v2(Service, { apiConfig, ...options } as any) const originalClient = client.setupRequestListeners.bind(client) client.setupRequestListeners = (request: Request) => { From 8cccbd4ae92d7787b1037c68c822fc857e6d7d67 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Mon, 3 Feb 2025 14:01:53 +0100 Subject: [PATCH 2/9] refactor: wrap clients with sdk v3 runtime configurator --- .../codewhispererStreamingClient.ts | 15 ++++++++++++--- .../language-server/chat/chatSessionService.ts | 8 ++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts index f65a860f..2df8d741 100644 --- a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts +++ b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts @@ -3,21 +3,30 @@ import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry' import { readFileSync } from 'fs' import { NodeHttpHandler } from '@smithy/node-http-handler' import { HttpsProxyAgent } from 'hpagent' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' export class StreamingClient { public async getStreamingClient( credentialsProvider: any, codeWhispererRegion: string, codeWhispererEndpoint: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator, config?: CodeWhispererStreamingClientConfig ) { - return await createStreamingClient(credentialsProvider, codeWhispererRegion, codeWhispererEndpoint, config) + return await createStreamingClient( + credentialsProvider, + codeWhispererRegion, + codeWhispererEndpoint, + sdkRuntimeConfigurator, + config + ) } } export async function createStreamingClient( credentialsProvider: any, codeWhispererRegion: string, codeWhispererEndpoint: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator, config?: CodeWhispererStreamingClientConfig ): Promise { const creds = credentialsProvider.getCredentials('bearer') @@ -46,13 +55,13 @@ export async function createStreamingClient( } } - const streamingClient = new CodeWhispererStreaming({ + const streamingClient = sdkRuntimeConfigurator.v3(CodeWhispererStreaming as any, { region: codeWhispererRegion, endpoint: codeWhispererEndpoint, token: { token: creds.token }, retryStrategy: new ConfiguredRetryStrategy(0, (attempt: number) => 500 + attempt ** 10), requestHandler: clientOptions?.requestHandler, ...config, - }) + }) as CodeWhispererStreaming return streamingClient } diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts index 093150be..9d4ebf8f 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts @@ -7,12 +7,14 @@ import { import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry' import { CredentialsProvider } from '@aws/language-server-runtimes/server-interface' import { getBearerTokenFromProvider } from '../utils' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' export type ChatSessionServiceConfig = CodeWhispererStreamingClientConfig export class ChatSessionService { public shareCodeWhispererContentWithAWS = false readonly #codeWhispererRegion: string readonly #codeWhispererEndpoint: string + #sdkRuntimeConfigurator: SDKRuntimeConfigurator #abortController?: AbortController #credentialsProvider: CredentialsProvider #config?: CodeWhispererStreamingClientConfig @@ -30,11 +32,13 @@ export class ChatSessionService { credentialsProvider: CredentialsProvider, codeWhispererRegion: string, codeWhispererEndpoint: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator, config?: CodeWhispererStreamingClientConfig ) { this.#credentialsProvider = credentialsProvider this.#codeWhispererRegion = codeWhispererRegion this.#codeWhispererEndpoint = codeWhispererEndpoint + this.#sdkRuntimeConfigurator = sdkRuntimeConfigurator this.#config = config } @@ -45,13 +49,13 @@ export class ChatSessionService { request.conversationState.conversationId = this.#conversationId } - const client = new CodeWhispererStreaming({ + const client = this.#sdkRuntimeConfigurator.v3(CodeWhispererStreaming as any, { region: this.#codeWhispererRegion, endpoint: this.#codeWhispererEndpoint, token: () => Promise.resolve({ token: getBearerTokenFromProvider(this.#credentialsProvider) }), retryStrategy: new ConfiguredRetryStrategy(0, (attempt: number) => 500 + attempt ** 10), ...this.#config, - }) + }) as CodeWhispererStreaming const response = await client.sendMessage(request, { abortSignal: this.#abortController?.signal, From 177a984272171f4d736f4e1ee64e215eb2db6499 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Mon, 3 Feb 2025 14:08:18 +0100 Subject: [PATCH 3/9] refactor: pass sdk runtime configurator down from server to services to sdk clients --- .../chat/chatSessionManagementService.ts | 15 ++- .../codeWhispererSecurityScanServer.ts | 9 +- .../language-server/codeWhispererServer.ts | 37 ++++-- .../language-server/codeWhispererService.ts | 12 +- .../configuration/qConfigurationServer.ts | 9 +- .../src/language-server/netTransformServer.ts | 10 +- .../src/language-server/proxy-server.ts | 109 ++++++++++++------ .../src/language-server/qChatServer.ts | 13 ++- .../src/language-server/telemetryService.ts | 6 +- 9 files changed, 150 insertions(+), 70 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts index 93f6d773..58c7a58f 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts @@ -1,4 +1,4 @@ -import { CredentialsProvider } from '@aws/language-server-runtimes/server-interface' +import { CredentialsProvider, SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' import { Result } from '../types' import { ChatSessionService, ChatSessionServiceConfig } from './chatSessionService' @@ -10,6 +10,7 @@ export class ChatSessionManagementService { #customUserAgent?: string = '%Amazon-Q-For-LanguageServers%' #codeWhispererRegion?: string #codeWhispererEndpoint?: string + #sdkRuntimeConfigurator?: SDKRuntimeConfigurator public static getInstance() { if (!ChatSessionManagementService.#instance) { @@ -49,6 +50,12 @@ export class ChatSessionManagementService { return this } + public withSdkRuntimeConfigurator(sdkRuntimeConfigurator: SDKRuntimeConfigurator) { + this.#sdkRuntimeConfigurator = sdkRuntimeConfigurator + + return this + } + public setCustomUserAgent(customUserAgent: string) { this.#customUserAgent = customUserAgent } @@ -73,6 +80,11 @@ export class ChatSessionManagementService { success: false, error: 'CodeWhispererEndpoint is not set', } + } else if (!this.#sdkRuntimeConfigurator) { + return { + success: false, + error: 'SdkRuntimeConfigurator is not set', + } } else if (this.#sessionByTab.has(tabId)) { return { success: true, @@ -85,6 +97,7 @@ export class ChatSessionManagementService { this.#credentialsProvider, this.#codeWhispererRegion, this.#codeWhispererEndpoint, + this.#sdkRuntimeConfigurator, { ...clientConfig, customUserAgent: this.#customUserAgent, diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts index 64ed0b11..53b28137 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts @@ -19,6 +19,7 @@ import { SecurityScanEvent } from './telemetry/types' import { getErrorMessage, parseJson } from './utils' import { getUserAgent } from './utilities/telemetryUtils' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../constants' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' const RunSecurityScanCommand = 'aws/codewhisperer/runSecurityScan' const CancelSecurityScanCommand = 'aws/codewhisperer/cancelSecurityScan' @@ -29,15 +30,17 @@ export const SecurityScanServerToken = credentialsProvider: CredentialsProvider, workspace: Workspace, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime }) => { + ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkRuntimeConfigurator }) => { const codewhispererclient = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, - runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL + runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, + sdkRuntimeConfigurator ) const diagnosticsProvider = new SecurityScanDiagnosticsProvider(lsp, logging) const scanHandler = new SecurityScanHandler(codewhispererclient, workspace, logging) diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts index 26a8d2a4..579fcbb2 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts @@ -13,6 +13,7 @@ import { Telemetry, TextDocument, Workspace, + SDKRuntimeConfigurator, } from '@aws/language-server-runtimes/server-interface' import { AWSError } from 'aws-sdk' import { autoTrigger, triggerType } from './auto-trigger/autoTrigger' @@ -264,10 +265,11 @@ export const CodewhispererServerFactory = credentials: CredentialsProvider, workspace: Workspace, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) => CodeWhispererServiceBase ): Server => - ({ credentialsProvider, lsp, workspace, telemetry, logging, runtime }) => { + ({ credentialsProvider, lsp, workspace, telemetry, logging, runtime, sdkRuntimeConfigurator }) => { let lastUserModificationTime: number let timeSinceLastUserModification: number = 0 @@ -275,7 +277,13 @@ export const CodewhispererServerFactory = const awsQRegion = runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION const awsQEndpointUrl = runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL - const codeWhispererService = service(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + const codeWhispererService = service( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) const telemetryService = new TelemetryService( credentialsProvider, codeWhispererService.getCredentialsType(), @@ -283,7 +291,8 @@ export const CodewhispererServerFactory = logging, workspace, awsQRegion, - awsQEndpointUrl + awsQEndpointUrl, + sdkRuntimeConfigurator ) lsp.addInitializer((params: InitializeParams) => { @@ -619,9 +628,9 @@ export const CodewhispererServerFactory = `Inline completion configuration updated to use ${codeWhispererService.customizationArn}` ) /* - The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination - configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true - */ + The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination + configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true + */ // const enableTelemetryEventsToDestination = true // telemetryService.updateEnableTelemetryEventsToDestination(enableTelemetryEventsToDestination) const optOutTelemetryPreference = qConfig['optOutTelemetry'] === true ? 'OPTOUT' : 'OPTIN' @@ -679,10 +688,16 @@ export const CodewhispererServerFactory = } export const CodeWhispererServerIAM = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => - new CodeWhispererServiceIAM(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => + new CodeWhispererServiceIAM(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) ) export const CodeWhispererServerToken = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => - new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => + new CodeWhispererServiceToken( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts index 25f24151..114bac9b 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts @@ -3,6 +3,7 @@ import { CredentialsProvider, CredentialsType, Workspace, + SDKRuntimeConfigurator, } from '@aws/language-server-runtimes/server-interface' import { AWSError, ConfigurationOptions, CredentialProviderChain, Credentials } from 'aws-sdk' import { PromiseResult } from 'aws-sdk/lib/request' @@ -76,12 +77,12 @@ export abstract class CodeWhispererServiceBase { export class CodeWhispererServiceIAM extends CodeWhispererServiceBase { client: CodeWhispererSigv4Client - constructor( credentialsProvider: CredentialsProvider, workspace: Workspace, codeWhispererRegion: string, - codeWhispererEndpoint: string + codeWhispererEndpoint: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) { super(workspace, codeWhispererRegion, codeWhispererEndpoint) const options: CodeWhispererSigv4ClientConfigurationOptions = { @@ -91,7 +92,7 @@ export class CodeWhispererServiceIAM extends CodeWhispererServiceBase { () => credentialsProvider.getCredentials('iam') as Credentials, ]), } - this.client = createCodeWhispererSigv4Client(options) + this.client = createCodeWhispererSigv4Client(options, sdkRuntimeConfigurator) this.updateClientConfig(this.proxyConfig) this.client.setupRequestListeners = ({ httpRequest }) => { httpRequest.headers['x-amzn-codewhisperer-optout'] = `${!this.shareCodeWhispererContentWithAWS}` @@ -132,7 +133,8 @@ export class CodeWhispererServiceToken extends CodeWhispererServiceBase { credentialsProvider: CredentialsProvider, workspace: Workspace, codeWhispererRegion: string, - codeWhispererEndpoint: string + codeWhispererEndpoint: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) { super(workspace, codeWhispererRegion, codeWhispererEndpoint) const options: CodeWhispererTokenClientConfigurationOptions = { @@ -151,7 +153,7 @@ export class CodeWhispererServiceToken extends CodeWhispererServiceBase { }, ], } - this.client = createCodeWhispererTokenClient(options) + this.client = createCodeWhispererTokenClient(options, sdkRuntimeConfigurator) this.updateClientConfig(this.proxyConfig) } diff --git a/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts b/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts index ecb0bf0d..6cdbf7a2 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts @@ -9,6 +9,7 @@ import { import { CodeWhispererServiceToken } from '../codeWhispererService' import { getUserAgent } from '../utilities/telemetryUtils' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../../constants' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' // The configuration section that the server will register and listen to export const Q_CONFIGURATION_SECTION = 'aws.q' @@ -18,15 +19,17 @@ export const QConfigurationServerToken = credentials: CredentialsProvider, workspace: Workspace, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, lsp, logging, runtime, workspace }) => { + ({ credentialsProvider, lsp, logging, runtime, workspace, sdkRuntimeConfigurator }) => { const codeWhispererService = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, - runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL + runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, + sdkRuntimeConfigurator ) lsp.addInitializer((params: InitializeParams) => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts index 5cdf242e..d847d7f5 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts @@ -46,6 +46,7 @@ const GetTransformPlanCommand = 'aws/qNetTransform/getTransformPlan' const CancelTransformCommand = 'aws/qNetTransform/cancelTransform' const DownloadArtifactsCommand = 'aws/qNetTransform/downloadArtifacts' import { DEFAULT_AWS_Q_REGION, DEFAULT_AWS_Q_ENDPOINT_URL } from '../constants' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' /** * @@ -58,15 +59,17 @@ export const QNetTransformServerToken = credentialsProvider: CredentialsProvider, workspace: Workspace, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime }) => { + ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkRuntimeConfigurator }) => { const codewhispererclient = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, - runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL + runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, + sdkRuntimeConfigurator ) const transformHandler = new TransformHandler(codewhispererclient, workspace, logging) const runTransformCommand = async (params: ExecuteCommandParams, _token: CancellationToken) => { @@ -125,6 +128,7 @@ export const QNetTransformServerToken = credentialsProvider, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, + sdkRuntimeConfigurator, customCWClientConfig ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts index 1c9c6343..a63a95bf 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts @@ -11,66 +11,99 @@ import { HttpsProxyAgent } from 'hpagent' import { NodeHttpHandler } from '@smithy/node-http-handler' export const CodeWhispererServerTokenProxy = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => { - return new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + return new CodeWhispererServiceToken( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) } ) export const CodeWhispererServerIAMProxy = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => { - return new CodeWhispererServiceIAM(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + return new CodeWhispererServiceIAM( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) } ) export const CodeWhispererSecurityScanServerTokenProxy = SecurityScanServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => { - return new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + return new CodeWhispererServiceToken( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) } ) export const QNetTransformServerTokenProxy = QNetTransformServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => { - return new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + return new CodeWhispererServiceToken( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) } ) -export const QChatServerProxy = QChatServer((credentialsProvider, awsQRegion, awsQEndpointUrl) => { - let clientOptions: ChatSessionServiceConfig | undefined - // short term solution to fix webworker bundling, broken due to this node.js specific logic in here - const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' - const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined - const certs = isNodeJS - ? process.env.AWS_CA_BUNDLE - ? [readFileSync(process.env.AWS_CA_BUNDLE)] +export const QChatServerProxy = QChatServer( + (credentialsProvider, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + let clientOptions: ChatSessionServiceConfig | undefined + // short term solution to fix webworker bundling, broken due to this node.js specific logic in here + const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' + const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined + const certs = isNodeJS + ? process.env.AWS_CA_BUNDLE + ? [readFileSync(process.env.AWS_CA_BUNDLE)] + : undefined : undefined - : undefined - if (proxyUrl) { - clientOptions = () => { - // this mimics aws-sdk-v3-js-proxy - const agent = new HttpsProxyAgent({ - proxy: proxyUrl, - ca: certs, - }) + if (proxyUrl) { + clientOptions = () => { + // this mimics aws-sdk-v3-js-proxy + const agent = new HttpsProxyAgent({ + proxy: proxyUrl, + ca: certs, + }) - return { - requestHandler: new NodeHttpHandler({ - httpAgent: agent, - httpsAgent: agent, - }), + return { + requestHandler: new NodeHttpHandler({ + httpAgent: agent, + httpsAgent: agent, + }), + } } } - } - return ChatSessionManagementService.getInstance() - .withCredentialsProvider(credentialsProvider) - .withCodeWhispererEndpoint(awsQEndpointUrl) - .withCodeWhispererRegion(awsQRegion) - .withConfig(clientOptions) -}) + return ChatSessionManagementService.getInstance() + .withCredentialsProvider(credentialsProvider) + .withCodeWhispererEndpoint(awsQEndpointUrl) + .withCodeWhispererRegion(awsQRegion) + .withSdkRuntimeConfigurator(sdkRuntimeConfigurator) + .withConfig(clientOptions) + } +) export const QConfigurationServerTokenProxy = QConfigurationServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) => { - return new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + return new CodeWhispererServiceToken( + credentialsProvider, + workspace, + awsQRegion, + awsQEndpointUrl, + sdkRuntimeConfigurator + ) } ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts b/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts index fc6e6215..6f9f35d4 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts @@ -5,24 +5,28 @@ import { CLEAR_QUICK_ACTION, HELP_QUICK_ACTION } from './chat/quickActions' import { TelemetryService } from './telemetryService' import { getUserAgent, makeUserContextObject } from './utilities/telemetryUtils' import { DEFAULT_AWS_Q_REGION, DEFAULT_AWS_Q_ENDPOINT_URL } from '../constants' +import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' export const QChatServer = ( service: ( credentialsProvider: CredentialsProvider, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) => ChatSessionManagementService ): Server => features => { - const { chat, credentialsProvider, telemetry, logging, lsp, runtime, workspace } = features + const { chat, credentialsProvider, telemetry, logging, lsp, runtime, workspace, sdkRuntimeConfigurator } = + features const awsQRegion = runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION const awsQEndpointUrl = runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL const chatSessionManagementService: ChatSessionManagementService = service( credentialsProvider, awsQRegion, - awsQEndpointUrl + awsQEndpointUrl, + sdkRuntimeConfigurator ) const telemetryService = new TelemetryService( credentialsProvider, @@ -31,7 +35,8 @@ export const QChatServer = logging, workspace, awsQRegion, - awsQEndpointUrl + awsQEndpointUrl, + sdkRuntimeConfigurator ) const chatController = new ChatController(chatSessionManagementService, features, telemetryService) diff --git a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts index 1c35bd76..70f70026 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts @@ -5,6 +5,7 @@ import { Logging, Telemetry, Workspace, + SDKRuntimeConfigurator, } from '@aws/language-server-runtimes/server-interface' import { CodeWhispererSession } from './session/sessionManager' import { @@ -60,9 +61,10 @@ export class TelemetryService extends CodeWhispererServiceToken { logging: Logging, workspace: Workspace, awsQRegion: string, - awsQEndpointUrl: string + awsQEndpointUrl: string, + sdkRuntimeConfigurator: SDKRuntimeConfigurator ) { - super(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl) + super(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) this.credentialsProvider = credentialsProvider this.credentialsType = credentialsType this.telemetry = telemetry From c5ea261850608c035da4e7d550657fe0f8c43942 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Mon, 3 Feb 2025 14:10:42 +0100 Subject: [PATCH 4/9] test: adapt tests to new changes --- .../chat/chatController.test.ts | 23 ++++- .../chat/chatSessionManagementService.test.ts | 23 ++++- .../chat/chatSessionService.test.ts | 29 ++++++- .../tests/transformHandler.test.ts | 33 +++++++- .../language-server/telemetryService.test.ts | 84 ++++++++++++++----- 5 files changed, 163 insertions(+), 29 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts index 3ee9fb9e..53eb9fb2 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts @@ -11,6 +11,10 @@ import { Position, InsertToCursorPositionParams, TextDocumentEdit, + SDKRuntimeConfigurator, + ConstructorV2, + ConstructorV3, + SDKv3Client, } from '@aws/language-server-runtimes/server-interface' import { TestFeatures } from '@aws/language-server-runtimes/testing' import * as assert from 'assert' @@ -26,6 +30,8 @@ import { DEFAULT_HELP_FOLLOW_UP_PROMPT, HELP_MESSAGE } from './constants' import { TelemetryService } from '../telemetryService' import { TextEdit } from 'vscode-languageserver-textdocument' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../../constants' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' describe('ChatController', () => { const mockTabId = 'tab-1' @@ -116,10 +122,23 @@ describe('ChatController', () => { disposeStub = sinon.stub(ChatSessionService.prototype, 'dispose') + const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { + v2: ( + Ctor: ConstructorV2, + current_config: P + ): T => { + return new Ctor({ ...current_config }) + }, + v3: (Ctor: ConstructorV3, current_config: P): T => { + return new Ctor({ ...current_config }) + }, + } + chatSessionManagementService = ChatSessionManagementService.getInstance() .withCredentialsProvider(testFeatures.credentialsProvider) .withCodeWhispererRegion(awsQRegion) .withCodeWhispererEndpoint(awsQEndpointUrl) + .withSdkRuntimeConfigurator(mockSdkRuntimeConfigurator) const mockCredentialsProvider: CredentialsProvider = { hasCredentials: sinon.stub().returns(true), @@ -137,6 +156,7 @@ describe('ChatController', () => { emitMetric: sinon.stub(), onClientTelemetry: sinon.stub(), } + telemetryService = new TelemetryService( mockCredentialsProvider, 'bearer', @@ -144,7 +164,8 @@ describe('ChatController', () => { logging, mockWorkspace, awsQRegion, - awsQEndpointUrl + awsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) chatController = new ChatController(chatSessionManagementService, testFeatures, telemetryService) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts index 762efb75..73f6e5c8 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts @@ -1,8 +1,16 @@ -import { CredentialsProvider } from '@aws/language-server-runtimes/server-interface' +import { + CredentialsProvider, + SDKRuntimeConfigurator, + ConstructorV2, + ConstructorV3, + SDKv3Client, +} from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import sinon from 'ts-sinon' import { ChatSessionManagementService } from './chatSessionManagementService' import { ChatSessionService } from './chatSessionService' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' describe('ChatSessionManagementService', () => { const mockSessionId = 'mockSessionId' @@ -33,12 +41,25 @@ describe('ChatSessionManagementService', () => { let disposeStub: sinon.SinonStub let chatSessionManagementService: ChatSessionManagementService + const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { + v2: ( + Ctor: ConstructorV2, + current_config: P + ): T => { + return new Ctor({ ...current_config }) + }, + v3: (Ctor: ConstructorV3, current_config: P): T => { + return new Ctor({ ...current_config }) + }, + } + beforeEach(() => { disposeStub = sinon.stub(ChatSessionService.prototype, 'dispose') chatSessionManagementService = ChatSessionManagementService.getInstance() .withCredentialsProvider(mockCredentialsProvider) .withCodeWhispererRegion(mockAwsQRegion) .withCodeWhispererEndpoint(mockAwsQEndpointUrl) + .withSdkRuntimeConfigurator(mockSdkRuntimeConfigurator) }) afterEach(() => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts index 3d2396be..6f9a3f0e 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts @@ -3,11 +3,19 @@ import { SendMessageCommandInput, SendMessageCommandOutput, } from '@amzn/codewhisperer-streaming' -import { CredentialsProvider } from '@aws/language-server-runtimes/server-interface' +import { + CredentialsProvider, + SDKRuntimeConfigurator, + ConstructorV2, + ConstructorV3, + SDKv3Client, +} from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import sinon from 'ts-sinon' import { ChatSessionService } from './chatSessionService' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../../constants' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' describe('Chat Session Service', () => { let sendMessageStub: sinon.SinonStub @@ -22,6 +30,18 @@ describe('Chat Session Service', () => { const awsQEndpointUrl: string = DEFAULT_AWS_Q_ENDPOINT_URL const mockConversationId = 'mockConversationId' + const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { + v2: ( + Ctor: ConstructorV2, + current_config: P + ): T => { + return new Ctor({ ...current_config }) + }, + v3: (Ctor: ConstructorV3, current_config: P): T => { + return new Ctor({ ...current_config }) + }, + } + const mockRequestParams: SendMessageCommandInput = { conversationState: { chatTriggerType: 'MANUAL', @@ -45,7 +65,12 @@ describe('Chat Session Service', () => { .stub(CodeWhispererStreaming.prototype, 'sendMessage') .callsFake(() => Promise.resolve(mockRequestResponse)) - chatSessionService = new ChatSessionService(mockCredentialsProvider, awsQRegion, awsQEndpointUrl) + chatSessionService = new ChatSessionService( + mockCredentialsProvider, + awsQRegion, + awsQEndpointUrl, + mockSdkRuntimeConfigurator + ) }) afterEach(() => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts index eb26ac72..fbb90b17 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts @@ -1,5 +1,12 @@ import { CodeWhispererStreaming } from '@amzn/codewhisperer-streaming' -import { Logging, Workspace } from '@aws/language-server-runtimes/server-interface' +import { + Logging, + Workspace, + SDKRuntimeConfigurator, + ConstructorV2, + ConstructorV3, + SDKv3Client, +} from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import { HttpResponse } from 'aws-sdk' import { expect } from 'chai' @@ -20,6 +27,8 @@ import { EXAMPLE_REQUEST } from './mockData' import sinon = require('sinon') import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../../../constants' import { Readable } from 'stream' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' const mocked$Response = { $response: { @@ -202,13 +211,26 @@ describe('Test Transform handler ', () => { getCredentials: sinon.stub().returns({ token: 'mockedToken' }), } + const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { + v2: ( + Ctor: ConstructorV2, + current_config: P + ): T => { + return new Ctor({ ...current_config }) + }, + v3: (Ctor: ConstructorV3, current_config: P): T => { + return new Ctor({ ...current_config }) + }, + } + describe('StreamingClient', () => { it('should create a new streaming client', async () => { const streamingClient = new StreamingClient() const client = await streamingClient.getStreamingClient( mockedCredentialsProvider, awsQRegion, - awsQEndpointUrl + awsQEndpointUrl, + mockSdkRuntimeConfigurator ) expect(client).to.be.instanceOf(CodeWhispererStreaming) }) @@ -216,7 +238,12 @@ describe('Test Transform handler ', () => { describe('createStreamingClient', () => { it('should create a new streaming client with correct configurations', async () => { - const client = await createStreamingClient(mockedCredentialsProvider, awsQRegion, awsQEndpointUrl) + const client = await createStreamingClient( + mockedCredentialsProvider, + awsQRegion, + awsQEndpointUrl, + mockSdkRuntimeConfigurator + ) expect(client).to.be.instanceOf(CodeWhispererStreaming) }) }) diff --git a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts index e64d6ae2..2f0dd495 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts @@ -8,12 +8,18 @@ import { Logging, Telemetry, Workspace, + SDKRuntimeConfigurator, + ConstructorV2, + ConstructorV3, + SDKv3Client, } from '@aws/language-server-runtimes/server-interface' import { UserContext, OptOutPreference } from '../client/token/codewhispererbearertokenclient' import { CodeWhispererSession } from './session/sessionManager' import sinon from 'ts-sinon' import { BUILDER_ID_START_URL } from './constants' import { ChatInteractionType } from './telemetry/types' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' class MockCredentialsProvider implements CredentialsProvider { private mockIamCredentials: IamCredentials | undefined @@ -93,6 +99,18 @@ describe('TelemetryService', () => { }, } + const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { + v2: ( + Ctor: ConstructorV2, + current_config: P + ): T => { + return new Ctor({ ...current_config }) + }, + v3: (Ctor: ConstructorV3, current_config: P): T => { + return new Ctor({ ...current_config }) + }, + } + beforeEach(() => { clock = sinon.useFakeTimers({ now: 1483228800000, @@ -117,7 +135,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const mockUserContext: UserContext = { clientId: 'aaaabbbbccccdddd', @@ -139,7 +158,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const mockOptOutPreference: OptOutPreference = 'OPTIN' telemetryService.updateOptOutPreference(mockOptOutPreference) @@ -155,7 +175,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(true) @@ -170,7 +191,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const getSuggestionState = (telemetryService as any).getSuggestionState.bind(telemetryService) let session = { @@ -219,7 +241,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) @@ -241,7 +264,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) telemetryService.updateOptOutPreference('OPTOUT') @@ -259,7 +283,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const sendTelemetryEventStub: sinon.SinonStub = sinon .stub(telemetryService, 'sendTelemetryEvent' as any) @@ -323,7 +348,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(true) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon @@ -378,7 +404,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(false) telemetryService.updateOptOutPreference('OPTOUT') @@ -407,7 +434,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon .stub(telemetryService, 'sendTelemetryEvent' as any) @@ -487,7 +515,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(false) telemetryService.updateOptOutPreference('OPTOUT') @@ -523,7 +552,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) const metric = { @@ -554,7 +584,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) telemetryService.updateOptOutPreference('OPTOUT') @@ -630,7 +661,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon .stub(telemetryService, 'sendTelemetryEvent' as any) @@ -677,7 +709,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateOptOutPreference('OPTOUT') telemetryService.updateEnableTelemetryEventsToDestination(false) @@ -712,7 +745,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon .stub(telemetryService, 'sendTelemetryEvent' as any) @@ -763,7 +797,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(true) const invokeSendTelemetryEventStub: sinon.SinonStub = sinon @@ -815,7 +850,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateEnableTelemetryEventsToDestination(false) telemetryService.updateOptOutPreference('OPTOUT') @@ -849,7 +885,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon .stub(telemetryService, 'sendTelemetryEvent' as any) @@ -945,7 +982,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) telemetryService.updateOptOutPreference('OPTOUT') telemetryService.updateEnableTelemetryEventsToDestination(false) @@ -1001,7 +1039,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) telemetryService.emitChatAddMessage( @@ -1028,7 +1067,8 @@ describe('TelemetryService', () => { logging, mockWorkspace, mockAwsQRegion, - mockAwsQEndpointUrl + mockAwsQEndpointUrl, + mockSdkRuntimeConfigurator ) invokeSendTelemetryEventStub = sinon.stub(telemetryService, 'sendTelemetryEvent' as any) telemetryService.updateOptOutPreference('OPTOUT') From b7afd91ac6ed861649a7f883ab2245fdef4183e8 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Tue, 4 Feb 2025 15:02:03 +0100 Subject: [PATCH 5/9] refactor: rename to SDKInitializator, make v3 default, avoid type casting --- .../src/client/sigv4/codewhisperer.ts | 10 +++---- .../codewhispererStreamingClient.ts | 12 ++++---- .../src/client/token/codewhisperer.ts | 10 +++---- .../chat/chatSessionManagementService.ts | 14 ++++----- .../chat/chatSessionService.ts | 12 ++++---- .../codeWhispererSecurityScanServer.ts | 8 ++--- .../language-server/codeWhispererServer.ts | 30 ++++++++----------- .../language-server/codeWhispererService.ts | 10 +++---- .../configuration/qConfigurationServer.ts | 8 ++--- .../src/language-server/netTransformServer.ts | 10 +++---- .../src/language-server/proxy-server.ts | 24 +++++++-------- .../src/language-server/qChatServer.ts | 11 ++++--- .../src/language-server/telemetryService.ts | 6 ++-- 13 files changed, 79 insertions(+), 86 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts b/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts index bbb89e78..d588e1cb 100644 --- a/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts +++ b/server/aws-lsp-codewhisperer/src/client/sigv4/codewhisperer.ts @@ -2,18 +2,18 @@ import { Service } from 'aws-sdk' import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' const apiConfig = require('./service.json') import CodeWhispererClient = require('./codewhisperersigv4client') -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' export type CodeWhispererSigv4ClientConfigurationOptions = ServiceConfigurationOptions export function createCodeWhispererSigv4Client( options: ServiceConfigurationOptions, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ): CodeWhispererClient { - return createService(options, sdkRuntimeConfigurator) as CodeWhispererClient + return createService(options, sdkInitializator) as CodeWhispererClient } -function createService(options: ServiceConfigurationOptions, sdkRuntimeConfigurator: SDKRuntimeConfigurator): Service { - const client = sdkRuntimeConfigurator.v2(Service, { apiConfig, ...options } as any) +function createService(options: ServiceConfigurationOptions, sdkInitializator: SDKInitializator): Service { + const client = sdkInitializator.v2(Service, { apiConfig, ...options } as any) return client } diff --git a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts index 2df8d741..ff8ba71c 100644 --- a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts +++ b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts @@ -3,21 +3,21 @@ import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry' import { readFileSync } from 'fs' import { NodeHttpHandler } from '@smithy/node-http-handler' import { HttpsProxyAgent } from 'hpagent' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' export class StreamingClient { public async getStreamingClient( credentialsProvider: any, codeWhispererRegion: string, codeWhispererEndpoint: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator, + sdkInitializator: SDKInitializator, config?: CodeWhispererStreamingClientConfig ) { return await createStreamingClient( credentialsProvider, codeWhispererRegion, codeWhispererEndpoint, - sdkRuntimeConfigurator, + sdkInitializator, config ) } @@ -26,7 +26,7 @@ export async function createStreamingClient( credentialsProvider: any, codeWhispererRegion: string, codeWhispererEndpoint: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator, + sdkInitializator: SDKInitializator, config?: CodeWhispererStreamingClientConfig ): Promise { const creds = credentialsProvider.getCredentials('bearer') @@ -55,13 +55,13 @@ export async function createStreamingClient( } } - const streamingClient = sdkRuntimeConfigurator.v3(CodeWhispererStreaming as any, { + const streamingClient = sdkInitializator(CodeWhispererStreaming, { region: codeWhispererRegion, endpoint: codeWhispererEndpoint, token: { token: creds.token }, retryStrategy: new ConfiguredRetryStrategy(0, (attempt: number) => 500 + attempt ** 10), requestHandler: clientOptions?.requestHandler, ...config, - }) as CodeWhispererStreaming + }) return streamingClient } diff --git a/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts b/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts index e41cf5c6..d68251f6 100644 --- a/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts +++ b/server/aws-lsp-codewhisperer/src/client/token/codewhisperer.ts @@ -2,7 +2,7 @@ import { AWSError, Request, Service } from 'aws-sdk' import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' const apiConfig = require('./bearer-token-service.json') import CodeWhispererClient = require('./codewhispererbearertokenclient') -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' // PROOF OF CONCEPT // This client fiddling was copied from the AWS Toolkit for VS Code @@ -22,20 +22,20 @@ export interface CodeWhispererTokenClientConfigurationOptions extends ServiceCon export function createCodeWhispererTokenClient( options: CodeWhispererTokenClientConfigurationOptions, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ): CodeWhispererClient { - return createService(options, sdkRuntimeConfigurator) as CodeWhispererClient + return createService(options, sdkInitializator) as CodeWhispererClient } function createService( options: CodeWhispererTokenClientConfigurationOptions, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ): Service { const onRequest = options?.onRequestSetup ?? [] const listeners = Array.isArray(onRequest) ? onRequest : [onRequest] const opt = { ...options } delete opt.onRequestSetup - const client = sdkRuntimeConfigurator.v2(Service, { apiConfig, ...options } as any) + const client = sdkInitializator.v2(Service, { apiConfig, ...options } as any) const originalClient = client.setupRequestListeners.bind(client) client.setupRequestListeners = (request: Request) => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts index 58c7a58f..391110aa 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.ts @@ -1,4 +1,4 @@ -import { CredentialsProvider, SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { CredentialsProvider, SDKInitializator } from '@aws/language-server-runtimes/server-interface' import { Result } from '../types' import { ChatSessionService, ChatSessionServiceConfig } from './chatSessionService' @@ -10,7 +10,7 @@ export class ChatSessionManagementService { #customUserAgent?: string = '%Amazon-Q-For-LanguageServers%' #codeWhispererRegion?: string #codeWhispererEndpoint?: string - #sdkRuntimeConfigurator?: SDKRuntimeConfigurator + #sdkInitializator?: SDKInitializator public static getInstance() { if (!ChatSessionManagementService.#instance) { @@ -50,8 +50,8 @@ export class ChatSessionManagementService { return this } - public withSdkRuntimeConfigurator(sdkRuntimeConfigurator: SDKRuntimeConfigurator) { - this.#sdkRuntimeConfigurator = sdkRuntimeConfigurator + public withSdkRuntimeConfigurator(sdkInitializator: SDKInitializator) { + this.#sdkInitializator = sdkInitializator return this } @@ -80,10 +80,10 @@ export class ChatSessionManagementService { success: false, error: 'CodeWhispererEndpoint is not set', } - } else if (!this.#sdkRuntimeConfigurator) { + } else if (!this.#sdkInitializator) { return { success: false, - error: 'SdkRuntimeConfigurator is not set', + error: 'SdkInitializator is not set', } } else if (this.#sessionByTab.has(tabId)) { return { @@ -97,7 +97,7 @@ export class ChatSessionManagementService { this.#credentialsProvider, this.#codeWhispererRegion, this.#codeWhispererEndpoint, - this.#sdkRuntimeConfigurator, + this.#sdkInitializator, { ...clientConfig, customUserAgent: this.#customUserAgent, diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts index 9d4ebf8f..b9ef8deb 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.ts @@ -7,14 +7,14 @@ import { import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry' import { CredentialsProvider } from '@aws/language-server-runtimes/server-interface' import { getBearerTokenFromProvider } from '../utils' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' export type ChatSessionServiceConfig = CodeWhispererStreamingClientConfig export class ChatSessionService { public shareCodeWhispererContentWithAWS = false readonly #codeWhispererRegion: string readonly #codeWhispererEndpoint: string - #sdkRuntimeConfigurator: SDKRuntimeConfigurator + #sdkInitializator: SDKInitializator #abortController?: AbortController #credentialsProvider: CredentialsProvider #config?: CodeWhispererStreamingClientConfig @@ -32,13 +32,13 @@ export class ChatSessionService { credentialsProvider: CredentialsProvider, codeWhispererRegion: string, codeWhispererEndpoint: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator, + sdkInitializator: SDKInitializator, config?: CodeWhispererStreamingClientConfig ) { this.#credentialsProvider = credentialsProvider this.#codeWhispererRegion = codeWhispererRegion this.#codeWhispererEndpoint = codeWhispererEndpoint - this.#sdkRuntimeConfigurator = sdkRuntimeConfigurator + this.#sdkInitializator = sdkInitializator this.#config = config } @@ -49,13 +49,13 @@ export class ChatSessionService { request.conversationState.conversationId = this.#conversationId } - const client = this.#sdkRuntimeConfigurator.v3(CodeWhispererStreaming as any, { + const client = this.#sdkInitializator(CodeWhispererStreaming, { region: this.#codeWhispererRegion, endpoint: this.#codeWhispererEndpoint, token: () => Promise.resolve({ token: getBearerTokenFromProvider(this.#credentialsProvider) }), retryStrategy: new ConfiguredRetryStrategy(0, (attempt: number) => 500 + attempt ** 10), ...this.#config, - }) as CodeWhispererStreaming + }) const response = await client.sendMessage(request, { abortSignal: this.#abortController?.signal, diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts index 53b28137..6ad88733 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererSecurityScanServer.ts @@ -19,7 +19,7 @@ import { SecurityScanEvent } from './telemetry/types' import { getErrorMessage, parseJson } from './utils' import { getUserAgent } from './utilities/telemetryUtils' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../constants' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' const RunSecurityScanCommand = 'aws/codewhisperer/runSecurityScan' const CancelSecurityScanCommand = 'aws/codewhisperer/cancelSecurityScan' @@ -31,16 +31,16 @@ export const SecurityScanServerToken = workspace: Workspace, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkRuntimeConfigurator }) => { + ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkInitializator }) => { const codewhispererclient = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, - sdkRuntimeConfigurator + sdkInitializator ) const diagnosticsProvider = new SecurityScanDiagnosticsProvider(lsp, logging) const scanHandler = new SecurityScanHandler(codewhispererclient, workspace, logging) diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts index 579fcbb2..46b43495 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererServer.ts @@ -13,7 +13,7 @@ import { Telemetry, TextDocument, Workspace, - SDKRuntimeConfigurator, + SDKInitializator, } from '@aws/language-server-runtimes/server-interface' import { AWSError } from 'aws-sdk' import { autoTrigger, triggerType } from './auto-trigger/autoTrigger' @@ -266,10 +266,10 @@ export const CodewhispererServerFactory = workspace: Workspace, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) => CodeWhispererServiceBase ): Server => - ({ credentialsProvider, lsp, workspace, telemetry, logging, runtime, sdkRuntimeConfigurator }) => { + ({ credentialsProvider, lsp, workspace, telemetry, logging, runtime, sdkInitializator }) => { let lastUserModificationTime: number let timeSinceLastUserModification: number = 0 @@ -282,7 +282,7 @@ export const CodewhispererServerFactory = workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) const telemetryService = new TelemetryService( credentialsProvider, @@ -292,7 +292,7 @@ export const CodewhispererServerFactory = workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) lsp.addInitializer((params: InitializeParams) => { @@ -628,9 +628,9 @@ export const CodewhispererServerFactory = `Inline completion configuration updated to use ${codeWhispererService.customizationArn}` ) /* - The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination - configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true - */ + The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination + configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true + */ // const enableTelemetryEventsToDestination = true // telemetryService.updateEnableTelemetryEventsToDestination(enableTelemetryEventsToDestination) const optOutTelemetryPreference = qConfig['optOutTelemetry'] === true ? 'OPTOUT' : 'OPTIN' @@ -688,16 +688,10 @@ export const CodewhispererServerFactory = } export const CodeWhispererServerIAM = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => - new CodeWhispererServiceIAM(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => + new CodeWhispererServiceIAM(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) ) export const CodeWhispererServerToken = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => - new CodeWhispererServiceToken( - credentialsProvider, - workspace, - awsQRegion, - awsQEndpointUrl, - sdkRuntimeConfigurator - ) + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => + new CodeWhispererServiceToken(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts index 114bac9b..00fc5768 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts @@ -3,7 +3,7 @@ import { CredentialsProvider, CredentialsType, Workspace, - SDKRuntimeConfigurator, + SDKInitializator, } from '@aws/language-server-runtimes/server-interface' import { AWSError, ConfigurationOptions, CredentialProviderChain, Credentials } from 'aws-sdk' import { PromiseResult } from 'aws-sdk/lib/request' @@ -82,7 +82,7 @@ export class CodeWhispererServiceIAM extends CodeWhispererServiceBase { workspace: Workspace, codeWhispererRegion: string, codeWhispererEndpoint: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) { super(workspace, codeWhispererRegion, codeWhispererEndpoint) const options: CodeWhispererSigv4ClientConfigurationOptions = { @@ -92,7 +92,7 @@ export class CodeWhispererServiceIAM extends CodeWhispererServiceBase { () => credentialsProvider.getCredentials('iam') as Credentials, ]), } - this.client = createCodeWhispererSigv4Client(options, sdkRuntimeConfigurator) + this.client = createCodeWhispererSigv4Client(options, sdkInitializator) this.updateClientConfig(this.proxyConfig) this.client.setupRequestListeners = ({ httpRequest }) => { httpRequest.headers['x-amzn-codewhisperer-optout'] = `${!this.shareCodeWhispererContentWithAWS}` @@ -134,7 +134,7 @@ export class CodeWhispererServiceToken extends CodeWhispererServiceBase { workspace: Workspace, codeWhispererRegion: string, codeWhispererEndpoint: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) { super(workspace, codeWhispererRegion, codeWhispererEndpoint) const options: CodeWhispererTokenClientConfigurationOptions = { @@ -153,7 +153,7 @@ export class CodeWhispererServiceToken extends CodeWhispererServiceBase { }, ], } - this.client = createCodeWhispererTokenClient(options, sdkRuntimeConfigurator) + this.client = createCodeWhispererTokenClient(options, sdkInitializator) this.updateClientConfig(this.proxyConfig) } diff --git a/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts b/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts index 6cdbf7a2..4121402a 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/configuration/qConfigurationServer.ts @@ -9,7 +9,7 @@ import { import { CodeWhispererServiceToken } from '../codeWhispererService' import { getUserAgent } from '../utilities/telemetryUtils' import { DEFAULT_AWS_Q_ENDPOINT_URL, DEFAULT_AWS_Q_REGION } from '../../constants' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' // The configuration section that the server will register and listen to export const Q_CONFIGURATION_SECTION = 'aws.q' @@ -20,16 +20,16 @@ export const QConfigurationServerToken = workspace: Workspace, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, lsp, logging, runtime, workspace, sdkRuntimeConfigurator }) => { + ({ credentialsProvider, lsp, logging, runtime, workspace, sdkInitializator }) => { const codeWhispererService = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, - sdkRuntimeConfigurator + sdkInitializator ) lsp.addInitializer((params: InitializeParams) => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts index d847d7f5..f54bc71f 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransformServer.ts @@ -46,7 +46,7 @@ const GetTransformPlanCommand = 'aws/qNetTransform/getTransformPlan' const CancelTransformCommand = 'aws/qNetTransform/cancelTransform' const DownloadArtifactsCommand = 'aws/qNetTransform/downloadArtifacts' import { DEFAULT_AWS_Q_REGION, DEFAULT_AWS_Q_ENDPOINT_URL } from '../constants' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' /** * @@ -60,16 +60,16 @@ export const QNetTransformServerToken = workspace: Workspace, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) => CodeWhispererServiceToken ): Server => - ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkRuntimeConfigurator }) => { + ({ credentialsProvider, workspace, logging, lsp, telemetry, runtime, sdkInitializator }) => { const codewhispererclient = service( credentialsProvider, workspace, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, - sdkRuntimeConfigurator + sdkInitializator ) const transformHandler = new TransformHandler(codewhispererclient, workspace, logging) const runTransformCommand = async (params: ExecuteCommandParams, _token: CancellationToken) => { @@ -128,7 +128,7 @@ export const QNetTransformServerToken = credentialsProvider, runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION, runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL, - sdkRuntimeConfigurator, + sdkInitializator, customCWClientConfig ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts index a63a95bf..84b7c428 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts @@ -11,55 +11,55 @@ import { HttpsProxyAgent } from 'hpagent' import { NodeHttpHandler } from '@smithy/node-http-handler' export const CodeWhispererServerTokenProxy = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { return new CodeWhispererServiceToken( credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) } ) export const CodeWhispererServerIAMProxy = CodewhispererServerFactory( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { return new CodeWhispererServiceIAM( credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) } ) export const CodeWhispererSecurityScanServerTokenProxy = SecurityScanServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { return new CodeWhispererServiceToken( credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) } ) export const QNetTransformServerTokenProxy = QNetTransformServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { return new CodeWhispererServiceToken( credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) } ) export const QChatServerProxy = QChatServer( - (credentialsProvider, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, awsQRegion, awsQEndpointUrl, sdkInitializator) => { let clientOptions: ChatSessionServiceConfig | undefined // short term solution to fix webworker bundling, broken due to this node.js specific logic in here const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' @@ -91,19 +91,19 @@ export const QChatServerProxy = QChatServer( .withCredentialsProvider(credentialsProvider) .withCodeWhispererEndpoint(awsQEndpointUrl) .withCodeWhispererRegion(awsQRegion) - .withSdkRuntimeConfigurator(sdkRuntimeConfigurator) + .withSdkRuntimeConfigurator(sdkInitializator) .withConfig(clientOptions) } ) export const QConfigurationServerTokenProxy = QConfigurationServerToken( - (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) => { + (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { return new CodeWhispererServiceToken( credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) } ) diff --git a/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts b/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts index 6f9f35d4..743818b8 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/qChatServer.ts @@ -5,7 +5,7 @@ import { CLEAR_QUICK_ACTION, HELP_QUICK_ACTION } from './chat/quickActions' import { TelemetryService } from './telemetryService' import { getUserAgent, makeUserContextObject } from './utilities/telemetryUtils' import { DEFAULT_AWS_Q_REGION, DEFAULT_AWS_Q_ENDPOINT_URL } from '../constants' -import { SDKRuntimeConfigurator } from '@aws/language-server-runtimes/server-interface' +import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' export const QChatServer = ( @@ -13,12 +13,11 @@ export const QChatServer = credentialsProvider: CredentialsProvider, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) => ChatSessionManagementService ): Server => features => { - const { chat, credentialsProvider, telemetry, logging, lsp, runtime, workspace, sdkRuntimeConfigurator } = - features + const { chat, credentialsProvider, telemetry, logging, lsp, runtime, workspace, sdkInitializator } = features const awsQRegion = runtime.getConfiguration('AWS_Q_REGION') ?? DEFAULT_AWS_Q_REGION const awsQEndpointUrl = runtime.getConfiguration('AWS_Q_ENDPOINT_URL') ?? DEFAULT_AWS_Q_ENDPOINT_URL @@ -26,7 +25,7 @@ export const QChatServer = credentialsProvider, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) const telemetryService = new TelemetryService( credentialsProvider, @@ -36,7 +35,7 @@ export const QChatServer = workspace, awsQRegion, awsQEndpointUrl, - sdkRuntimeConfigurator + sdkInitializator ) const chatController = new ChatController(chatSessionManagementService, features, telemetryService) diff --git a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts index 70f70026..8a86fd5c 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.ts @@ -5,7 +5,7 @@ import { Logging, Telemetry, Workspace, - SDKRuntimeConfigurator, + SDKInitializator, } from '@aws/language-server-runtimes/server-interface' import { CodeWhispererSession } from './session/sessionManager' import { @@ -62,9 +62,9 @@ export class TelemetryService extends CodeWhispererServiceToken { workspace: Workspace, awsQRegion: string, awsQEndpointUrl: string, - sdkRuntimeConfigurator: SDKRuntimeConfigurator + sdkInitializator: SDKInitializator ) { - super(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkRuntimeConfigurator) + super(credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) this.credentialsProvider = credentialsProvider this.credentialsType = credentialsType this.telemetry = telemetry From 88d924135c93630ee6af0d6ffa92ef234c7b9315 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Tue, 4 Feb 2025 15:03:40 +0100 Subject: [PATCH 6/9] test: fix tests after refactor in previous commit --- .../chat/chatController.test.ts | 29 +++++++++---------- .../chat/chatSessionManagementService.test.ts | 29 +++++++++---------- .../chat/chatSessionService.test.ts | 29 +++++++++---------- .../tests/transformHandler.test.ts | 29 +++++++++---------- .../language-server/telemetryService.test.ts | 29 +++++++++---------- 5 files changed, 70 insertions(+), 75 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts index 53eb9fb2..85ec5bdd 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatController.test.ts @@ -11,10 +11,9 @@ import { Position, InsertToCursorPositionParams, TextDocumentEdit, - SDKRuntimeConfigurator, - ConstructorV2, - ConstructorV3, - SDKv3Client, + SDKInitializator, + SDKClientConstructorV2, + SDKClientConstructorV3, } from '@aws/language-server-runtimes/server-interface' import { TestFeatures } from '@aws/language-server-runtimes/testing' import * as assert from 'assert' @@ -122,17 +121,17 @@ describe('ChatController', () => { disposeStub = sinon.stub(ChatSessionService.prototype, 'dispose') - const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { - v2: ( - Ctor: ConstructorV2, - current_config: P - ): T => { - return new Ctor({ ...current_config }) - }, - v3: (Ctor: ConstructorV3, current_config: P): T => { - return new Ctor({ ...current_config }) - }, - } + const mockSdkRuntimeConfigurator: SDKInitializator = Object.assign( + // Default callable function for v3 clients + (Ctor: SDKClientConstructorV3, current_config: P): T => new Ctor({ ...current_config }), + // Property for v2 clients + { + v2: ( + Ctor: SDKClientConstructorV2, + current_config: P + ): T => new Ctor({ ...current_config }), + } + ) chatSessionManagementService = ChatSessionManagementService.getInstance() .withCredentialsProvider(testFeatures.credentialsProvider) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts index 73f6e5c8..23b3fc74 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionManagementService.test.ts @@ -1,9 +1,8 @@ import { CredentialsProvider, - SDKRuntimeConfigurator, - ConstructorV2, - ConstructorV3, - SDKv3Client, + SDKInitializator, + SDKClientConstructorV2, + SDKClientConstructorV3, } from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import sinon from 'ts-sinon' @@ -41,17 +40,17 @@ describe('ChatSessionManagementService', () => { let disposeStub: sinon.SinonStub let chatSessionManagementService: ChatSessionManagementService - const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { - v2: ( - Ctor: ConstructorV2, - current_config: P - ): T => { - return new Ctor({ ...current_config }) - }, - v3: (Ctor: ConstructorV3, current_config: P): T => { - return new Ctor({ ...current_config }) - }, - } + const mockSdkRuntimeConfigurator: SDKInitializator = Object.assign( + // Default callable function for v3 clients + (Ctor: SDKClientConstructorV3, current_config: P): T => new Ctor({ ...current_config }), + // Property for v2 clients + { + v2: ( + Ctor: SDKClientConstructorV2, + current_config: P + ): T => new Ctor({ ...current_config }), + } + ) beforeEach(() => { disposeStub = sinon.stub(ChatSessionService.prototype, 'dispose') diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts index 6f9a3f0e..e67794c2 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/chatSessionService.test.ts @@ -5,10 +5,9 @@ import { } from '@amzn/codewhisperer-streaming' import { CredentialsProvider, - SDKRuntimeConfigurator, - ConstructorV2, - ConstructorV3, - SDKv3Client, + SDKInitializator, + SDKClientConstructorV2, + SDKClientConstructorV3, } from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import sinon from 'ts-sinon' @@ -30,17 +29,17 @@ describe('Chat Session Service', () => { const awsQEndpointUrl: string = DEFAULT_AWS_Q_ENDPOINT_URL const mockConversationId = 'mockConversationId' - const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { - v2: ( - Ctor: ConstructorV2, - current_config: P - ): T => { - return new Ctor({ ...current_config }) - }, - v3: (Ctor: ConstructorV3, current_config: P): T => { - return new Ctor({ ...current_config }) - }, - } + const mockSdkRuntimeConfigurator: SDKInitializator = Object.assign( + // Default callable function for v3 clients + (Ctor: SDKClientConstructorV3, current_config: P): T => new Ctor({ ...current_config }), + // Property for v2 clients + { + v2: ( + Ctor: SDKClientConstructorV2, + current_config: P + ): T => new Ctor({ ...current_config }), + } + ) const mockRequestParams: SendMessageCommandInput = { conversationState: { diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts index fbb90b17..2c62d477 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransform/tests/transformHandler.test.ts @@ -2,10 +2,9 @@ import { CodeWhispererStreaming } from '@amzn/codewhisperer-streaming' import { Logging, Workspace, - SDKRuntimeConfigurator, - ConstructorV2, - ConstructorV3, - SDKv3Client, + SDKInitializator, + SDKClientConstructorV2, + SDKClientConstructorV3, } from '@aws/language-server-runtimes/server-interface' import * as assert from 'assert' import { HttpResponse } from 'aws-sdk' @@ -211,17 +210,17 @@ describe('Test Transform handler ', () => { getCredentials: sinon.stub().returns({ token: 'mockedToken' }), } - const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { - v2: ( - Ctor: ConstructorV2, - current_config: P - ): T => { - return new Ctor({ ...current_config }) - }, - v3: (Ctor: ConstructorV3, current_config: P): T => { - return new Ctor({ ...current_config }) - }, - } + const mockSdkRuntimeConfigurator: SDKInitializator = Object.assign( + // Default callable function for v3 clients + (Ctor: SDKClientConstructorV3, current_config: P): T => new Ctor({ ...current_config }), + // Property for v2 clients + { + v2: ( + Ctor: SDKClientConstructorV2, + current_config: P + ): T => new Ctor({ ...current_config }), + } + ) describe('StreamingClient', () => { it('should create a new streaming client', async () => { diff --git a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts index 2f0dd495..b28d85ad 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/telemetryService.test.ts @@ -8,10 +8,9 @@ import { Logging, Telemetry, Workspace, - SDKRuntimeConfigurator, - ConstructorV2, - ConstructorV3, - SDKv3Client, + SDKInitializator, + SDKClientConstructorV2, + SDKClientConstructorV3, } from '@aws/language-server-runtimes/server-interface' import { UserContext, OptOutPreference } from '../client/token/codewhispererbearertokenclient' import { CodeWhispererSession } from './session/sessionManager' @@ -99,17 +98,17 @@ describe('TelemetryService', () => { }, } - const mockSdkRuntimeConfigurator: SDKRuntimeConfigurator = { - v2: ( - Ctor: ConstructorV2, - current_config: P - ): T => { - return new Ctor({ ...current_config }) - }, - v3: (Ctor: ConstructorV3, current_config: P): T => { - return new Ctor({ ...current_config }) - }, - } + const mockSdkRuntimeConfigurator: SDKInitializator = Object.assign( + // Default callable function for v3 clients + (Ctor: SDKClientConstructorV3, current_config: P): T => new Ctor({ ...current_config }), + // Property for v2 clients + { + v2: ( + Ctor: SDKClientConstructorV2, + current_config: P + ): T => new Ctor({ ...current_config }), + } + ) beforeEach(() => { clock = sinon.useFakeTimers({ From e7455d8b58ff88ce62acf4d317feea480b537b1f Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Tue, 4 Feb 2025 17:38:14 +0100 Subject: [PATCH 7/9] chore: bump runtimes version (to include sdkInitializator type definition) --- app/aws-lsp-antlr4-runtimes/package.json | 2 +- .../package.json | 2 +- app/aws-lsp-identity-runtimes/package.json | 2 +- app/aws-lsp-json-runtimes/package.json | 2 +- .../package.json | 2 +- app/aws-lsp-partiql-runtimes/package.json | 2 +- app/aws-lsp-yaml-json-webworker/package.json | 2 +- app/aws-lsp-yaml-runtimes/package.json | 2 +- app/hello-world-lsp-runtimes/package.json | 2 +- client/vscode/package.json | 2 +- package-lock.json | 122 ++++++++++++++---- server/aws-lsp-antlr4/package.json | 2 +- server/aws-lsp-codewhisperer/package.json | 2 +- server/aws-lsp-identity/package.json | 2 +- server/aws-lsp-json/package.json | 2 +- server/aws-lsp-notification/package.json | 2 +- server/aws-lsp-partiql/package.json | 2 +- server/aws-lsp-yaml/package.json | 2 +- server/device-sso-auth-lsp/package.json | 2 +- server/hello-world-lsp/package.json | 2 +- 20 files changed, 118 insertions(+), 42 deletions(-) diff --git a/app/aws-lsp-antlr4-runtimes/package.json b/app/aws-lsp-antlr4-runtimes/package.json index 486c9d88..3f5c8f71 100644 --- a/app/aws-lsp-antlr4-runtimes/package.json +++ b/app/aws-lsp-antlr4-runtimes/package.json @@ -12,7 +12,7 @@ "webpack": "webpack" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-antlr4": "*", "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4" diff --git a/app/aws-lsp-codewhisperer-runtimes/package.json b/app/aws-lsp-codewhisperer-runtimes/package.json index 29066b5f..3b761be4 100644 --- a/app/aws-lsp-codewhisperer-runtimes/package.json +++ b/app/aws-lsp-codewhisperer-runtimes/package.json @@ -10,7 +10,7 @@ "webpack": "webpack" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-codewhisperer": "*", "copyfiles": "^2.4.1" }, diff --git a/app/aws-lsp-identity-runtimes/package.json b/app/aws-lsp-identity-runtimes/package.json index 27679540..8d72b02c 100644 --- a/app/aws-lsp-identity-runtimes/package.json +++ b/app/aws-lsp-identity-runtimes/package.json @@ -7,7 +7,7 @@ "compile": "tsc --build" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-identity": "^0.0.1" } } diff --git a/app/aws-lsp-json-runtimes/package.json b/app/aws-lsp-json-runtimes/package.json index c7c4b0b5..4d8f4ded 100644 --- a/app/aws-lsp-json-runtimes/package.json +++ b/app/aws-lsp-json-runtimes/package.json @@ -11,7 +11,7 @@ "webpack": "webpack" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-json": "*" }, "devDependencies": { diff --git a/app/aws-lsp-notification-runtimes/package.json b/app/aws-lsp-notification-runtimes/package.json index 588a3a29..437b5f14 100644 --- a/app/aws-lsp-notification-runtimes/package.json +++ b/app/aws-lsp-notification-runtimes/package.json @@ -7,7 +7,7 @@ "compile": "tsc --build" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-notification": "^0.0.1" } } diff --git a/app/aws-lsp-partiql-runtimes/package.json b/app/aws-lsp-partiql-runtimes/package.json index 2e0dfc8f..290ba7c7 100644 --- a/app/aws-lsp-partiql-runtimes/package.json +++ b/app/aws-lsp-partiql-runtimes/package.json @@ -11,7 +11,7 @@ "package": "npm run compile && npm run compile:webpack" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-partiql": "^0.0.4" }, "devDependencies": { diff --git a/app/aws-lsp-yaml-json-webworker/package.json b/app/aws-lsp-yaml-json-webworker/package.json index 9d4a4421..fa35c646 100644 --- a/app/aws-lsp-yaml-json-webworker/package.json +++ b/app/aws-lsp-yaml-json-webworker/package.json @@ -11,7 +11,7 @@ "serve:webpack": "NODE_ENV=development webpack serve" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-json": "*", "@aws/lsp-yaml": "*" }, diff --git a/app/aws-lsp-yaml-runtimes/package.json b/app/aws-lsp-yaml-runtimes/package.json index 4915fba7..ccc7b8fa 100644 --- a/app/aws-lsp-yaml-runtimes/package.json +++ b/app/aws-lsp-yaml-runtimes/package.json @@ -11,7 +11,7 @@ "webpack": "webpack" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-yaml": "*" }, "devDependencies": { diff --git a/app/hello-world-lsp-runtimes/package.json b/app/hello-world-lsp-runtimes/package.json index 6229ea7a..168c2163 100644 --- a/app/hello-world-lsp-runtimes/package.json +++ b/app/hello-world-lsp-runtimes/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@aws/hello-world-lsp": "^0.0.1", - "@aws/language-server-runtimes": "^0.2.31" + "@aws/language-server-runtimes": "^0.2.34" }, "devDependencies": { "@types/chai": "^4.3.5", diff --git a/client/vscode/package.json b/client/vscode/package.json index 1e40e6d4..22c87c4f 100644 --- a/client/vscode/package.json +++ b/client/vscode/package.json @@ -270,7 +270,7 @@ "@aws-sdk/credential-providers": "^3.731.1", "@aws-sdk/types": "^3.535.0", "@aws/chat-client-ui-types": "^0.1.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@types/uuid": "^9.0.8", "@types/vscode": "^1.96.0", "jose": "^5.2.4", diff --git a/package-lock.json b/package-lock.json index b5f0e263..0731eedb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "name": "@aws/lsp-antlr4-runtimes", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-antlr4": "*", "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4" @@ -76,7 +76,7 @@ "name": "@aws/lsp-codewhisperer-runtimes", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-codewhisperer": "*", "copyfiles": "^2.4.1" }, @@ -90,7 +90,7 @@ "name": "@aws/lsp-identity-runtimes", "version": "0.1.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-identity": "^0.0.1" } }, @@ -98,7 +98,7 @@ "name": "@aws/lsp-json-runtimes", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-json": "*" }, "devDependencies": { @@ -118,7 +118,7 @@ "name": "@aws/lsp-notification-runtimes", "version": "0.1.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-notification": "^0.0.1" } }, @@ -126,7 +126,7 @@ "name": "@aws/lsp-partiql-runtimes", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-partiql": "^0.0.4" }, "devDependencies": { @@ -150,7 +150,7 @@ "name": "@aws/lsp-yaml-json-webworker", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-json": "*", "@aws/lsp-yaml": "*" }, @@ -170,7 +170,7 @@ "name": "@aws/lsp-yaml-runtimes", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-yaml": "*" }, "devDependencies": { @@ -192,7 +192,7 @@ "version": "0.0.1", "dependencies": { "@aws/hello-world-lsp": "^0.0.1", - "@aws/language-server-runtimes": "^0.2.31" + "@aws/language-server-runtimes": "^0.2.34" }, "devDependencies": { "@types/chai": "^4.3.5", @@ -246,7 +246,7 @@ "@aws-sdk/credential-providers": "^3.731.1", "@aws-sdk/types": "^3.535.0", "@aws/chat-client-ui-types": "^0.1.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@types/uuid": "^9.0.8", "@types/vscode": "^1.96.0", "jose": "^5.2.4", @@ -5370,12 +5370,14 @@ "link": true }, "node_modules/@aws/language-server-runtimes": { - "version": "0.2.31", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.31.tgz", - "integrity": "sha512-srdTFSM0LdOlE4A5DpXmG+9d3B+0qxAVqx510IzEFSYcLCosoMDZiJQcQSLFtPfT245MOzJKMG9Fgnfn3WGUJQ==", - "license": "Apache-2.0", + "version": "0.2.34", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.34.tgz", + "integrity": "sha512-LQ2ZoVer5sa9+TMwDAAXA3+hntKDhgMmEmfSkkfSHxYR7acZocRuJJV6l7EbHRvXpdgOQ5ezF1GWBjApz9Ogqg==", "dependencies": { "@aws/language-server-runtimes-types": "^0.1.1", + "@smithy/node-http-handler": "^4.0.2", + "aws-sdk": "^2.1692.0", + "hpagent": "^1.2.0", "jose": "^5.9.6", "rxjs": "^7.8.1", "vscode-languageserver": "^9.0.1", @@ -5404,6 +5406,80 @@ "vscode-languageserver-types": "^3.17.5" } }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/node-http-handler": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", + "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/language-server-runtimes/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws/language-server-runtimes/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -22070,7 +22146,7 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1" }, "devDependencies": { @@ -22141,7 +22217,7 @@ "@amzn/codewhisperer-streaming": "file:../../core/codewhisperer-streaming/amzn-codewhisperer-streaming-1.0.0.tgz", "@aws-sdk/util-retry": "^3.374.0", "@aws/chat-client-ui-types": "^0.1.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@gerhobbelt/gitignore-parser": "^0.2.0-9", "@smithy/node-http-handler": "^2.5.0", "adm-zip": "^0.5.10", @@ -22249,7 +22325,7 @@ "dependencies": { "@aws-sdk/client-sso-oidc": "^3.616.0", "@aws-sdk/token-providers": "^3.614.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "@smithy/node-http-handler": "^3.2.5", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -22292,7 +22368,7 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.8" @@ -22306,7 +22382,7 @@ "version": "0.0.1", "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "0.0.1", "vscode-languageserver": "^9.0.1" }, @@ -22345,7 +22421,7 @@ "version": "0.0.4", "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4", "web-tree-sitter": "0.22.6" @@ -22378,7 +22454,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.8", @@ -22392,7 +22468,7 @@ "name": "@amzn/device-sso-auth-lsp", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "vscode-languageserver": "^9.0.1" }, "devDependencies": { @@ -22403,7 +22479,7 @@ "name": "@aws/hello-world-lsp", "version": "0.0.1", "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "vscode-languageserver": "^9.0.1" }, "devDependencies": { diff --git a/server/aws-lsp-antlr4/package.json b/server/aws-lsp-antlr4/package.json index ce62db3d..859e397a 100644 --- a/server/aws-lsp-antlr4/package.json +++ b/server/aws-lsp-antlr4/package.json @@ -28,7 +28,7 @@ "clean": "rm -rf node_modules" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1" }, "peerDependencies": { diff --git a/server/aws-lsp-codewhisperer/package.json b/server/aws-lsp-codewhisperer/package.json index 2e2b9395..0534f9c5 100644 --- a/server/aws-lsp-codewhisperer/package.json +++ b/server/aws-lsp-codewhisperer/package.json @@ -30,7 +30,7 @@ "@amzn/codewhisperer-streaming": "file:../../core/codewhisperer-streaming/amzn-codewhisperer-streaming-1.0.0.tgz", "@aws-sdk/util-retry": "^3.374.0", "@aws/chat-client-ui-types": "^0.1.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@gerhobbelt/gitignore-parser": "^0.2.0-9", "@smithy/node-http-handler": "^2.5.0", "adm-zip": "^0.5.10", diff --git a/server/aws-lsp-identity/package.json b/server/aws-lsp-identity/package.json index e75a7d10..46975d8d 100644 --- a/server/aws-lsp-identity/package.json +++ b/server/aws-lsp-identity/package.json @@ -23,7 +23,7 @@ "dependencies": { "@aws-sdk/client-sso-oidc": "^3.616.0", "@aws-sdk/token-providers": "^3.614.0", - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "@smithy/node-http-handler": "^3.2.5", "@smithy/shared-ini-file-loader": "^4.0.1", diff --git a/server/aws-lsp-json/package.json b/server/aws-lsp-json/package.json index 0825391f..a9e7c1a0 100644 --- a/server/aws-lsp-json/package.json +++ b/server/aws-lsp-json/package.json @@ -24,7 +24,7 @@ "prepack": "shx cp ../../LICENSE ../../NOTICE ../../SECURITY.md ." }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.8" diff --git a/server/aws-lsp-notification/package.json b/server/aws-lsp-notification/package.json index 8e097304..a4727a77 100644 --- a/server/aws-lsp-notification/package.json +++ b/server/aws-lsp-notification/package.json @@ -19,7 +19,7 @@ "test-unit": "mocha 'out/**/*.test.js'" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "0.0.1", "vscode-languageserver": "^9.0.1" }, diff --git a/server/aws-lsp-partiql/package.json b/server/aws-lsp-partiql/package.json index 673a4d0f..69f8b175 100644 --- a/server/aws-lsp-partiql/package.json +++ b/server/aws-lsp-partiql/package.json @@ -24,7 +24,7 @@ "out" ], "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "antlr4-c3": "^3.4.1", "antlr4ng": "^3.0.4", "web-tree-sitter": "0.22.6" diff --git a/server/aws-lsp-yaml/package.json b/server/aws-lsp-yaml/package.json index 920aba8e..c929ef45 100644 --- a/server/aws-lsp-yaml/package.json +++ b/server/aws-lsp-yaml/package.json @@ -26,7 +26,7 @@ "postinstall": "node patchYamlPackage.js" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "@aws/lsp-core": "^0.0.1", "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.8", diff --git a/server/device-sso-auth-lsp/package.json b/server/device-sso-auth-lsp/package.json index 700c22ac..7da98857 100644 --- a/server/device-sso-auth-lsp/package.json +++ b/server/device-sso-auth-lsp/package.json @@ -7,7 +7,7 @@ "compile": "tsc --build" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "vscode-languageserver": "^9.0.1" }, "devDependencies": { diff --git a/server/hello-world-lsp/package.json b/server/hello-world-lsp/package.json index aef32202..e9d90459 100644 --- a/server/hello-world-lsp/package.json +++ b/server/hello-world-lsp/package.json @@ -11,7 +11,7 @@ "test": "ts-mocha -b 'src/**/*.test.ts'" }, "dependencies": { - "@aws/language-server-runtimes": "^0.2.31", + "@aws/language-server-runtimes": "^0.2.34", "vscode-languageserver": "^9.0.1" }, "devDependencies": { From d85640a749346b3df023692b897f54d453dd627c Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Tue, 4 Feb 2025 17:40:15 +0100 Subject: [PATCH 8/9] chore: fix code style issue --- .../src/language-server/proxy-server.ts | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts index 84b7c428..2e48b6d5 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts @@ -58,43 +58,41 @@ export const QNetTransformServerTokenProxy = QNetTransformServerToken( } ) -export const QChatServerProxy = QChatServer( - (credentialsProvider, awsQRegion, awsQEndpointUrl, sdkInitializator) => { - let clientOptions: ChatSessionServiceConfig | undefined - // short term solution to fix webworker bundling, broken due to this node.js specific logic in here - const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' - const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined - const certs = isNodeJS - ? process.env.AWS_CA_BUNDLE - ? [readFileSync(process.env.AWS_CA_BUNDLE)] - : undefined +export const QChatServerProxy = QChatServer((credentialsProvider, awsQRegion, awsQEndpointUrl, sdkInitializator) => { + let clientOptions: ChatSessionServiceConfig | undefined + // short term solution to fix webworker bundling, broken due to this node.js specific logic in here + const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' + const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined + const certs = isNodeJS + ? process.env.AWS_CA_BUNDLE + ? [readFileSync(process.env.AWS_CA_BUNDLE)] : undefined + : undefined - if (proxyUrl) { - clientOptions = () => { - // this mimics aws-sdk-v3-js-proxy - const agent = new HttpsProxyAgent({ - proxy: proxyUrl, - ca: certs, - }) + if (proxyUrl) { + clientOptions = () => { + // this mimics aws-sdk-v3-js-proxy + const agent = new HttpsProxyAgent({ + proxy: proxyUrl, + ca: certs, + }) - return { - requestHandler: new NodeHttpHandler({ - httpAgent: agent, - httpsAgent: agent, - }), - } + return { + requestHandler: new NodeHttpHandler({ + httpAgent: agent, + httpsAgent: agent, + }), } } - - return ChatSessionManagementService.getInstance() - .withCredentialsProvider(credentialsProvider) - .withCodeWhispererEndpoint(awsQEndpointUrl) - .withCodeWhispererRegion(awsQRegion) - .withSdkRuntimeConfigurator(sdkInitializator) - .withConfig(clientOptions) } -) + + return ChatSessionManagementService.getInstance() + .withCredentialsProvider(credentialsProvider) + .withCodeWhispererEndpoint(awsQEndpointUrl) + .withCodeWhispererRegion(awsQRegion) + .withSdkRuntimeConfigurator(sdkInitializator) + .withConfig(clientOptions) +}) export const QConfigurationServerTokenProxy = QConfigurationServerToken( (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { From d7589da60e91cf05a576ad75b92218c1dd66e981 Mon Sep 17 00:00:00 2001 From: Francesco Piccoli Date: Wed, 5 Feb 2025 13:29:27 +0100 Subject: [PATCH 9/9] refactor: remove proxy code (moved to runtimes) --- .../codewhispererStreamingClient.ts | 28 ----------------- .../language-server/codeWhispererService.ts | 5 --- .../src/language-server/proxy-server.ts | 31 ------------------- .../src/language-server/utils.ts | 29 +---------------- 4 files changed, 1 insertion(+), 92 deletions(-) diff --git a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts index ff8ba71c..d56041d0 100644 --- a/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts +++ b/server/aws-lsp-codewhisperer/src/client/streamingClient/codewhispererStreamingClient.ts @@ -1,8 +1,5 @@ import { CodeWhispererStreaming, CodeWhispererStreamingClientConfig } from '@amzn/codewhisperer-streaming' import { ConfiguredRetryStrategy } from '@aws-sdk/util-retry' -import { readFileSync } from 'fs' -import { NodeHttpHandler } from '@smithy/node-http-handler' -import { HttpsProxyAgent } from 'hpagent' import { SDKInitializator } from '@aws/language-server-runtimes/server-interface' export class StreamingClient { @@ -31,36 +28,11 @@ export async function createStreamingClient( ): Promise { const creds = credentialsProvider.getCredentials('bearer') - let clientOptions - // short term solution to fix webworker bundling, broken due to this node.js specific logic in here - const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' - const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined - const certs = isNodeJS - ? process.env.AWS_CA_BUNDLE - ? [readFileSync(process.env.AWS_CA_BUNDLE)] - : undefined - : undefined - - if (proxyUrl) { - const agent = new HttpsProxyAgent({ - proxy: proxyUrl, - ca: certs, - }) - - clientOptions = { - requestHandler: new NodeHttpHandler({ - httpAgent: agent, - httpsAgent: agent, - }), - } - } - const streamingClient = sdkInitializator(CodeWhispererStreaming, { region: codeWhispererRegion, endpoint: codeWhispererEndpoint, token: { token: creds.token }, retryStrategy: new ConfiguredRetryStrategy(0, (attempt: number) => 500 + attempt ** 10), - requestHandler: clientOptions?.requestHandler, ...config, }) return streamingClient diff --git a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts index 00fc5768..d0a233df 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/codeWhispererService.ts @@ -43,14 +43,12 @@ export interface GenerateSuggestionsResponse { import CodeWhispererSigv4Client = require('../client/sigv4/codewhisperersigv4client') import CodeWhispererTokenClient = require('../client/token/codewhispererbearertokenclient') -import { makeProxyConfig } from './utils' // Right now the only difference between the token client and the IAM client for codewhsiperer is the difference in function name // This abstract class can grow in the future to account for any additional changes across the clients export abstract class CodeWhispererServiceBase { protected readonly codeWhispererRegion protected readonly codeWhispererEndpoint - protected proxyConfig: ConfigurationOptions = {} public shareCodeWhispererContentWithAWS = false public customizationArn?: string abstract client: CodeWhispererSigv4Client | CodeWhispererTokenClient @@ -60,7 +58,6 @@ export abstract class CodeWhispererServiceBase { abstract generateSuggestions(request: GenerateSuggestionsRequest): Promise constructor(workspace: Workspace, codeWhispererRegion: string, codeWhispererEndpoint: string) { - this.proxyConfig = makeProxyConfig(workspace) this.codeWhispererRegion = codeWhispererRegion this.codeWhispererEndpoint = codeWhispererEndpoint } @@ -93,7 +90,6 @@ export class CodeWhispererServiceIAM extends CodeWhispererServiceBase { ]), } this.client = createCodeWhispererSigv4Client(options, sdkInitializator) - this.updateClientConfig(this.proxyConfig) this.client.setupRequestListeners = ({ httpRequest }) => { httpRequest.headers['x-amzn-codewhisperer-optout'] = `${!this.shareCodeWhispererContentWithAWS}` } @@ -154,7 +150,6 @@ export class CodeWhispererServiceToken extends CodeWhispererServiceBase { ], } this.client = createCodeWhispererTokenClient(options, sdkInitializator) - this.updateClientConfig(this.proxyConfig) } getCredentialsType(): CredentialsType { diff --git a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts index 2e48b6d5..2dfd250b 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/proxy-server.ts @@ -6,9 +6,6 @@ import { CodeWhispererServiceIAM, CodeWhispererServiceToken } from './codeWhispe import { QNetTransformServerToken } from './netTransformServer' import { QChatServer } from './qChatServer' import { QConfigurationServerToken } from './configuration/qConfigurationServer' -import { readFileSync } from 'fs' -import { HttpsProxyAgent } from 'hpagent' -import { NodeHttpHandler } from '@smithy/node-http-handler' export const CodeWhispererServerTokenProxy = CodewhispererServerFactory( (credentialsProvider, workspace, awsQRegion, awsQEndpointUrl, sdkInitializator) => { @@ -59,39 +56,11 @@ export const QNetTransformServerTokenProxy = QNetTransformServerToken( ) export const QChatServerProxy = QChatServer((credentialsProvider, awsQRegion, awsQEndpointUrl, sdkInitializator) => { - let clientOptions: ChatSessionServiceConfig | undefined - // short term solution to fix webworker bundling, broken due to this node.js specific logic in here - const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' - const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined - const certs = isNodeJS - ? process.env.AWS_CA_BUNDLE - ? [readFileSync(process.env.AWS_CA_BUNDLE)] - : undefined - : undefined - - if (proxyUrl) { - clientOptions = () => { - // this mimics aws-sdk-v3-js-proxy - const agent = new HttpsProxyAgent({ - proxy: proxyUrl, - ca: certs, - }) - - return { - requestHandler: new NodeHttpHandler({ - httpAgent: agent, - httpsAgent: agent, - }), - } - } - } - return ChatSessionManagementService.getInstance() .withCredentialsProvider(credentialsProvider) .withCodeWhispererEndpoint(awsQEndpointUrl) .withCodeWhispererRegion(awsQRegion) .withSdkRuntimeConfigurator(sdkInitializator) - .withConfig(clientOptions) }) export const QConfigurationServerTokenProxy = QConfigurationServerToken( diff --git a/server/aws-lsp-codewhisperer/src/language-server/utils.ts b/server/aws-lsp-codewhisperer/src/language-server/utils.ts index 0a4a9b57..17cc8d2d 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/utils.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/utils.ts @@ -4,13 +4,12 @@ import { Position, Workspace, } from '@aws/language-server-runtimes/server-interface' -import { AWSError, ConfigurationOptions } from 'aws-sdk' +import { AWSError } from 'aws-sdk' import { distance } from 'fastest-levenshtein' import { Suggestion } from './codeWhispererService' import { CodewhispererCompletionType } from './telemetry/types' import { BUILDER_ID_START_URL, MISSING_BEARER_TOKEN_ERROR } from './constants' import { ServerInfo } from '@aws/language-server-runtimes/server-interface/runtime' -import { HttpsProxyAgent } from 'hpagent' export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' export function isAwsError(error: unknown): error is AWSError { @@ -130,29 +129,3 @@ export function getEndPositionForAcceptedSuggestion(content: string, startPositi } return endPosition } - -export const makeProxyConfig = (workspace: Workspace) => { - let additionalAwsConfig: ConfigurationOptions = {} - // short term solution to fix webworker bundling, broken due to this node.js specific logic in here - const isNodeJS: boolean = typeof process !== 'undefined' && process.release && process.release.name === 'node' - const proxyUrl = isNodeJS ? (process.env.HTTPS_PROXY ?? process.env.https_proxy) : undefined - - if (proxyUrl) { - const certs = isNodeJS - ? process.env.AWS_CA_BUNDLE - ? [workspace.fs.readFileSync(process.env.AWS_CA_BUNDLE)] - : undefined - : undefined - const agent = new HttpsProxyAgent({ - proxy: proxyUrl, - ca: certs, - }) - additionalAwsConfig = { - httpOptions: { - agent: agent, - }, - } - } - - return additionalAwsConfig -}