From 729da3925def28d088c31f905ca99c14e2bdf604 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 11 Jan 2023 14:53:34 +0100 Subject: [PATCH 1/2] refactor: add middy-like types to commons --- packages/commons/src/index.ts | 3 +- .../commons/src/utils/middleware/middy.ts | 33 +++++++++++++++++++ packages/logger/src/middleware/middy.ts | 9 +++-- packages/metrics/src/middleware/middy.ts | 9 +++-- packages/tracer/src/middleware/middy.ts | 11 ++++--- 5 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 packages/commons/src/utils/middleware/middy.ts diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index f921ac63a6..15d78a2323 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -2,4 +2,5 @@ export * from './utils/lambda'; export * from './Utility'; export * from './config'; export * as ContextExamples from './samples/resources/contexts'; -export * as Events from './samples/resources/events'; \ No newline at end of file +export * as Events from './samples/resources/events'; +export * from './utils/middleware/middy'; \ No newline at end of file diff --git a/packages/commons/src/utils/middleware/middy.ts b/packages/commons/src/utils/middleware/middy.ts new file mode 100644 index 0000000000..24df7df8f6 --- /dev/null +++ b/packages/commons/src/utils/middleware/middy.ts @@ -0,0 +1,33 @@ +import { Context } from 'aws-lambda'; + +/** + * We need to define these types and interfaces here because we can't import them from @middy/core. + * Importing them from @middy/core would introduce a dependency on @middy/core, which we don't want + * because we want to keep it as an optional dependency. Those users who don't use the Powertools middleware + * and use `tsc` to compile their code will get an error if we import from @middy/core, see #1068. + * Given that we use a subset of the @middy/core types, we can define them here and avoid the dependency. + */ +interface Request { + event: TEvent + context: TContext + response: TResult | null + error: TErr | null + internal: { + [key: string]: unknown + } +} + +declare type MiddlewareFn = (request: Request) => unknown; + +export interface MiddlewareLikeObj { + before?: MiddlewareFn + after?: MiddlewareFn + onError?: MiddlewareFn +} + +export interface MiddyLikeRequest { + event: unknown + context: Context + response: unknown | null + error: Error | null +} \ No newline at end of file diff --git a/packages/logger/src/middleware/middy.ts b/packages/logger/src/middleware/middy.ts index 01f5409fc2..d0c622aaf5 100644 --- a/packages/logger/src/middleware/middy.ts +++ b/packages/logger/src/middleware/middy.ts @@ -1,6 +1,9 @@ import { Logger } from '../Logger'; -import type middy from '@middy/core'; import { HandlerOptions, LogAttributes } from '../types'; +import type { + MiddlewareLikeObj, + MiddyLikeRequest +} from '@aws-lambda-powertools/commons'; /** * A middy middleware that helps emitting CloudWatch EMF metrics in your logs. @@ -26,12 +29,12 @@ import { HandlerOptions, LogAttributes } from '../types'; * @param options - (_optional_) Options for the middleware * @returns - The middy middleware object */ -const injectLambdaContext = (target: Logger | Logger[], options?: HandlerOptions): middy.MiddlewareObj => { +const injectLambdaContext = (target: Logger | Logger[], options?: HandlerOptions): MiddlewareLikeObj => { const loggers = target instanceof Array ? target : [target]; const persistentAttributes: LogAttributes[] = []; - const injectLambdaContextBefore = async (request: middy.Request): Promise => { + const injectLambdaContextBefore = async (request: MiddyLikeRequest): Promise => { loggers.forEach((logger: Logger) => { if (options && options.clearState === true) { persistentAttributes.push({ ...logger.getPersistentLogAttributes() }); diff --git a/packages/metrics/src/middleware/middy.ts b/packages/metrics/src/middleware/middy.ts index 8f48824552..693c8a9094 100644 --- a/packages/metrics/src/middleware/middy.ts +++ b/packages/metrics/src/middleware/middy.ts @@ -1,6 +1,9 @@ import type { Metrics } from '../Metrics'; -import type middy from '@middy/core'; import type { ExtraOptions } from '../types'; +import type { + MiddlewareLikeObj, + MiddyLikeRequest +} from '@aws-lambda-powertools/commons'; /** * A middy middleware automating capture of metadata and annotations on segments or subsegments for a Lambda Handler. @@ -29,10 +32,10 @@ import type { ExtraOptions } from '../types'; * @param options - (_optional_) Options for the middleware * @returns middleware - The middy middleware object */ -const logMetrics = (target: Metrics | Metrics[], options: ExtraOptions = {}): middy.MiddlewareObj => { +const logMetrics = (target: Metrics | Metrics[], options: ExtraOptions = {}): MiddlewareLikeObj => { const metricsInstances = target instanceof Array ? target : [target]; - const logMetricsBefore = async (request: middy.Request): Promise => { + const logMetricsBefore = async (request: MiddyLikeRequest): Promise => { metricsInstances.forEach((metrics: Metrics) => { metrics.setFunctionName(request.context.functionName); const { throwOnEmptyMetrics, defaultDimensions, captureColdStartMetric } = options; diff --git a/packages/tracer/src/middleware/middy.ts b/packages/tracer/src/middleware/middy.ts index 7d4bcffb77..a5c8e81b6c 100644 --- a/packages/tracer/src/middleware/middy.ts +++ b/packages/tracer/src/middleware/middy.ts @@ -1,7 +1,10 @@ -import type middy from '@middy/core'; import type { Tracer } from '../Tracer'; import type { Segment, Subsegment } from 'aws-xray-sdk-core'; import type { CaptureLambdaHandlerOptions } from '../types'; +import type { + MiddlewareLikeObj, + MiddyLikeRequest +} from '@aws-lambda-powertools/commons'; /** * A middy middleware automating capture of metadata and annotations on segments or subsegments for a Lambda Handler. @@ -30,7 +33,7 @@ import type { CaptureLambdaHandlerOptions } from '../types'; * @param options - (_optional_) Options for the middleware * @returns middleware - The middy middleware object */ -const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOptions): middy.MiddlewareObj => { +const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOptions): MiddlewareLikeObj => { let lambdaSegment: Subsegment | Segment; const open = (): void => { @@ -53,7 +56,7 @@ const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOpti } }; - const captureLambdaHandlerAfter = async (request: middy.Request): Promise => { + const captureLambdaHandlerAfter = async (request: MiddyLikeRequest): Promise => { if (target.isTracingEnabled()) { if (options?.captureResponse ?? true) { target.addResponseAsMetadata(request.response, process.env._HANDLER); @@ -62,7 +65,7 @@ const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOpti } }; - const captureLambdaHandlerError = async (request: middy.Request): Promise => { + const captureLambdaHandlerError = async (request: MiddyLikeRequest): Promise => { if (target.isTracingEnabled()) { target.addErrorAsMetadata(request.error as Error); close(); From 180cc5425d975a44084d50818f1f062111efe988 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 11 Jan 2023 17:36:12 +0100 Subject: [PATCH 2/2] chore: changed to types & changed dir --- packages/commons/src/index.ts | 2 +- .../commons/src/{utils/middleware => types}/middy.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) rename packages/commons/src/{utils/middleware => types}/middy.ts (80%) diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 15d78a2323..ee40dcac9b 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -3,4 +3,4 @@ export * from './Utility'; export * from './config'; export * as ContextExamples from './samples/resources/contexts'; export * as Events from './samples/resources/events'; -export * from './utils/middleware/middy'; \ No newline at end of file +export * from './types/middy'; \ No newline at end of file diff --git a/packages/commons/src/utils/middleware/middy.ts b/packages/commons/src/types/middy.ts similarity index 80% rename from packages/commons/src/utils/middleware/middy.ts rename to packages/commons/src/types/middy.ts index 24df7df8f6..703e0915f2 100644 --- a/packages/commons/src/utils/middleware/middy.ts +++ b/packages/commons/src/types/middy.ts @@ -7,7 +7,7 @@ import { Context } from 'aws-lambda'; * and use `tsc` to compile their code will get an error if we import from @middy/core, see #1068. * Given that we use a subset of the @middy/core types, we can define them here and avoid the dependency. */ -interface Request { +type Request = { event: TEvent context: TContext response: TResult | null @@ -15,19 +15,19 @@ interface Request = (request: Request) => unknown; -export interface MiddlewareLikeObj { +export type MiddlewareLikeObj = { before?: MiddlewareFn after?: MiddlewareFn onError?: MiddlewareFn -} +}; -export interface MiddyLikeRequest { +export type MiddyLikeRequest = { event: unknown context: Context response: unknown | null error: Error | null -} \ No newline at end of file +}; \ No newline at end of file