Skip to content

Commit 23bd1fc

Browse files
committed
fix: change plugin interface to callback functions mutating the stack
1 parent 8dc2d59 commit 23bd1fc

File tree

9 files changed

+49
-133
lines changed

9 files changed

+49
-133
lines changed

clients/node/client-rds-data-node/RDSDataClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ export class RDSDataClient extends SmithyClient<HttpOptions, InputTypesUnion, Ou
2222
...RDSRuntimeConfiguration,
2323
...configuration
2424
});
25-
super(intermediaConfig_0);
2625
let intermediaConfig_1 = RegionConfiguration.resolve(intermediaConfig_0);
2726
let intermediaConfig_2 = AwsAuthConfiguration.resolve(intermediaConfig_1);
2827
let intermediaConfig_3 = EndpointsConfig.resolve(intermediaConfig_2);
2928
let intermediaConfig_4 = RetryConfig.resolve(intermediaConfig_3);
3029
let intermediaConfig_5 = UserAgentConfig.resolve(intermediaConfig_4);
30+
super(intermediaConfig_0);
3131
this.config = intermediaConfig_5;
3232
super.use(contentLengthPlugin(this.config));
3333
super.use(retryPlugin(this.config));

packages/middleware-content-length/src/index.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,9 @@ export function contentLengthMiddleware(
4646

4747
export const contentLengthPlugin = (options: {
4848
bodyLengthChecker: BodyLengthCalculator;
49-
}): Injectable<any, any> => ({
50-
injectedMiddleware: [
51-
{
52-
middleware: contentLengthMiddleware(options.bodyLengthChecker),
53-
step: "build",
54-
tags: { SET_CONTENT_LENGTH: true }
55-
}
56-
]
57-
});
49+
}): Injectable<any, any> => clientStack => {
50+
clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), {
51+
step: "build",
52+
tags: { SET_CONTENT_LENGTH: true }
53+
});
54+
};

packages/middleware-serde/src/serdePlugin.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {
33
ResponseDeserializer,
44
Injectable,
55
Protocol,
6-
MetadataBearer
6+
MetadataBearer,
7+
MiddlewareStack
78
} from "@aws-sdk/types";
89
import { deserializerMiddleware } from "./deserializerMiddleware";
910
import { serializerMiddleware } from "./serializerMiddleware";
@@ -19,18 +20,14 @@ export function serdePlugin<
1920
serializer: RequestSerializer<any, SerializerRuntimeUtils>,
2021
deserializer: ResponseDeserializer<OutputType, any, DeserializerRuntimeUtils>
2122
): Injectable<InputType, OutputType> {
22-
return {
23-
injectedMiddleware: [
24-
{
25-
middleware: deserializerMiddleware(config, deserializer),
26-
step: "deserialize",
27-
tags: { DESERIALIZER: true }
28-
},
29-
{
30-
middleware: serializerMiddleware(config, serializer),
31-
step: "serialize",
32-
tags: { SERIALIZER: true }
33-
}
34-
]
23+
return (commandStack: MiddlewareStack<InputType, OutputType>) => {
24+
commandStack.add(deserializerMiddleware(config, deserializer), {
25+
step: "deserialize",
26+
tags: { DESERIALIZER: true }
27+
});
28+
commandStack.add(serializerMiddleware(config, serializer), {
29+
step: "serialize",
30+
tags: { SERIALIZER: true }
31+
});
3532
};
3633
}

packages/middleware-user-agent/src/middleware.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { UserAgentConfig } from "./configurations";
1010

1111
const userAgentHeader = "User-Agent";
1212

13-
export function UserAgentMiddleware(options: UserAgentConfig.Resolved) {
13+
export function userAgentMiddleware(options: UserAgentConfig.Resolved) {
1414
return <Output extends MetadataBearer>(
1515
next: BuildHandler<any, any>
1616
): BuildHandler<any, any> => (
@@ -35,13 +35,10 @@ export function UserAgentMiddleware(options: UserAgentConfig.Resolved) {
3535
}
3636

3737
export const userAgentPlugin = (
38-
options: UserAgentConfig.Resolved
39-
): Injectable<any, any> => ({
40-
injectedMiddleware: [
41-
{
42-
middleware: UserAgentMiddleware(options),
43-
step: "build",
44-
tags: { SET_USER_AGENT: true }
45-
}
46-
]
47-
});
38+
config: UserAgentConfig.Resolved
39+
): Injectable<any, any> => clientStack => {
40+
clientStack.add(userAgentMiddleware(config), {
41+
step: "build",
42+
tags: { SET_USER_AGENT: true }
43+
});
44+
};

packages/retry-middleware/src/retryMiddleware.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,11 @@ export function retryMiddleware(options: RetryConfig.Resolved) {
1919

2020
export const retryPlugin = (
2121
options: RetryConfig.Resolved
22-
): Injectable<any, any> => ({
23-
injectedMiddleware:
24-
options.maxRetries > 0
25-
? [
26-
{
27-
middleware: retryMiddleware(options),
28-
step: "finalizeRequest",
29-
tags: { RETRY: true }
30-
}
31-
]
32-
: []
33-
});
22+
): Injectable<any, any> => clientStack => {
23+
if (options.maxRetries > 0) {
24+
clientStack.add(retryMiddleware(options), {
25+
step: "finalizeRequest",
26+
tags: { RETRY: true }
27+
});
28+
}
29+
};

packages/signing-middleware/src/middleware.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,9 @@ export function signingMiddleware<Input extends object, Output extends object>(
2727

2828
export const signingPlugin = (
2929
options: AwsAuthConfiguration.Resolved
30-
): Injectable<any, any> => ({
31-
injectedMiddleware: [
32-
{
33-
middleware: signingMiddleware(options),
34-
step: "finalizeRequest",
35-
tags: { SIGNATURE: true }
36-
}
37-
]
38-
});
30+
): Injectable<any, any> => clientStack => {
31+
clientStack.add(signingMiddleware(options), {
32+
step: "finalizeRequest",
33+
tags: { SIGNATURE: true }
34+
});
35+
};

packages/smithy-client/src/client.ts

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { MiddlewareStack } from "@aws-sdk/middleware-stack";
2-
import {
3-
Protocol,
4-
Command,
5-
MetadataBearer,
6-
Injectable,
7-
HandlerOptions as InjectOptions
8-
} from "@aws-sdk/types";
2+
import { Protocol, Command, MetadataBearer, Injectable } from "@aws-sdk/types";
93

104
export interface SmithyConfiguration<HandlerOptions> {
115
protocol: Protocol<any, any, HandlerOptions>;
@@ -25,21 +19,8 @@ export class Client<
2519
constructor(config: SmithyConfiguration<HandlerOptions>) {
2620
this.config = config;
2721
}
28-
use(
29-
injectable: Injectable<ClientInput, ClientOutput>,
30-
injectableOverrider?: (options: InjectOptions) => InjectOptions
31-
) {
32-
if (injectable.toRemove && injectable.toRemove.length > 0) {
33-
for (const toRemove of injectable.toRemove)
34-
this.middlewareStack.remove(toRemove);
35-
}
36-
for (const { middleware, ...options } of injectable.injectedMiddleware) {
37-
this.middlewareStack.add(
38-
// @ts-ignore -- Middleware and option type matching safety is enforced by InjectableMiddleware types
39-
middleware,
40-
injectableOverrider ? injectableOverrider(options) : options
41-
);
42-
}
22+
use(injectable: Injectable<ClientInput, ClientOutput>) {
23+
injectable(this.middlewareStack);
4324
}
4425
send<InputType extends ClientInput, OutputType extends ClientOutput>(
4526
command: Command<

packages/smithy-client/src/command.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,7 @@ import { Injectable, HandlerOptions as InjectOptions } from "@aws-sdk/types";
33

44
export class Command<InputType extends object, OutputType extends object> {
55
readonly middlewareStack = new MiddlewareStack<InputType, OutputType>();
6-
use(
7-
injectable: Injectable<InputType, OutputType>,
8-
injectableOverrider?: (options: InjectOptions) => InjectOptions
9-
) {
10-
if (injectable.toRemove && injectable.toRemove.length > 0) {
11-
for (const toRemove of injectable.toRemove)
12-
this.middlewareStack.remove(toRemove);
13-
}
14-
for (const { middleware, ...options } of injectable.injectedMiddleware) {
15-
this.middlewareStack.add(
16-
// @ts-ignore -- Middleware and option type matching safety is enforced by InjectableMiddleware types
17-
middleware,
18-
injectableOverrider ? injectableOverrider(options) : options
19-
);
20-
}
6+
use(injectable: Injectable<InputType, OutputType>) {
7+
injectable(this.middlewareStack);
218
}
229
}

packages/types/src/middleware.ts

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -366,47 +366,11 @@ export interface HandlerExecutionContext {
366366
logger: Logger;
367367
}
368368

369-
export type InjectableMiddleware<
370-
Input extends object = any,
371-
Output extends object = any
372-
> =
373-
| {
374-
middleware: Middleware<Input, Output>;
375-
step: "initialize";
376-
priority?: number;
377-
tags?: { [tag: string]: any };
378-
}
379-
| {
380-
middleware: SerializeMiddleware<Input, Output>;
381-
step: "serialize";
382-
priority?: number;
383-
tags?: { [tag: string]: any };
384-
}
385-
| {
386-
middleware: FinalizeRequestMiddleware<Input, Output>;
387-
step: "build";
388-
priority?: number;
389-
tags?: { [tag: string]: any };
390-
}
391-
| {
392-
middleware: FinalizeRequestMiddleware<Input, Output>;
393-
step: "finalizeRequest";
394-
priority?: number;
395-
tags?: { [tag: string]: any };
396-
}
397-
| {
398-
middleware: DeserializeMiddleware<Input, Output>;
399-
step: "deserialize";
400-
priority?: number;
401-
tags?: { [tag: string]: any };
402-
};
403-
404369
export interface Injectable<Input extends object, Output extends object> {
405-
/* middleware to be injected to the middleware stack */
406-
injectedMiddleware: Array<InjectableMiddleware>;
407370
/**
408-
* filter function that would apply to existing middleware stack. You can
409-
* remove the middleware by reference or the tag name.
371+
* A function that mutate the passed in middleware stack. Functions implementing
372+
* this interface can add, remove, modify existing middleware stack from clients
373+
* or commands
410374
*/
411-
toRemove?: Array<Middleware<Input, Output> | string>;
375+
(stack: MiddlewareStack<Input, Output>): void;
412376
}

0 commit comments

Comments
 (0)