Skip to content

Commit 0147d41

Browse files
committed
fix: call command.resolveMiddleware instead of client.send
refs: trivikr#105
1 parent 5004455 commit 0147d41

File tree

7 files changed

+56
-51
lines changed

7 files changed

+56
-51
lines changed

clients/client-timestream-query/TimestreamQueryClient.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,8 @@ export class TimestreamQueryClient extends __Client<
223223
let _config_4 = resolveHostHeaderConfig(_config_3);
224224
let _config_5 = resolveAwsAuthConfig(_config_4);
225225
let _config_6 = resolveUserAgentConfig(_config_5);
226-
let _config_7 = resolveEndpointDiscoveryConfig(_config_6);
226+
let _config_7 = resolveEndpointDiscoveryConfig(_config_6, DescribeEndpointsCommand);
227227
super(_config_7);
228-
_config_7.client = this;
229-
_config_7.endpointDiscoveryCommandCtor = DescribeEndpointsCommand;
230228
this.config = _config_7;
231229
this.middlewareStack.use(getRetryPlugin(this.config));
232230
this.middlewareStack.use(getContentLengthPlugin(this.config));

clients/client-timestream-query/commands/QueryCommand.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@ export class QueryCommand extends $Command<QueryCommandInput, QueryCommandOutput
5555
configuration: TimestreamQueryClientResolvedConfig,
5656
options?: __HttpHandlerOptions
5757
): Handler<QueryCommandInput, QueryCommandOutput> {
58+
const isDiscoveredEndpointRequired = true;
5859
this.middlewareStack.use(getSerdePlugin(configuration, this.serialize, this.deserialize));
5960
this.middlewareStack.use(
6061
getEndpointDiscoveryCommandPlugin(configuration, {
61-
isDiscoveredEndpointRequired: true,
62+
isDiscoveredEndpointRequired,
63+
clientStack,
64+
options,
6265
})
6366
);
6467

packages/middleware-endpoint-discovery/src/getEndpointDiscoveryCommandPlugin.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FinalizeRequestHandlerOptions, Pluggable } from "@aws-sdk/types";
1+
import { FinalizeRequestHandlerOptions, HttpHandlerOptions, MiddlewareStack, Pluggable } from "@aws-sdk/types";
22

33
import { endpointDiscoveryMiddleware } from "./endpointDiscoveryMiddleware";
44
import { EndpointDiscoveryResolvedConfig } from "./resolveEndpointDiscoveryConfig";
@@ -12,6 +12,8 @@ export const endpointDiscoveryMiddlewareOptions: FinalizeRequestHandlerOptions =
1212

1313
export type EndpointDiscoveryMiddlewareConfig = {
1414
isDiscoveredEndpointRequired: boolean;
15+
clientStack: MiddlewareStack<any, any>;
16+
options?: HttpHandlerOptions;
1517
identifiers?: { [key: string]: string };
1618
};
1719

packages/middleware-endpoint-discovery/src/resolveEndpointDiscoveryConfig.spec.ts

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,58 @@ import { resolveEndpointDiscoveryConfig } from "./resolveEndpointDiscoveryConfig
55
jest.mock("@aws-sdk/endpoint-cache");
66

77
describe(resolveEndpointDiscoveryConfig.name, () => {
8-
const isCustomEndpoint = false;
9-
const credentials = jest.fn();
10-
const endpointDiscoveryEnabledProvider = jest.fn().mockResolvedValue(undefined);
8+
const endpointDiscoveryCommandCtor = jest.fn();
9+
const mockInput = {
10+
isCustomEndpoint: false,
11+
credentials: jest.fn(),
12+
endpointDiscoveryEnabledProvider: jest.fn(),
13+
};
1114

1215
afterEach(() => {
1316
jest.clearAllMocks();
1417
});
1518

19+
it("assigns endpointDiscoveryCommandCtor in resolvedConfig", () => {
20+
const resolvedConfig = resolveEndpointDiscoveryConfig(mockInput, endpointDiscoveryCommandCtor);
21+
expect(resolvedConfig.endpointDiscoveryCommandCtor).toStrictEqual(endpointDiscoveryCommandCtor);
22+
});
23+
1624
describe("endpointCache", () => {
1725
it("creates cache of size endpointCacheSize if passed", () => {
1826
const endpointCacheSize = 100;
19-
resolveEndpointDiscoveryConfig({
20-
isCustomEndpoint,
21-
credentials,
22-
endpointCacheSize,
23-
endpointDiscoveryEnabledProvider,
24-
});
27+
resolveEndpointDiscoveryConfig(
28+
{
29+
...mockInput,
30+
endpointCacheSize,
31+
},
32+
endpointDiscoveryCommandCtor
33+
);
2534
expect(EndpointCache).toBeCalledWith(endpointCacheSize);
2635
});
2736

2837
it("creates cache of size 1000 if endpointCacheSize not passed", () => {
29-
resolveEndpointDiscoveryConfig({
30-
isCustomEndpoint,
31-
credentials,
32-
endpointDiscoveryEnabledProvider,
33-
});
38+
resolveEndpointDiscoveryConfig(mockInput, endpointDiscoveryCommandCtor);
3439
expect(EndpointCache).toBeCalledWith(1000);
3540
});
3641
});
3742

3843
describe("endpointDiscoveryEnabled", () => {
3944
it.each<boolean>([false, true])(`sets to value passed in the config: %s`, (endpointDiscoveryEnabled) => {
40-
const resolvedConfig = resolveEndpointDiscoveryConfig({
41-
isCustomEndpoint,
42-
credentials,
43-
endpointDiscoveryEnabled,
44-
endpointDiscoveryEnabledProvider,
45-
});
45+
const resolvedConfig = resolveEndpointDiscoveryConfig(
46+
{
47+
...mockInput,
48+
endpointDiscoveryEnabled,
49+
},
50+
endpointDiscoveryCommandCtor
51+
);
4652
expect(resolvedConfig.endpointDiscoveryEnabled()).resolves.toBe(endpointDiscoveryEnabled);
47-
expect(endpointDiscoveryEnabledProvider).not.toHaveBeenCalled();
53+
expect(mockInput.endpointDiscoveryEnabledProvider).not.toHaveBeenCalled();
4854
expect(resolvedConfig.isClientEndpointDiscoveryEnabled).toStrictEqual(true);
4955
});
5056

5157
it(`sets to endpointDiscoveryEnabledProvider if value is not passed`, () => {
52-
const resolvedConfig = resolveEndpointDiscoveryConfig({
53-
isCustomEndpoint,
54-
credentials,
55-
endpointDiscoveryEnabledProvider,
56-
});
57-
expect(resolvedConfig.endpointDiscoveryEnabled).toBe(endpointDiscoveryEnabledProvider);
58+
const resolvedConfig = resolveEndpointDiscoveryConfig(mockInput, endpointDiscoveryCommandCtor);
59+
expect(resolvedConfig.endpointDiscoveryEnabled).toBe(mockInput.endpointDiscoveryEnabledProvider);
5860
expect(resolvedConfig.isClientEndpointDiscoveryEnabled).toStrictEqual(false);
5961
});
6062
});

packages/middleware-endpoint-discovery/src/resolveEndpointDiscoveryConfig.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,18 @@ interface PreviouslyResolved {
2525
export interface EndpointDiscoveryResolvedConfig {
2626
isCustomEndpoint: boolean;
2727
credentials: Provider<Credentials>;
28-
client?: Client<any, any, any>;
29-
endpointDiscoveryCommandCtor?: new (comandConfig: any) => Command<any, any, any, any, any>;
28+
endpointDiscoveryCommandCtor: new (comandConfig: any) => Command<any, any, any, any, any>;
3029
endpointCache: EndpointCache;
3130
endpointDiscoveryEnabled: Provider<boolean | undefined>;
3231
isClientEndpointDiscoveryEnabled: boolean;
3332
}
3433

3534
export const resolveEndpointDiscoveryConfig = <T>(
36-
input: T & PreviouslyResolved & EndpointDiscoveryInputConfig
35+
input: T & PreviouslyResolved & EndpointDiscoveryInputConfig,
36+
endpointDiscoveryCommandCtor: new (comandConfig: any) => Command<any, any, any, any, any>
3737
): T & EndpointDiscoveryResolvedConfig => ({
3838
...input,
39+
endpointDiscoveryCommandCtor,
3940
endpointCache: new EndpointCache(input.endpointCacheSize ?? 1000),
4041
endpointDiscoveryEnabled:
4142
input.endpointDiscoveryEnabled !== undefined

packages/middleware-endpoint-discovery/src/updateDiscoveredEndpointInCache.spec.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,20 @@ describe(updateDiscoveredEndpointInCache.name, () => {
88
const mockGet = jest.fn();
99
const mockSet = jest.fn();
1010
const mockDelete = jest.fn();
11-
const mockSend = jest.fn();
1211

13-
const mockEndpoints = [{ Address: "mockAddress", CachePeriodInMinutes: 1 }];
12+
const mockHandler = jest.fn();
13+
const mockResolveMiddleware = jest.fn().mockReturnValue(mockHandler);
14+
15+
const mockEndpoints = [{ Address: "mockAddress", CachePeriodInMinutes: 2 }];
1416
const placeholderEndpoints = [{ Address: "", CachePeriodInMinutes: 1 }];
1517

1618
const config = {
17-
client: {
18-
send: mockSend,
19-
config: {},
20-
},
2119
endpointCache: { get: mockGet, set: mockSet, delete: mockDelete },
2220
};
2321

2422
const options = {
2523
commandName: "ExampleCommand",
26-
endpointDiscoveryCommandCtor: jest.fn(),
24+
endpointDiscoveryCommandCtor: jest.fn().mockReturnValue({ resolveMiddleware: mockResolveMiddleware }),
2725
isDiscoveredEndpointRequired: false,
2826
identifiers: { key: "value" },
2927
};
@@ -84,11 +82,11 @@ describe(updateDiscoveredEndpointInCache.name, () => {
8482
Operation: options.commandName.substr(0, options.commandName.length - 7),
8583
Identifiers: options.identifiers,
8684
});
87-
expect(mockSend).toHaveBeenCalledTimes(1);
85+
expect(mockHandler).toHaveBeenCalledTimes(1);
8886
};
8987

9088
it("on successful call: updates cache", async () => {
91-
mockSend.mockResolvedValueOnce({ Endpoints: mockEndpoints });
89+
mockHandler.mockResolvedValueOnce({ output: { Endpoints: mockEndpoints } });
9290

9391
// @ts-ignore
9492
await updateDiscoveredEndpointInCache(config, options);
@@ -103,7 +101,7 @@ describe(updateDiscoveredEndpointInCache.name, () => {
103101
describe("on error", () => {
104102
it(`throws if isDiscoveredEndpointRequired=true`, async () => {
105103
const error = new Error("rejected");
106-
mockSend.mockRejectedValueOnce(error);
104+
mockHandler.mockRejectedValueOnce(error);
107105

108106
try {
109107
// @ts-ignore
@@ -128,7 +126,7 @@ describe(updateDiscoveredEndpointInCache.name, () => {
128126

129127
it(`sets placeholder enpoint if isDiscoveredEndpointRequired=false`, async () => {
130128
const error = new Error("rejected");
131-
mockSend.mockRejectedValueOnce(error);
129+
mockHandler.mockRejectedValueOnce(error);
132130

133131
// @ts-ignore
134132
await updateDiscoveredEndpointInCache(config, options);
@@ -150,7 +148,7 @@ describe(updateDiscoveredEndpointInCache.name, () => {
150148

151149
it(`InvalidEndpointException`, async () => {
152150
const error = Object.assign(new Error("Invalid endpoint!"), { name: "InvalidEndpointException" });
153-
mockSend.mockRejectedValueOnce(error);
151+
mockHandler.mockRejectedValueOnce(error);
154152

155153
// @ts-ignore
156154
await updateDiscoveredEndpointInCache(config, options);
@@ -160,7 +158,7 @@ describe(updateDiscoveredEndpointInCache.name, () => {
160158

161159
it(`Status code: 421`, async () => {
162160
const error = Object.assign(new Error("Invalid endpoint!"), { $metadata: { httpStatusCode: 421 } });
163-
mockSend.mockRejectedValueOnce(error);
161+
mockHandler.mockRejectedValueOnce(error);
164162

165163
// @ts-ignore
166164
await updateDiscoveredEndpointInCache(config, options);

packages/middleware-endpoint-discovery/src/updateDiscoveredEndpointInCache.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const updateDiscoveredEndpointInCache = async (
1515
config: EndpointDiscoveryResolvedConfig,
1616
options: updateDiscoveredEndpointInCacheOptions
1717
) => {
18-
const { client, endpointCache } = config;
18+
const { endpointCache } = config;
1919
const { commandName, identifiers } = options;
2020
const cacheKey = await getCacheKey(commandName, config, { identifiers });
2121

@@ -41,8 +41,9 @@ export const updateDiscoveredEndpointInCache = async (
4141
Operation: commandName.substr(0, commandName.length - 7), // strip "Command"
4242
Identifiers: identifiers,
4343
});
44-
const { Endpoints } = await client?.send(command);
45-
endpointCache.set(cacheKey, Endpoints);
44+
const handler = command.resolveMiddleware(options.clientStack, config, options.options);
45+
const result = await handler(command);
46+
endpointCache.set(cacheKey, result.output.Endpoints);
4647
} catch (error) {
4748
if (error.name === "InvalidEndpointException" || error.$metadata?.httpStatusCode === 421) {
4849
// Endpoint is invalid, delete the cache entry.

0 commit comments

Comments
 (0)