diff --git a/AwsLambda.Host.sln b/AwsLambda.Host.sln index 41754316..fda38577 100644 --- a/AwsLambda.Host.sln +++ b/AwsLambda.Host.sln @@ -43,6 +43,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AwsLambda.Host.Example.Events", "examples\AwsLambda.Host.Example.Events\AwsLambda.Host.Example.Events.csproj", "{BA1CA0FB-A0C8-429B-9709-EDEEA4C187B9}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Envelopes", "Envelopes", "{1C3C52D9-2936-4A0C-A9C8-F330F22B8359}" + ProjectSection(SolutionItems) = preProject + src\Envelopes\README.md = src\Envelopes\README.md + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AwsLambda.Host.Envelopes.Sqs", "src\Envelopes\AwsLambda.Host.Envelopes.Sqs\AwsLambda.Host.Envelopes.Sqs.csproj", "{8E3037D3-BEB0-4A0B-A09A-CF31F50D0508}" EndProject diff --git a/src/AwsLambda.Host.Abstractions/Options/EnvelopeOptions.cs b/src/AwsLambda.Host.Abstractions/Options/EnvelopeOptions.cs index d40dee6d..fa7a8413 100644 --- a/src/AwsLambda.Host.Abstractions/Options/EnvelopeOptions.cs +++ b/src/AwsLambda.Host.Abstractions/Options/EnvelopeOptions.cs @@ -1,25 +1,55 @@ using System.Text.Json; +using System.Xml; using AwsLambda.Host.Envelopes; namespace AwsLambda.Host.Options; /// Options for configuring envelope payload serialization and deserialization. +/// +/// These options are used by implementations of and +/// to control how Lambda event payloads are processed. +/// +/// +/// public class EnvelopeOptions { + /// + /// Gets or sets a dictionary for storing custom extension data associated with envelope + /// processing. + /// + /// + /// + /// This dictionary allows envelope implementations to store and access custom context or + /// configuration data that may be needed during serialization or deserialization. + /// + /// Default is an empty dictionary. + /// + public Dictionary Items { get; set; } = new(); + /// /// Gets or sets the JSON serialization options used when extracting and packing Lambda event /// payloads. /// /// /// - /// These options are passed to implementations of and - /// to control how payloads are serialized and deserialized. - /// Custom converters, naming policies, and other JSON serialization settings can be configured - /// here. + /// Custom converters, naming policies, and other JSON serialization settings can be + /// configured here. /// /// Default is an empty instance. /// - /// - /// public JsonSerializerOptions JsonOptions { get; set; } = new(); + + /// Gets or sets the XML reader settings used when deserializing Lambda event payloads. + /// + /// Options include DTD processing, whitespace handling, and conformance level. + /// Default is a new instance. + /// + public XmlReaderSettings XmlReaderSettings { get; set; } = new(); + + /// Gets or sets the XML writer settings used when serializing Lambda event payloads. + /// + /// Options include indentation, encoding, and XML declaration behavior. + /// Default is a new instance. + /// + public XmlWriterSettings XmlWriterSettings { get; set; } = new(); } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelope.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelope.cs index 4d0d195f..c8a4532c 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelope.cs +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelope.cs @@ -1,23 +1,18 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using Amazon.Lambda.APIGatewayEvents; using AwsLambda.Host.Options; namespace AwsLambda.Host.Envelopes.ApiGateway; -/// +/// /// -/// This class extends -/// and adds a strongly typed property for easier serialization and -/// deserialization of request payloads. +/// Provides the default implementation for deserializing request payloads using +/// with the configured +/// . /// -public class ApiGatewayRequestEnvelope : APIGatewayProxyRequest, IRequestEnvelope +public sealed class ApiGatewayRequestEnvelope : ApiGatewayRequestEnvelopeBase { - /// The deserialized content of the - [JsonIgnore] - public T? BodyContent { get; set; } - - /// - public void ExtractPayload(EnvelopeOptions options) => + /// + /// This implementation deserializes the request body from JSON. + public override void ExtractPayload(EnvelopeOptions options) => BodyContent = JsonSerializer.Deserialize(Body, options.JsonOptions); } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelopeBase.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelopeBase.cs new file mode 100644 index 00000000..28eeeab4 --- /dev/null +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayRequestEnvelopeBase.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; +using Amazon.Lambda.APIGatewayEvents; +using AwsLambda.Host.Options; + +namespace AwsLambda.Host.Envelopes.ApiGateway; + +/// +/// +/// This abstract class extends +/// and provides a foundation +/// for strongly typed request handling. Derived classes implement to +/// deserialize the request body into a strongly typed property using +/// their chosen deserialization strategy. +/// +public abstract class ApiGatewayRequestEnvelopeBase : APIGatewayProxyRequest, IRequestEnvelope +{ + /// The deserialized content of the + [JsonIgnore] + public T? BodyContent { get; set; } + + /// + public abstract void ExtractPayload(EnvelopeOptions options); +} diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelope.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelope.cs index db0d33b9..a9f19929 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelope.cs +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelope.cs @@ -1,23 +1,18 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using Amazon.Lambda.APIGatewayEvents; using AwsLambda.Host.Options; namespace AwsLambda.Host.Envelopes.ApiGateway; -/// +/// /// -/// This class extends -/// and adds a strongly typed property for easier serialization and -/// deserialization of response payloads. +/// Provides the default implementation for serializing response payloads using +/// with the configured +/// . /// -public class ApiGatewayResponseEnvelope : APIGatewayProxyResponse, IResponseEnvelope +public sealed class ApiGatewayResponseEnvelope : ApiGatewayResponseEnvelopeBase { - /// The deserialized content of the - [JsonIgnore] - public T? BodyContent { get; set; } - - /// - public void PackPayload(EnvelopeOptions options) => + /// + /// This implementation serializes the response body to JSON. + public override void PackPayload(EnvelopeOptions options) => Body = JsonSerializer.Serialize(BodyContent, options.JsonOptions); } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelopeBase.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelopeBase.cs new file mode 100644 index 00000000..69f64f99 --- /dev/null +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayResponseEnvelopeBase.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; +using Amazon.Lambda.APIGatewayEvents; +using AwsLambda.Host.Options; + +namespace AwsLambda.Host.Envelopes.ApiGateway; + +/// +/// +/// This abstract class extends +/// and provides a foundation +/// for strongly typed response handling. Derived classes implement to +/// serialize the strongly typed property into the response body using +/// their chosen serialization strategy. +/// +public abstract class ApiGatewayResponseEnvelopeBase : APIGatewayProxyResponse, IResponseEnvelope +{ + /// The deserialized content of the + [JsonIgnore] + public T? BodyContent { get; set; } + + /// + public abstract void PackPayload(EnvelopeOptions options); +} diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelope.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelope.cs index 7390b598..be8de69b 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelope.cs +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelope.cs @@ -1,24 +1,18 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using Amazon.Lambda.APIGatewayEvents; using AwsLambda.Host.Options; namespace AwsLambda.Host.Envelopes.ApiGateway; -/// +/// /// -/// This class extends -/// and adds a -/// strongly typed property for easier serialization and deserialization -/// of request payloads. +/// Provides the default implementation for deserializing request payloads using +/// with the configured +/// . /// -public class ApiGatewayV2RequestEnvelope : APIGatewayHttpApiV2ProxyRequest, IRequestEnvelope +public sealed class ApiGatewayV2RequestEnvelope : ApiGatewayV2RequestEnvelopeBase { - /// The deserialized content of the - [JsonIgnore] - public T? BodyContent { get; set; } - - /// - public void ExtractPayload(EnvelopeOptions options) => + /// + /// This implementation deserializes the request body from JSON. + public override void ExtractPayload(EnvelopeOptions options) => BodyContent = JsonSerializer.Deserialize(Body, options.JsonOptions); } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelopeBase.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelopeBase.cs new file mode 100644 index 00000000..4c24202f --- /dev/null +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2RequestEnvelopeBase.cs @@ -0,0 +1,25 @@ +using System.Text.Json.Serialization; +using Amazon.Lambda.APIGatewayEvents; +using AwsLambda.Host.Options; + +namespace AwsLambda.Host.Envelopes.ApiGateway; + +/// +/// +/// This abstract class extends +/// and provides a +/// foundation for strongly typed request handling. Derived classes implement +/// to deserialize the request body into a strongly typed +/// property using their chosen deserialization strategy. +/// +public abstract class ApiGatewayV2RequestEnvelopeBase + : APIGatewayHttpApiV2ProxyRequest, + IRequestEnvelope +{ + /// The deserialized content of the + [JsonIgnore] + public T? BodyContent { get; set; } + + /// + public abstract void ExtractPayload(EnvelopeOptions options); +} diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelope.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelope.cs index bc09fdbb..a7c69936 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelope.cs +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelope.cs @@ -1,24 +1,18 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using Amazon.Lambda.APIGatewayEvents; using AwsLambda.Host.Options; namespace AwsLambda.Host.Envelopes.ApiGateway; -/// +/// /// -/// This class extends -/// and adds a -/// strongly typed property for easier serialization and deserialization -/// of response payloads. +/// Provides the default implementation for serializing response payloads using +/// with the configured +/// . /// -public class ApiGatewayV2ResponseEnvelope : APIGatewayHttpApiV2ProxyResponse, IResponseEnvelope +public sealed class ApiGatewayV2ResponseEnvelope : ApiGatewayV2ResponseEnvelopeBase { - /// The deserialized content of the - [JsonIgnore] - public T? BodyContent { get; set; } - - /// - public void PackPayload(EnvelopeOptions options) => + /// + /// This implementation serializes the response body to JSON. + public override void PackPayload(EnvelopeOptions options) => Body = JsonSerializer.Serialize(BodyContent, options.JsonOptions); } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelopeBase.cs b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelopeBase.cs new file mode 100644 index 00000000..19be6e57 --- /dev/null +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/ApiGatewayV2ResponseEnvelopeBase.cs @@ -0,0 +1,25 @@ +using System.Text.Json.Serialization; +using Amazon.Lambda.APIGatewayEvents; +using AwsLambda.Host.Options; + +namespace AwsLambda.Host.Envelopes.ApiGateway; + +/// +/// +/// This abstract class extends +/// and provides a +/// foundation for strongly typed response handling. Derived classes implement +/// to serialize the strongly typed property +/// into the response body using their chosen serialization strategy. +/// +public abstract class ApiGatewayV2ResponseEnvelopeBase + : APIGatewayHttpApiV2ProxyResponse, + IResponseEnvelope +{ + /// The deserialized content of the + [JsonIgnore] + public T? BodyContent { get; set; } + + /// + public abstract void PackPayload(EnvelopeOptions options); +} diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/README.md b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/README.md index 7bcf21a5..17b14d19 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/README.md +++ b/src/Envelopes/AwsLambda.Host.Envelopes.ApiGateway/README.md @@ -63,6 +63,41 @@ internal record Response(string Message, DateTime TimestampUtc); For HTTP API v2, use `ApiGatewayV2RequestEnvelope` and `ApiGatewayV2ResponseEnvelope` in the same way. +## Custom Envelopes + +To implement custom deserialization logic, extend the appropriate base class and override the +payload handling method: + +```csharp +// Example: Custom XML deserialization for requests +public sealed class XmlApiGatewayXmlRequestEnvelope : ApiGatewayRequestEnvelopeBase +{ + public override void ExtractPayload(EnvelopeOptions options) + { + using var stringReader = new StringReader(Body); + using var xmlReader = XmlReader.Create(stringReader, options.XmlReaderSettings); + var serializer = new XmlSerializer(typeof(T)); + BodyContent = (T)serializer.Deserialize(xmlReader)!; + } +} + +// Example: Custom XML serialization for responses +public sealed class XmlApiGatewayXmlResponseEnvelope : ApiGatewayResponseEnvelopeBase +{ + public override void PackPayload(EnvelopeOptions options) + { + using var stringWriter = new StringWriter(); + using var xmlWriter = XmlWriter.Create(stringWriter, options.XmlWriterSettings); + var serializer = new XmlSerializer(typeof(T)); + serializer.Serialize(xmlWriter, BodyContent); + Body = stringWriter.ToString(); + } +} +``` + +This pattern allows you to support multiple serialization formats while maintaining the same +envelope interface. + ## AOT Support When using .NET Native AOT, register all envelope and payload types in your `JsonSerializerContext`: @@ -93,11 +128,11 @@ builder.Services.ConfigureEnvelopeOptions(options => See the [example project](../../examples/AwsLambda.Host.Example.Events/Program.cs) for a complete working example. -## Related Resources +## Related Packages -- [Amazon.Lambda.APIGatewayEvents](https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.APIGatewayEvents) – - Base API Gateway event types -- [AwsLambda.Host](../AwsLambda.Host/README.md) – Core framework documentation +| Package | NuGet | Downloads | +|-------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------| +| [**AwsLambda.Host.Envelopes.Sqs**](../AwsLambda.Host.Envelopes.Sqs/README.md) | [![NuGet](https://img.shields.io/nuget/v/AwsLambda.Host.Envelopes.Sqs.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs) | [![Downloads](https://img.shields.io/nuget/dt/AwsLambda.Host.Envelopes.Sqs.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs/) | ## License diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/README.md b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/README.md index 58786ae7..6167feeb 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/README.md +++ b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/README.md @@ -57,6 +57,32 @@ await lambda.RunAsync(); internal record Message(string Name); ``` +## Custom Envelopes + +To implement custom deserialization logic, extend `SqsEnvelopeBase` and override the +`ExtractPayload` method: + +```csharp +// Example: Custom XML deserialization +public sealed class SqsXmlEnvelope : SqsEnvelopeBase +{ + private static readonly XmlSerializer Serializer = new(typeof(T)); + + public override void ExtractPayload(EnvelopeOptions options) + { + foreach (var record in Records) + { + using var stringReader = new StringReader(record.Body); + using var xmlReader = XmlReader.Create(stringReader, options.XmlReaderSettings); + record.BodyContent = (T)Serializer.Deserialize(xmlReader)!; + } + } +} +``` + +This pattern allows you to support multiple serialization formats while maintaining the same +envelope interface. + ## AOT Support When using .NET Native AOT, register both the envelope and payload types in your @@ -86,11 +112,11 @@ builder.Services.ConfigureEnvelopeOptions(options => See the [example project](../../examples/AwsLambda.Host.Example.Events/Program.cs) for a complete working example. -## Related Resources +## Related Packages -- [Amazon.Lambda.SQSEvents](https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.SQSEvents/README.md) – - Base SQS event types -- [AwsLambda.Host](../AwsLambda.Host/README.md) – Core framework documentation +| Package | NuGet | Downloads | +|---------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [**AwsLambda.Host.Envelopes.ApiGateway**](../AwsLambda.Host.Envelopes.ApiGateway/README.md) | [![NuGet](https://img.shields.io/nuget/v/AwsLambda.Host.Envelopes.ApiGateway.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway) | [![Downloads](https://img.shields.io/nuget/dt/AwsLambda.Host.Envelopes.ApiGateway.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway/) | ## License diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelope.cs b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelope.cs index 0c14650a..d2f603c2 100644 --- a/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelope.cs +++ b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelope.cs @@ -1,33 +1,21 @@ using System.Text.Json; -using System.Text.Json.Serialization; -using Amazon.Lambda.SQSEvents; using AwsLambda.Host.Options; namespace AwsLambda.Host.Envelopes.Sqs; -/// +/// /// -/// This class extends and adds strongly typed -/// records for easier serialization and deserialization of SQS -/// message payloads. +/// Provides the default implementation for deserializing SQS message payloads using +/// with the configured +/// . /// -public class SqsEnvelope : SQSEvent, IRequestEnvelope +public sealed class SqsEnvelope : SqsEnvelopeBase { - /// - public new required List Records { get; set; } - - /// - public void ExtractPayload(EnvelopeOptions options) + /// + /// This implementation deserializes each message body from JSON. + public override void ExtractPayload(EnvelopeOptions options) { foreach (var record in Records) record.BodyContent = JsonSerializer.Deserialize(record.Body, options.JsonOptions); } - - /// - public class SqsMessageEnvelope : SQSMessage - { - /// Get and sets the deserialized - [JsonIgnore] - public T? BodyContent { get; set; } - } } diff --git a/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelopeBase.cs b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelopeBase.cs new file mode 100644 index 00000000..a4490605 --- /dev/null +++ b/src/Envelopes/AwsLambda.Host.Envelopes.Sqs/SqsEnvelopeBase.cs @@ -0,0 +1,29 @@ +using System.Text.Json.Serialization; +using Amazon.Lambda.SQSEvents; +using AwsLambda.Host.Options; + +namespace AwsLambda.Host.Envelopes.Sqs; + +/// +/// +/// This abstract class extends and provides a foundation +/// for strongly typed SQS message handling. Derived classes implement to +/// deserialize the message bodies into strongly typed records +/// using their chosen deserialization strategy. +/// +public abstract class SqsEnvelopeBase : SQSEvent, IRequestEnvelope +{ + /// + public new required List Records { get; set; } + + /// + public abstract void ExtractPayload(EnvelopeOptions options); + + /// + public class SqsMessageEnvelope : SQSMessage + { + /// Get and sets the deserialized + [JsonIgnore] + public T? BodyContent { get; set; } + } +} diff --git a/src/Envelopes/README.md b/src/Envelopes/README.md new file mode 100644 index 00000000..96bffbeb --- /dev/null +++ b/src/Envelopes/README.md @@ -0,0 +1,40 @@ +# Envelopes + +Envelopes extend AWS Lambda event types with strongly-typed payload handling, making it easier to +work with JSON (or other formats) in Lambda function handlers. + +## Overview + +Envelope packages wrap official AWS Lambda event classes (like `SQSEvent`, `APIGatewayProxyRequest`) +and add a `BodyContent` property that provides type-safe access to deserialized message payloads. +Instead of manually parsing JSON strings from event bodies, you get strongly-typed objects with full +IDE support and compile-time type checking. + +**Key benefits:** + +- **Type Safety**  Generic type parameter `` ensures compile-time type checking for payloads +- **Extensibility**  Abstract base classes allow custom serialization formats (JSON, XML, etc.) +- **Zero Overhead**  Envelopes extend official AWS event types, adding no runtime cost +- **AOT Ready**  Support for Native AOT compilation via JsonSerializerContext registration +- **Familiar API**  Works seamlessly with existing AWS Lambda event patterns + +## Packages + +| Package | NuGet | Downloads | +|--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [**AwsLambda.Host.Envelopes.Sqs**](./AwsLambda.Host.Envelopes.Sqs/README.md) | [![NuGet](https://img.shields.io/nuget/v/AwsLambda.Host.Envelopes.Sqs.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs) | [![Downloads](https://img.shields.io/nuget/dt/AwsLambda.Host.Envelopes.Sqs.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs/) | +| [**AwsLambda.Host.Envelopes.ApiGateway**](./AwsLambda.Host.Envelopes.ApiGateway/README.md) | [![NuGet](https://img.shields.io/nuget/v/AwsLambda.Host.Envelopes.ApiGateway.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway) | [![Downloads](https://img.shields.io/nuget/dt/AwsLambda.Host.Envelopes.ApiGateway.svg)](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway/) | + +Each package has detailed documentation in its own README file. + +## Quick Reference + +Use the following table to find the right envelope package for your Lambda event type: + +| Lambda Event Type | Package | +|-------------------------|-------------------------------------| +| SQS | AwsLambda.Host.Envelopes.Sqs | +| API Gateway REST API | AwsLambda.Host.Envelopes.ApiGateway | +| API Gateway HTTP API v1 | AwsLambda.Host.Envelopes.ApiGateway | +| API Gateway HTTP API v2 | AwsLambda.Host.Envelopes.ApiGateway | +| API Gateway WebSocket | AwsLambda.Host.Envelopes.ApiGateway |