Skip to content

Commit 6456e40

Browse files
[ACS][CallAutomation] Fixing Custom endpoint pointing for sub-clients (#27989)
Fixing bug where sub-clients (CallConnection, CallMedia, CallRecording) unable to authenticate properly --------- Co-authored-by: Min Woo Lee 🧊 <[email protected]>
1 parent ecba9ef commit 6456e40

File tree

5 files changed

+65
-42
lines changed

5 files changed

+65
-42
lines changed

sdk/communication/communication-call-automation/src/callAutomationClient.ts

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { InternalPipelineOptions } from "@azure/core-rest-pipeline";
66
import {
77
parseClientArguments,
88
isKeyCredential,
9-
createCommunicationAuthPolicy,
109
CommunicationIdentifier,
1110
CommunicationUserIdentifier,
1211
} from "@azure/communication-common";
@@ -39,7 +38,7 @@ import {
3938
PhoneNumberIdentifierModelConverter,
4039
} from "./utli/converters";
4140
import { v4 as uuidv4 } from "uuid";
42-
import { createCallAutomationAuthPolicy } from "./credential/callAutomationAuthPolicy";
41+
import { createCustomCallAutomationApiClient } from "./credential/callAutomationAuthPolicy";
4342
import { CallAutomationEventProcessor } from "./eventprocessor/callAutomationEventProcessor";
4443
import { AnswerCallEventResult, CreateCallEventResult } from "./eventprocessor/eventResponses";
4544
/**
@@ -69,6 +68,7 @@ export class CallAutomationClient {
6968
private readonly credential: TokenCredential | KeyCredential;
7069
private readonly internalPipelineOptions: InternalPipelineOptions;
7170
private readonly callAutomationEventProcessor: CallAutomationEventProcessor;
71+
private readonly endpoint: string;
7272
/**
7373
* Initializes a new instance of the CallAutomationClient class.
7474
* @param connectionString - Connection string to connect to an Azure Communication Service resource.
@@ -112,29 +112,19 @@ export class CallAutomationClient {
112112
};
113113

114114
const { url, credential } = parseClientArguments(connectionStringOrUrl, credentialOrOptions);
115+
this.endpoint = url;
115116

116117
this.credential = credential;
117118

118119
// create event processor
119120
this.callAutomationEventProcessor = new CallAutomationEventProcessor();
120121

121-
// read environment variable for callAutomation auth
122-
const customEnabled = process.env.COMMUNICATION_CUSTOM_ENDPOINT_ENABLED;
123-
const customUrl = process.env.COMMUNICATION_CUSTOM_URL;
124-
125-
if (customEnabled?.toLowerCase() === "true" && customUrl) {
126-
// add custom header for Call Automation auth when flag is true
127-
this.callAutomationApiClient = new CallAutomationApiClient(
128-
customUrl,
129-
this.internalPipelineOptions
130-
);
131-
const callAutomationAuthPolicy = createCallAutomationAuthPolicy(credential, url);
132-
this.callAutomationApiClient.pipeline.addPolicy(callAutomationAuthPolicy);
133-
} else {
134-
this.callAutomationApiClient = new CallAutomationApiClient(url, this.internalPipelineOptions);
135-
const authPolicy = createCommunicationAuthPolicy(credential);
136-
this.callAutomationApiClient.pipeline.addPolicy(authPolicy);
137-
}
122+
// create api client (using custom api endpoint if available)
123+
this.callAutomationApiClient = createCustomCallAutomationApiClient(
124+
credential,
125+
this.internalPipelineOptions,
126+
this.endpoint
127+
);
138128

139129
this.sourceIdentity = communicationUserIdentifierModelConverter(options.sourceIdentity);
140130
}
@@ -146,7 +136,7 @@ export class CallAutomationClient {
146136
public getCallConnection(callConnectionId: string): CallConnection {
147137
return new CallConnection(
148138
callConnectionId,
149-
this.callAutomationApiClient.endpoint,
139+
this.endpoint,
150140
this.credential,
151141
this.callAutomationEventProcessor,
152142
this.internalPipelineOptions
@@ -157,11 +147,7 @@ export class CallAutomationClient {
157147
* Initializes a new instance of CallRecording.
158148
*/
159149
public getCallRecording(): CallRecording {
160-
return new CallRecording(
161-
this.callAutomationApiClient.endpoint,
162-
this.credential,
163-
this.internalPipelineOptions
164-
);
150+
return new CallRecording(this.endpoint, this.credential, this.internalPipelineOptions);
165151
}
166152

167153
/**
@@ -205,7 +191,7 @@ export class CallAutomationClient {
205191
};
206192
const callConnection = new CallConnection(
207193
callConnectionId,
208-
this.callAutomationApiClient.endpoint,
194+
this.endpoint,
209195
this.credential,
210196
this.callAutomationEventProcessor,
211197
this.internalPipelineOptions
@@ -339,7 +325,7 @@ export class CallAutomationClient {
339325
};
340326
const callConnection = new CallConnection(
341327
callConnectionId,
342-
this.callAutomationApiClient.endpoint,
328+
this.endpoint,
343329
this.credential,
344330
this.callAutomationEventProcessor,
345331
this.internalPipelineOptions

sdk/communication/communication-call-automation/src/callConnection.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import {
5-
CommunicationIdentifier,
6-
createCommunicationAuthPolicy,
7-
} from "@azure/communication-common";
4+
import { CommunicationIdentifier } from "@azure/communication-common";
85
import { CallMedia } from "./callMedia";
96
import {
107
AddParticipantRequest,
@@ -57,6 +54,7 @@ import {
5754
RemoveParticipantEventResult,
5855
TransferCallToParticipantEventResult,
5956
} from "./eventprocessor/eventResponses";
57+
import { createCustomCallAutomationApiClient } from "./credential/callAutomationAuthPolicy";
6058

6159
/**
6260
* CallConnection class represents call connection based APIs.
@@ -76,9 +74,11 @@ export class CallConnection {
7674
eventProcessor: CallAutomationEventProcessor,
7775
options?: CallAutomationApiClientOptionalParams
7876
) {
79-
this.callAutomationApiClient = new CallAutomationApiClient(endpoint, options);
80-
const authPolicy = createCommunicationAuthPolicy(credential);
81-
this.callAutomationApiClient.pipeline.addPolicy(authPolicy);
77+
this.callAutomationApiClient = createCustomCallAutomationApiClient(
78+
credential,
79+
options,
80+
endpoint
81+
);
8282
this.callConnectionId = callConnectionId;
8383
this.callConnection = new CallConnectionImpl(this.callAutomationApiClient);
8484
this.endpoint = endpoint;

sdk/communication/communication-call-automation/src/callMedia.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import { CallMediaImpl } from "./generated/src/operations";
2626

2727
import {
2828
CommunicationIdentifier,
29-
createCommunicationAuthPolicy,
3029
serializeCommunicationIdentifier,
3130
} from "@azure/communication-common";
3231

@@ -55,6 +54,7 @@ import {
5554
} from "./eventprocessor/eventResponses";
5655
import { CallAutomationEventProcessor } from "./eventprocessor/callAutomationEventProcessor";
5756
import { v4 as uuidv4 } from "uuid";
57+
import { createCustomCallAutomationApiClient } from "./credential/callAutomationAuthPolicy";
5858

5959
/**
6060
* CallMedia class represents call media related APIs.
@@ -71,9 +71,11 @@ export class CallMedia {
7171
eventProcessor: CallAutomationEventProcessor,
7272
options?: CallAutomationApiClientOptionalParams
7373
) {
74-
this.callAutomationApiClient = new CallAutomationApiClient(endpoint, options);
75-
const authPolicy = createCommunicationAuthPolicy(credential);
76-
this.callAutomationApiClient.pipeline.addPolicy(authPolicy);
74+
this.callAutomationApiClient = createCustomCallAutomationApiClient(
75+
credential,
76+
options,
77+
endpoint
78+
);
7779
this.callConnectionId = callConnectionId;
7880
this.callAutomationEventProcessor = eventProcessor;
7981
this.callMedia = new CallMediaImpl(this.callAutomationApiClient);

sdk/communication/communication-call-automation/src/callRecording.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as fs from "fs";
2121
import { v4 as uuidv4 } from "uuid";
2222
import { KeyCredential, TokenCredential } from "@azure/core-auth";
2323
import { CallAutomationApiClient } from "./generated/src";
24-
import { createCommunicationAuthPolicy } from "@azure/communication-common";
24+
import { createCustomCallAutomationApiClient } from "./credential/callAutomationAuthPolicy";
2525

2626
/**
2727
* CallRecording class represents call recording related APIs.
@@ -36,9 +36,11 @@ export class CallRecording {
3636
credential: KeyCredential | TokenCredential,
3737
options?: CallAutomationApiClientOptionalParams
3838
) {
39-
this.callAutomationApiClient = new CallAutomationApiClient(endpoint, options);
40-
const authPolicy = createCommunicationAuthPolicy(credential);
41-
this.callAutomationApiClient.pipeline.addPolicy(authPolicy);
39+
this.callAutomationApiClient = createCustomCallAutomationApiClient(
40+
credential,
41+
options,
42+
endpoint
43+
);
4244

4345
this.callRecordingImpl = new CallRecordingImpl(this.callAutomationApiClient);
4446
this.contentDownloader = new ContentDownloaderImpl(this.callAutomationApiClient);

sdk/communication/communication-call-automation/src/credential/callAutomationAuthPolicy.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
} from "@azure/core-rest-pipeline";
99
import { KeyCredential, TokenCredential, isTokenCredential } from "@azure/core-auth";
1010
import { createCallAutomationAccessKeyCredentialPolicy } from "./callAutomationAccessKeyCredentialPolicy";
11+
import { CallAutomationApiClient, CallAutomationApiClientOptionalParams } from "./../generated/src";
12+
import { createCommunicationAuthPolicy } from "@azure/communication-common";
1113
/**
1214
* Creates a pipeline policy to authenticate request based
1315
* on the credential passed in.
@@ -29,3 +31,34 @@ export function createCallAutomationAuthPolicy(
2931
return createCallAutomationAccessKeyCredentialPolicy(credential, acsUrl);
3032
}
3133
}
34+
35+
/**
36+
* Creates CallAutomationApiClient for custom endpoint
37+
* @hidden
38+
*
39+
* @param credential - The KeyCredential or TokenCredential.
40+
* @param internalPipelineOptions - CallAutomationApiClientOptionalParams if provided.
41+
* @param url - ACS url.
42+
*/
43+
export function createCustomCallAutomationApiClient(
44+
credential: KeyCredential | TokenCredential,
45+
internalPipelineOptions: CallAutomationApiClientOptionalParams | undefined,
46+
url: string
47+
): CallAutomationApiClient {
48+
// read environment variable for callAutomation auth
49+
const customEnabled = process.env.COMMUNICATION_CUSTOM_ENDPOINT_ENABLED;
50+
const customUrl = process.env.COMMUNICATION_CUSTOM_URL;
51+
let callAutomationApiClient: CallAutomationApiClient;
52+
53+
if (customEnabled?.toLowerCase() === "true" && customUrl) {
54+
// add custom header for Call Automation auth when flag is true
55+
callAutomationApiClient = new CallAutomationApiClient(customUrl, internalPipelineOptions);
56+
const callAutomationAuthPolicy = createCallAutomationAuthPolicy(credential, url);
57+
callAutomationApiClient.pipeline.addPolicy(callAutomationAuthPolicy);
58+
} else {
59+
callAutomationApiClient = new CallAutomationApiClient(url, internalPipelineOptions);
60+
const authPolicy = createCommunicationAuthPolicy(credential);
61+
callAutomationApiClient.pipeline.addPolicy(authPolicy);
62+
}
63+
return callAutomationApiClient;
64+
}

0 commit comments

Comments
 (0)