@smithy/types
Version:
[](https://www.npmjs.com/package/@smithy/types) [](https://www.npmjs.com/package/@smithy/types)
535 lines (534 loc) • 19.9 kB
TypeScript
import { AuthScheme, HttpAuthDefinition } from "./auth/auth";
import { SelectedHttpAuthScheme } from "./auth/HttpAuthScheme";
import { Command } from "./command";
import { EndpointV2 } from "./endpoint";
import { SmithyFeatures } from "./feature-ids";
import { Logger } from "./logger";
import { UserAgent } from "./util";
/**
* @public
*/
export interface InitializeHandlerArguments<Input extends object> {
/**
* User input to a command. Reflects the userland representation of the
* union of data types the command can effectively handle.
*/
input: Input;
}
/**
* @public
*/
export interface InitializeHandlerOutput<Output extends object> extends DeserializeHandlerOutput<Output> {
output: Output;
}
/**
* @public
*/
export interface SerializeHandlerArguments<Input extends object> extends InitializeHandlerArguments<Input> {
/**
* The user input serialized as a request object. The request object is unknown,
* so you cannot modify it directly. When work with request, you need to guard its
* type to e.g. HttpRequest with 'instanceof' operand
*
* During the build phase of the execution of a middleware stack, a built
* request may or may not be available.
*/
request?: unknown;
}
/**
* @public
*/
export interface SerializeHandlerOutput<Output extends object> extends InitializeHandlerOutput<Output> {
}
/**
* @public
*/
export interface BuildHandlerArguments<Input extends object> extends FinalizeHandlerArguments<Input> {
}
/**
* @public
*/
export interface BuildHandlerOutput<Output extends object> extends InitializeHandlerOutput<Output> {
}
/**
* @public
*/
export interface FinalizeHandlerArguments<Input extends object> extends SerializeHandlerArguments<Input> {
/**
* The user input serialized as a request.
*/
request: unknown;
}
/**
* @public
*/
export interface FinalizeHandlerOutput<Output extends object> extends InitializeHandlerOutput<Output> {
}
/**
* @public
*/
export interface DeserializeHandlerArguments<Input extends object> extends FinalizeHandlerArguments<Input> {
}
/**
* @public
*/
export interface DeserializeHandlerOutput<Output extends object> {
/**
* The raw response object from runtime is deserialized to structured output object.
* The response object is unknown so you cannot modify it directly. When work with
* response, you need to guard its type to e.g. HttpResponse with 'instanceof' operand.
*
* During the deserialize phase of the execution of a middleware stack, a deserialized
* response may or may not be available
*/
response: unknown;
output?: Output;
}
/**
* @public
*/
export interface InitializeHandler<Input extends object, Output extends object> {
/**
* Asynchronously converts an input object into an output object.
*
* @param args - An object containing a input to the command as well as any
* associated or previously generated execution artifacts.
*/
(args: InitializeHandlerArguments<Input>): Promise<InitializeHandlerOutput<Output>>;
}
/**
* @public
*/
export type Handler<Input extends object, Output extends object> = InitializeHandler<Input, Output>;
/**
* @public
*/
export interface SerializeHandler<Input extends object, Output extends object> {
/**
* Asynchronously converts an input object into an output object.
*
* @param args - An object containing a input to the command as well as any
* associated or previously generated execution artifacts.
*/
(args: SerializeHandlerArguments<Input>): Promise<SerializeHandlerOutput<Output>>;
}
/**
* @public
*/
export interface FinalizeHandler<Input extends object, Output extends object> {
/**
* Asynchronously converts an input object into an output object.
*
* @param args - An object containing a input to the command as well as any
* associated or previously generated execution artifacts.
*/
(args: FinalizeHandlerArguments<Input>): Promise<FinalizeHandlerOutput<Output>>;
}
/**
* @public
*/
export interface BuildHandler<Input extends object, Output extends object> {
(args: BuildHandlerArguments<Input>): Promise<BuildHandlerOutput<Output>>;
}
/**
* @public
*/
export interface DeserializeHandler<Input extends object, Output extends object> {
(args: DeserializeHandlerArguments<Input>): Promise<DeserializeHandlerOutput<Output>>;
}
/**
* @public
*
* A factory function that creates functions implementing the `Handler`
* interface.
*/
export interface InitializeMiddleware<Input extends object, Output extends object> {
/**
* @param next - The handler to invoke after this middleware has operated on
* the user input and before this middleware operates on the output.
*
* @param context - Invariant data and functions for use by the handler.
*/
(next: InitializeHandler<Input, Output>, context: HandlerExecutionContext): InitializeHandler<Input, Output>;
}
/**
* @public
*
* A factory function that creates functions implementing the `BuildHandler`
* interface.
*/
export interface SerializeMiddleware<Input extends object, Output extends object> {
/**
* @param next - The handler to invoke after this middleware has operated on
* the user input and before this middleware operates on the output.
*
* @param context - Invariant data and functions for use by the handler.
*/
(next: SerializeHandler<Input, Output>, context: HandlerExecutionContext): SerializeHandler<Input, Output>;
}
/**
* @public
*
* A factory function that creates functions implementing the `FinalizeHandler`
* interface.
*/
export interface FinalizeRequestMiddleware<Input extends object, Output extends object> {
/**
* @param next - The handler to invoke after this middleware has operated on
* the user input and before this middleware operates on the output.
*
* @param context - Invariant data and functions for use by the handler.
*/
(next: FinalizeHandler<Input, Output>, context: HandlerExecutionContext): FinalizeHandler<Input, Output>;
}
/**
* @public
*/
export interface BuildMiddleware<Input extends object, Output extends object> {
(next: BuildHandler<Input, Output>, context: HandlerExecutionContext): BuildHandler<Input, Output>;
}
/**
* @public
*/
export interface DeserializeMiddleware<Input extends object, Output extends object> {
(next: DeserializeHandler<Input, Output>, context: HandlerExecutionContext): DeserializeHandler<Input, Output>;
}
/**
* @public
*/
export type MiddlewareType<Input extends object, Output extends object> = InitializeMiddleware<Input, Output> | SerializeMiddleware<Input, Output> | BuildMiddleware<Input, Output> | FinalizeRequestMiddleware<Input, Output> | DeserializeMiddleware<Input, Output>;
/**
* @public
*
* A factory function that creates the terminal handler atop which a middleware
* stack sits.
*/
export interface Terminalware {
<Input extends object, Output extends object>(context: HandlerExecutionContext): DeserializeHandler<Input, Output>;
}
/**
* @public
*/
export type Step = "initialize" | "serialize" | "build" | "finalizeRequest" | "deserialize";
/**
* @public
*/
export type Priority = "high" | "normal" | "low";
/**
* @public
*/
export interface HandlerOptions {
/**
* Handlers are ordered using a "step" that describes the stage of command
* execution at which the handler will be executed. The available steps are:
*
* - initialize: The input is being prepared. Examples of typical
* initialization tasks include injecting default options computing
* derived parameters.
* - serialize: The input is complete and ready to be serialized. Examples
* of typical serialization tasks include input validation and building
* an HTTP request from user input.
* - build: The input has been serialized into an HTTP request, but that
* request may require further modification. Any request alterations
* will be applied to all retries. Examples of typical build tasks
* include injecting HTTP headers that describe a stable aspect of the
* request, such as `Content-Length` or a body checksum.
* - finalizeRequest: The request is being prepared to be sent over the wire. The
* request in this stage should already be semantically complete and
* should therefore only be altered as match the recipient's
* expectations. Examples of typical finalization tasks include request
* signing and injecting hop-by-hop headers.
* - deserialize: The response has arrived, the middleware here will deserialize
* the raw response object to structured response
*
* Unlike initialization and build handlers, which are executed once
* per operation execution, finalization and deserialize handlers will be
* executed foreach HTTP request sent.
*
* @defaultValue 'initialize'
*/
step?: Step;
/**
* A list of strings to any that identify the general purpose or important
* characteristics of a given handler.
*/
tags?: Array<string>;
/**
* A unique name to refer to a middleware
*/
name?: string;
/**
* @internal
* Aliases allows for middleware to be found by multiple names besides {@link HandlerOptions.name}.
* This allows for references to replaced middleware to continue working, e.g. replacing
* multiple auth-specific middleware with a single generic auth middleware.
*/
aliases?: Array<string>;
/**
* A flag to override the existing middleware with the same name. Without
* setting it, adding middleware with duplicated name will throw an exception.
* @internal
*/
override?: boolean;
}
/**
* @public
*/
export interface AbsoluteLocation {
/**
* By default middleware will be added to individual step in un-guaranteed order.
* In the case that
*
* @defaultValue 'normal'
*/
priority?: Priority;
}
/**
* @public
*/
export type Relation = "before" | "after";
/**
* @public
*/
export interface RelativeLocation {
/**
* Specify the relation to be before or after a know middleware.
*/
relation: Relation;
/**
* A known middleware name to indicate inserting middleware's location.
*/
toMiddleware: string;
}
/**
* @public
*/
export type RelativeMiddlewareOptions = RelativeLocation & Pick<HandlerOptions, Exclude<keyof HandlerOptions, "step">>;
/**
* @public
*/
export interface InitializeHandlerOptions extends HandlerOptions {
step?: "initialize";
}
/**
* @public
*/
export interface SerializeHandlerOptions extends HandlerOptions {
step: "serialize";
}
/**
* @public
*/
export interface BuildHandlerOptions extends HandlerOptions {
step: "build";
}
/**
* @public
*/
export interface FinalizeRequestHandlerOptions extends HandlerOptions {
step: "finalizeRequest";
}
/**
* @public
*/
export interface DeserializeHandlerOptions extends HandlerOptions {
step: "deserialize";
}
/**
* @public
*
* A stack storing middleware. It can be resolved into a handler. It supports 2
* approaches for adding middleware:
* 1. Adding middleware to specific step with `add()`. The order of middleware
* added into same step is determined by order of adding them. If one middleware
* needs to be executed at the front of the step or at the end of step, set
* `priority` options to `high` or `low`.
* 2. Adding middleware to location relative to known middleware with `addRelativeTo()`.
* This is useful when given middleware must be executed before or after specific
* middleware(`toMiddleware`). You can add a middleware relatively to another
* middleware which also added relatively. But eventually, this relative middleware
* chain **must** be 'anchored' by a middleware that added using `add()` API
* with absolute `step` and `priority`. This mothod will throw if specified
* `toMiddleware` is not found.
*/
export interface MiddlewareStack<Input extends object, Output extends object> extends Pluggable<Input, Output> {
/**
* Add middleware to the stack to be executed during the "initialize" step,
* optionally specifying a priority, tags and name
*/
add(middleware: InitializeMiddleware<Input, Output>, options?: InitializeHandlerOptions & AbsoluteLocation): void;
/**
* Add middleware to the stack to be executed during the "serialize" step,
* optionally specifying a priority, tags and name
*/
add(middleware: SerializeMiddleware<Input, Output>, options: SerializeHandlerOptions & AbsoluteLocation): void;
/**
* Add middleware to the stack to be executed during the "build" step,
* optionally specifying a priority, tags and name
*/
add(middleware: BuildMiddleware<Input, Output>, options: BuildHandlerOptions & AbsoluteLocation): void;
/**
* Add middleware to the stack to be executed during the "finalizeRequest" step,
* optionally specifying a priority, tags and name
*/
add(middleware: FinalizeRequestMiddleware<Input, Output>, options: FinalizeRequestHandlerOptions & AbsoluteLocation): void;
/**
* Add middleware to the stack to be executed during the "deserialize" step,
* optionally specifying a priority, tags and name
*/
add(middleware: DeserializeMiddleware<Input, Output>, options: DeserializeHandlerOptions & AbsoluteLocation): void;
/**
* Add middleware to a stack position before or after a known middleware,optionally
* specifying name and tags.
*/
addRelativeTo(middleware: MiddlewareType<Input, Output>, options: RelativeMiddlewareOptions): void;
/**
* Apply a customization function to mutate the middleware stack, often
* used for customizations that requires mutating multiple middleware.
*/
use(pluggable: Pluggable<Input, Output>): void;
/**
* Create a shallow clone of this stack. Step bindings and handler priorities
* and tags are preserved in the copy.
*/
clone(): MiddlewareStack<Input, Output>;
/**
* Removes middleware from the stack.
*
* If a string is provided, it will be treated as middleware name. If a middleware
* is inserted with the given name, it will be removed.
*
* If a middleware class is provided, all usages thereof will be removed.
*/
remove(toRemove: MiddlewareType<Input, Output> | string): boolean;
/**
* Removes middleware that contains given tag
*
* Multiple middleware will potentially be removed
*/
removeByTag(toRemove: string): boolean;
/**
* Create a stack containing the middlewares in this stack as well as the
* middlewares in the `from` stack. Neither source is modified, and step
* bindings and handler priorities and tags are preserved in the copy.
*/
concat<InputType extends Input, OutputType extends Output>(from: MiddlewareStack<InputType, OutputType>): MiddlewareStack<InputType, OutputType>;
/**
* Returns a list of the current order of middleware in the stack.
* This does not execute the middleware functions, nor does it
* provide a reference to the stack itself.
*/
identify(): string[];
/**
* @internal
*
* When an operation is called using this stack,
* it will log its list of middleware to the console using
* the identify function.
*
* @param toggle - set whether to log on resolve.
* If no argument given, returns the current value.
*/
identifyOnResolve(toggle?: boolean): boolean;
/**
* Builds a single handler function from zero or more middleware classes and
* a core handler. The core handler is meant to send command objects to AWS
* services and return promises that will resolve with the operation result
* or be rejected with an error.
*
* When a composed handler is invoked, the arguments will pass through all
* middleware in a defined order, and the return from the innermost handler
* will pass through all middleware in the reverse of that order.
*/
resolve<InputType extends Input, OutputType extends Output>(handler: DeserializeHandler<InputType, OutputType>, context: HandlerExecutionContext): InitializeHandler<InputType, OutputType>;
}
/**
* @internal
*/
export declare const SMITHY_CONTEXT_KEY = "__smithy_context";
/**
* @public
*
* Data and helper objects that are not expected to change from one execution of
* a composed handler to another.
*/
export interface HandlerExecutionContext {
/**
* A logger that may be invoked by any handler during execution of an
* operation.
*/
logger?: Logger;
/**
* Name of the service the operation is being sent to.
*/
clientName?: string;
/**
* Name of the operation being executed.
*/
commandName?: string;
/**
* Additional user agent that inferred by middleware. It can be used to save
* the internal user agent sections without overriding the `customUserAgent`
* config in clients.
*/
userAgent?: UserAgent;
/**
* Resolved by the endpointMiddleware function of `@smithy/middleware-endpoint`
* in the serialization stage.
*/
endpointV2?: EndpointV2;
/**
* Set at the same time as endpointV2.
*/
authSchemes?: AuthScheme[];
/**
* The current auth configuration that has been set by any auth middleware and
* that will prevent from being set more than once.
*/
currentAuthConfig?: HttpAuthDefinition;
/**
* @deprecated do not extend this field, it is a carryover from AWS SDKs.
* Used by DynamoDbDocumentClient.
*/
dynamoDbDocumentClientOptions?: Partial<{
overrideInputFilterSensitiveLog(...args: any[]): string | void;
overrideOutputFilterSensitiveLog(...args: any[]): string | void;
}>;
/**
* @internal
* Context for Smithy properties.
*/
[SMITHY_CONTEXT_KEY]?: {
service?: string;
operation?: string;
commandInstance?: Command<any, any, any, any, any>;
selectedHttpAuthScheme?: SelectedHttpAuthScheme;
features?: SmithyFeatures;
/**
* @deprecated
* Do not assign arbitrary members to the Smithy Context,
* fields should be explicitly declared here to avoid collisions.
*/
[key: string]: unknown;
};
/**
* @deprecated
* Do not assign arbitrary members to the context, since
* they can interfere with existing functionality.
*
* Additional members should instead be declared on the SMITHY_CONTEXT_KEY
* or other reserved keys.
*/
[key: string]: any;
}
/**
* @public
*/
export interface Pluggable<Input extends object, Output extends object> {
/**
* A function that mutate the passed in middleware stack. Functions implementing
* this interface can add, remove, modify existing middleware stack from clients
* or commands
*/
applyToStack: (stack: MiddlewareStack<Input, Output>) => void;
}