Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(idempotency): makeHandlerIdempotent middy middleware #1474

Merged
merged 7 commits into from
Jun 5, 2023

Conversation

dreamorosi
Copy link
Contributor

Description of your changes

This PR introduces a new Middy middleware that allows to wrap a Lambda handler and make it idempotent.

The middleware can be used like this:

import {
  makeHandlerIdempotent,
  DynamoDBPersistenceLayer,
} from '@aws-lambda-powertools/idempotency';
import middy from '@middy/core';

const dynamoDBPersistenceLayer = new DynamoDBPersistenceLayer({
  tableName: 'idempotencyTable',
});

const lambdaHandler = async (_event: unknown, _context: unknown) => {
  //...
};

export const handler = middy(lambdaHandler)
  .use(makeHandlerIdempotent({ persistenceStore: dynamoDBPersistenceLayer }));

Implementation details

The first detail to notice is that contrary to the function wrapper and the class method decorator, this middleware doesn't leverage fully the IdempotencyHandler class. The reason for this is that Middy has a specific lifecycle when it comes to logic running before, after, and in case of error thrown by the handler. The current implementation of the IdempotencyHandler groups certain actions together and expects certain signatures and a class instantiation and as such it's not possible for the middleware to use the same method all the time.

As a result, the middleware interacts with the persistence store directly and is in charge of handling/throwing the errors. This allows the middleware to follow its own patterns, however moving forward we will need to make sure we keep the two implementations in sync.

Related issues, RFCs

Issue number: #1293

Checklist

  • My changes meet the tenets criteria
  • I have performed a self-review of my own code
  • I have commented my code where necessary, particularly in areas that should be flagged with a TODO, or hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my change is effective and works
  • The PR title follows the conventional commit semantics

Breaking change checklist

Is it a breaking change?: NO

  • I have documented the migration process
  • I have added, implemented necessary warnings (if it can live side by side)

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.

@dreamorosi dreamorosi self-assigned this May 24, 2023
@dreamorosi dreamorosi linked an issue May 24, 2023 that may be closed by this pull request
2 tasks
@pull-request-size pull-request-size bot added the size/L PRs between 100-499 LOC label May 24, 2023
@boring-cyborg boring-cyborg bot added idempotency This item relates to the Idempotency Utility tests PRs that add or change tests labels May 24, 2023
@github-actions github-actions bot added the feature PRs that introduce new features or minor changes label May 24, 2023
@dreamorosi dreamorosi requested a review from am29d May 24, 2023 16:19
@pull-request-size pull-request-size bot added size/XL PRs between 500-999 LOC, often PRs that grown with feedback and removed size/L PRs between 100-499 LOC labels Jun 1, 2023
@am29d am29d merged commit a558f10 into main Jun 5, 2023
@am29d am29d deleted the 1293-idempotency-middy-middleware branch June 5, 2023 14:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature PRs that introduce new features or minor changes idempotency This item relates to the Idempotency Utility size/XL PRs between 500-999 LOC, often PRs that grown with feedback tests PRs that add or change tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature request: idempotency Middy middleware
2 participants