![]() |
VOOZH | about |
dotnet add package MinimalLambda.Envelopes.Kafka --version 2.6.0
NuGet\Install-Package MinimalLambda.Envelopes.Kafka -Version 2.6.0
<PackageReference Include="MinimalLambda.Envelopes.Kafka" Version="2.6.0" />
<PackageVersion Include="MinimalLambda.Envelopes.Kafka" Version="2.6.0" />Directory.Packages.props
<PackageReference Include="MinimalLambda.Envelopes.Kafka" />Project file
paket add MinimalLambda.Envelopes.Kafka --version 2.6.0
#r "nuget: MinimalLambda.Envelopes.Kafka, 2.6.0"
#:package MinimalLambda.Envelopes.Kafka@2.6.0
#addin nuget:?package=MinimalLambda.Envelopes.Kafka&version=2.6.0Install as a Cake Addin
#tool nuget:?package=MinimalLambda.Envelopes.Kafka&version=2.6.0Install as a Cake Tool
Strongly-typed Kafka event handling for the MinimalLambda framework.
This package provides KafkaEnvelope<T>, which extends the base
KafkaEvent
class with a generic Records collection that deserializes base64-encoded Kafka message values into
strongly-typed objects. Instead of manually decoding and parsing base64 data from record.Value,
you
access deserialized payloads directly via record.ValueContent.
| Envelope Class | Base Class | Use Case |
|---|---|---|
KafkaEnvelope<T> |
KafkaEvent |
Kafka event with deserialized message values |
Define your message type and handler:
using Amazon.Lambda.KafkaEvents;
using MinimalLambda.Builder;
using MinimalLambda.Envelopes.Kafka;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var builder = LambdaApplication.CreateBuilder();
var lambda = builder.Build();
// KafkaEnvelope<OrderEvent> provides access to the Kafka event and deserialized OrderEvent payloads
lambda.MapHandler(
([FromEvent] KafkaEnvelope<OrderEvent> envelope, ILogger<Program> logger) =>
{
foreach (var topic in envelope.Records)
{
logger.LogInformation("Processing {Count} records from topic: {Topic}", topic.Value.Count, topic.Key);
foreach (var record in topic.Value)
{
logger.LogInformation(
"Order ID: {OrderId}, Amount: {Amount}",
record.ValueContent?.OrderId,
record.ValueContent?.Amount
);
}
}
}
);
await lambda.RunAsync();
// Your message payload - will be deserialized from base64-encoded Kafka message value
internal record OrderEvent(string OrderId, decimal Amount, DateTime Timestamp);
To implement custom deserialization logic, extend KafkaEnvelopeBase<T> and override the
ExtractPayload method:
// Example: Custom XML deserialization
public sealed class KafkaXmlEnvelope<T> : KafkaEnvelopeBase<T>
{
private static readonly XmlSerializer Serializer = new(typeof(T));
public override void ExtractPayload(EnvelopeOptions options)
{
foreach (var topic in Records)
{
foreach (var record in topic.Value)
{
using var reader = new StreamReader(
record.Value,
Encoding.UTF8,
leaveOpen: true
);
var base64String = reader.ReadToEnd();
var xmlBytes = Convert.FromBase64String(base64String);
using var xmlReader = XmlReader.Create(
new MemoryStream(xmlBytes),
options.XmlReaderSettings
);
record.ValueContent = (T)Serializer.Deserialize(xmlReader)!;
}
}
}
}
This pattern allows you to support multiple serialization formats while maintaining the same envelope interface.
When using .NET Native AOT, register both the envelope and payload types in your
JsonSerializerContext:
[JsonSerializable(typeof(KafkaEnvelope<OrderEvent>))]
[JsonSerializable(typeof(OrderEvent))]
internal partial class SerializerContext : JsonSerializerContext;
Register the serializer and configure envelope options to use the context:
builder.Services.AddLambdaSerializerWithContext<SerializerContext>();
builder.Services.ConfigureEnvelopeOptions(options =>
{
options.JsonOptions.TypeInfoResolver = SerializerContext.Default;
});
The context must be registered as the type resolver for both the envelope options and the Lambda serializer because the Lambda event and envelope payload are deserialized at different steps: the Lambda serializer deserializes the raw event, and the envelope options deserialize the envelope content into your payload type.
Additional packages in the minimal-lambda framework for abstractions, observability, and event source handling.
This project is licensed under the MIT License. See for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.6.0 | 50 | 6/12/2026 |
| 2.5.0 | 103 | 5/9/2026 |
| 2.4.0 | 108 | 4/17/2026 |
| 2.3.1 | 117 | 3/23/2026 |
| 2.3.0 | 103 | 3/21/2026 |
| 2.2.0 | 124 | 1/12/2026 |
| 2.2.0-beta.1 | 86 | 1/9/2026 |
| 2.1.1 | 195 | 12/22/2025 |
| 2.1.0-beta.6 | 119 | 12/20/2025 |
| 2.1.0-beta.5 | 153 | 12/19/2025 |
| 2.1.0-beta.4 | 166 | 12/19/2025 |
| 2.1.0-beta.3 | 168 | 12/19/2025 |
| 2.1.0-beta.2 | 171 | 12/19/2025 |
| 2.1.0-beta.1 | 246 | 12/19/2025 |
| 2.0.0 | 293 | 12/18/2025 |
| 2.0.0-beta.11 | 254 | 12/17/2025 |
| 2.0.0-beta.10 | 256 | 12/17/2025 |
| 2.0.0-beta.9 | 241 | 12/15/2025 |
| 2.0.0-beta.8 | 234 | 12/15/2025 |
| 2.0.0-beta.7 | 191 | 12/15/2025 |