Skip to content

Commit 729da39

Browse files
committed
refactor: add middy-like types to commons
1 parent 3751f31 commit 729da39

File tree

5 files changed

+54
-11
lines changed

5 files changed

+54
-11
lines changed

Diff for: packages/commons/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export * from './utils/lambda';
22
export * from './Utility';
33
export * from './config';
44
export * as ContextExamples from './samples/resources/contexts';
5-
export * as Events from './samples/resources/events';
5+
export * as Events from './samples/resources/events';
6+
export * from './utils/middleware/middy';

Diff for: packages/commons/src/utils/middleware/middy.ts

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Context } from 'aws-lambda';
2+
3+
/**
4+
* We need to define these types and interfaces here because we can't import them from @middy/core.
5+
* Importing them from @middy/core would introduce a dependency on @middy/core, which we don't want
6+
* because we want to keep it as an optional dependency. Those users who don't use the Powertools middleware
7+
* and use `tsc` to compile their code will get an error if we import from @middy/core, see #1068.
8+
* Given that we use a subset of the @middy/core types, we can define them here and avoid the dependency.
9+
*/
10+
interface Request<TEvent = unknown, TResult = unknown, TErr = Error, TContext extends Context = Context> {
11+
event: TEvent
12+
context: TContext
13+
response: TResult | null
14+
error: TErr | null
15+
internal: {
16+
[key: string]: unknown
17+
}
18+
}
19+
20+
declare type MiddlewareFn<TEvent = unknown, TResult = unknown, TErr = Error, TContext extends Context = Context> = (request: Request<TEvent, TResult, TErr, TContext>) => unknown;
21+
22+
export interface MiddlewareLikeObj<TEvent = unknown, TResult = unknown, TErr = Error, TContext extends Context = Context> {
23+
before?: MiddlewareFn<TEvent, TResult, TErr, TContext>
24+
after?: MiddlewareFn<TEvent, TResult, TErr, TContext>
25+
onError?: MiddlewareFn<TEvent, TResult, TErr, TContext>
26+
}
27+
28+
export interface MiddyLikeRequest {
29+
event: unknown
30+
context: Context
31+
response: unknown | null
32+
error: Error | null
33+
}

Diff for: packages/logger/src/middleware/middy.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { Logger } from '../Logger';
2-
import type middy from '@middy/core';
32
import { HandlerOptions, LogAttributes } from '../types';
3+
import type {
4+
MiddlewareLikeObj,
5+
MiddyLikeRequest
6+
} from '@aws-lambda-powertools/commons';
47

58
/**
69
* A middy middleware that helps emitting CloudWatch EMF metrics in your logs.
@@ -26,12 +29,12 @@ import { HandlerOptions, LogAttributes } from '../types';
2629
* @param options - (_optional_) Options for the middleware
2730
* @returns - The middy middleware object
2831
*/
29-
const injectLambdaContext = (target: Logger | Logger[], options?: HandlerOptions): middy.MiddlewareObj => {
32+
const injectLambdaContext = (target: Logger | Logger[], options?: HandlerOptions): MiddlewareLikeObj => {
3033

3134
const loggers = target instanceof Array ? target : [target];
3235
const persistentAttributes: LogAttributes[] = [];
3336

34-
const injectLambdaContextBefore = async (request: middy.Request): Promise<void> => {
37+
const injectLambdaContextBefore = async (request: MiddyLikeRequest): Promise<void> => {
3538
loggers.forEach((logger: Logger) => {
3639
if (options && options.clearState === true) {
3740
persistentAttributes.push({ ...logger.getPersistentLogAttributes() });

Diff for: packages/metrics/src/middleware/middy.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import type { Metrics } from '../Metrics';
2-
import type middy from '@middy/core';
32
import type { ExtraOptions } from '../types';
3+
import type {
4+
MiddlewareLikeObj,
5+
MiddyLikeRequest
6+
} from '@aws-lambda-powertools/commons';
47

58
/**
69
* 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';
2932
* @param options - (_optional_) Options for the middleware
3033
* @returns middleware - The middy middleware object
3134
*/
32-
const logMetrics = (target: Metrics | Metrics[], options: ExtraOptions = {}): middy.MiddlewareObj => {
35+
const logMetrics = (target: Metrics | Metrics[], options: ExtraOptions = {}): MiddlewareLikeObj => {
3336
const metricsInstances = target instanceof Array ? target : [target];
3437

35-
const logMetricsBefore = async (request: middy.Request): Promise<void> => {
38+
const logMetricsBefore = async (request: MiddyLikeRequest): Promise<void> => {
3639
metricsInstances.forEach((metrics: Metrics) => {
3740
metrics.setFunctionName(request.context.functionName);
3841
const { throwOnEmptyMetrics, defaultDimensions, captureColdStartMetric } = options;

Diff for: packages/tracer/src/middleware/middy.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import type middy from '@middy/core';
21
import type { Tracer } from '../Tracer';
32
import type { Segment, Subsegment } from 'aws-xray-sdk-core';
43
import type { CaptureLambdaHandlerOptions } from '../types';
4+
import type {
5+
MiddlewareLikeObj,
6+
MiddyLikeRequest
7+
} from '@aws-lambda-powertools/commons';
58

69
/**
710
* 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';
3033
* @param options - (_optional_) Options for the middleware
3134
* @returns middleware - The middy middleware object
3235
*/
33-
const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOptions): middy.MiddlewareObj => {
36+
const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOptions): MiddlewareLikeObj => {
3437
let lambdaSegment: Subsegment | Segment;
3538

3639
const open = (): void => {
@@ -53,7 +56,7 @@ const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOpti
5356
}
5457
};
5558

56-
const captureLambdaHandlerAfter = async (request: middy.Request): Promise<void> => {
59+
const captureLambdaHandlerAfter = async (request: MiddyLikeRequest): Promise<void> => {
5760
if (target.isTracingEnabled()) {
5861
if (options?.captureResponse ?? true) {
5962
target.addResponseAsMetadata(request.response, process.env._HANDLER);
@@ -62,7 +65,7 @@ const captureLambdaHandler = (target: Tracer, options?: CaptureLambdaHandlerOpti
6265
}
6366
};
6467

65-
const captureLambdaHandlerError = async (request: middy.Request): Promise<void> => {
68+
const captureLambdaHandlerError = async (request: MiddyLikeRequest): Promise<void> => {
6669
if (target.isTracingEnabled()) {
6770
target.addErrorAsMetadata(request.error as Error);
6871
close();

0 commit comments

Comments
 (0)