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) | [](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs) | [](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) | [](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway) | [](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) | [](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs) | [](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.Sqs/) |
+| [**AwsLambda.Host.Envelopes.ApiGateway**](./AwsLambda.Host.Envelopes.ApiGateway/README.md) | [](https://www.nuget.org/packages/AwsLambda.Host.Envelopes.ApiGateway) | [](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 |