Fix lazy creation of ProxyAgent

This commit is contained in:
Fedor Indutny 2024-04-18 01:13:15 +02:00 committed by GitHub
parent 968d8d8911
commit 97f5430541
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -86,7 +86,7 @@ export class SocketManager extends EventListener {
private credentials?: WebAPICredentials; private credentials?: WebAPICredentials;
private proxyAgent?: ProxyAgent; private lazyProxyAgent?: Promise<ProxyAgent>;
private status = SocketStatus.CLOSED; private status = SocketStatus.CLOSED;
@ -164,6 +164,7 @@ export class SocketManager extends EventListener {
name: AUTHENTICATED_CHANNEL_NAME, name: AUTHENTICATED_CHANNEL_NAME,
path: '/v1/websocket/', path: '/v1/websocket/',
query: { login: username, password }, query: { login: username, password },
proxyAgent: await this.getProxyAgent(),
resourceOptions: { resourceOptions: {
name: AUTHENTICATED_CHANNEL_NAME, name: AUTHENTICATED_CHANNEL_NAME,
keepalive: { path: '/v1/keepalive' }, keepalive: { path: '/v1/keepalive' },
@ -321,6 +322,7 @@ export class SocketManager extends EventListener {
return this.connectResource({ return this.connectResource({
name: 'provisioning', name: 'provisioning',
path: '/v1/websocket/provisioning/', path: '/v1/websocket/provisioning/',
proxyAgent: await this.getProxyAgent(),
resourceOptions: { resourceOptions: {
name: 'provisioning', name: 'provisioning',
handleRequest: (req: IncomingWebSocketRequest): void => { handleRequest: (req: IncomingWebSocketRequest): void => {
@ -339,16 +341,13 @@ export class SocketManager extends EventListener {
url: string; url: string;
extraHeaders?: Record<string, string>; extraHeaders?: Record<string, string>;
}): Promise<WebSocket> { }): Promise<WebSocket> {
// Create proxy agent lazily const proxyAgent = await this.getProxyAgent();
if (this.options.proxyUrl && !this.proxyAgent) {
this.proxyAgent = await createProxyAgent(this.options.proxyUrl);
}
return connectWebSocket({ return connectWebSocket({
name: 'art-creator-provisioning', name: 'art-creator-provisioning',
url, url,
version: this.options.version, version: this.options.version,
proxyAgent: this.proxyAgent, proxyAgent,
extraHeaders, extraHeaders,
createResource(socket: WebSocket): WebSocket { createResource(socket: WebSocket): WebSocket {
@ -525,15 +524,11 @@ export class SocketManager extends EventListener {
} }
} }
private transportOption(): TransportOption { private transportOption(proxyAgent: ProxyAgent | undefined): TransportOption {
const { hostname } = URL.parse(this.options.url); const { hostname } = URL.parse(this.options.url);
// transport experiment doesn't support proxy // transport experiment doesn't support proxy
if ( if (proxyAgent || hostname == null || !hostname.endsWith('signal.org')) {
this.proxyAgent ||
hostname == null ||
!hostname.endsWith('signal.org')
) {
return TransportOption.Original; return TransportOption.Original;
} }
@ -590,7 +585,9 @@ export class SocketManager extends EventListener {
log.info('SocketManager: connecting unauthenticated socket'); log.info('SocketManager: connecting unauthenticated socket');
const transportOption = this.transportOption(); const proxyAgent = await this.getProxyAgent();
const transportOption = this.transportOption(proxyAgent);
log.info( log.info(
`SocketManager: connecting unauthenticated socket, transport option [${transportOption}]` `SocketManager: connecting unauthenticated socket, transport option [${transportOption}]`
); );
@ -603,6 +600,7 @@ export class SocketManager extends EventListener {
const process = this.connectResource({ const process = this.connectResource({
name: UNAUTHENTICATED_CHANNEL_NAME, name: UNAUTHENTICATED_CHANNEL_NAME,
path: '/v1/websocket/', path: '/v1/websocket/',
proxyAgent,
resourceOptions: { resourceOptions: {
name: UNAUTHENTICATED_CHANNEL_NAME, name: UNAUTHENTICATED_CHANNEL_NAME,
keepalive: { path: '/v1/keepalive' }, keepalive: { path: '/v1/keepalive' },
@ -646,12 +644,14 @@ export class SocketManager extends EventListener {
private connectResource({ private connectResource({
name, name,
path, path,
proxyAgent,
resourceOptions, resourceOptions,
query = {}, query = {},
extraHeaders = {}, extraHeaders = {},
}: { }: {
name: string; name: string;
path: string; path: string;
proxyAgent: ProxyAgent | undefined;
resourceOptions: WebSocketResourceOptions; resourceOptions: WebSocketResourceOptions;
query?: Record<string, string>; query?: Record<string, string>;
extraHeaders?: Record<string, string>; extraHeaders?: Record<string, string>;
@ -671,7 +671,7 @@ export class SocketManager extends EventListener {
url, url,
version, version,
certificateAuthority: this.options.certificateAuthority, certificateAuthority: this.options.certificateAuthority,
proxyAgent: this.proxyAgent, proxyAgent,
extraHeaders, extraHeaders,
@ -876,6 +876,14 @@ export class SocketManager extends EventListener {
); );
} }
private async getProxyAgent(): Promise<ProxyAgent | undefined> {
if (this.options.proxyUrl && !this.lazyProxyAgent) {
// Cache the promise so that we don't import concurrently.
this.lazyProxyAgent = createProxyAgent(this.options.proxyUrl);
}
return this.lazyProxyAgent;
}
// EventEmitter types // EventEmitter types
public override on( public override on(