diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 066d7fd..5d889ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ main, develop ] + branches: [ main ] pull_request: - branches: [ main, develop ] + branches: [ main ] jobs: build-and-test: diff --git a/UltraSpeedBus.Abstractions/Contexts/IConsumerContext.cs b/UltraSpeedBus.Abstractions/Contexts/IConsumerContext.cs deleted file mode 100644 index b6171cf..0000000 --- a/UltraSpeedBus.Abstractions/Contexts/IConsumerContext.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Contexts; - -public interface IConsumerContext : IMessageContext -{ - object Message { get; } - int DeliveryCount { get; } -} diff --git a/UltraSpeedBus.Abstractions/Contexts/IMessageContext.cs b/UltraSpeedBus.Abstractions/Contexts/IMessageContext.cs deleted file mode 100644 index 6e05071..0000000 --- a/UltraSpeedBus.Abstractions/Contexts/IMessageContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Contexts; - -using System.Threading; - -public interface IMessageContext -{ - Guid? MessageId { get; } - Guid? CorrelationId { get; } - DateTime Timestamp { get; } - - IReadOnlyDictionary Headers { get; } - CancellationToken CancelationToken { get; } -} diff --git a/UltraSpeedBus.Abstractions/Contexts/ISendContext.cs b/UltraSpeedBus.Abstractions/Contexts/ISendContext.cs deleted file mode 100644 index 925b924..0000000 --- a/UltraSpeedBus.Abstractions/Contexts/ISendContext.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Contexts; - -public interface ISendContext : IMessageContext -{ - object Payload { get; } - void AddHeader(string key, object? value); -} diff --git a/UltraSpeedBus.Abstractions/Message/ICommand.cs b/UltraSpeedBus.Abstractions/Message/ICommand.cs index 3d7b6c1..2587b7c 100644 --- a/UltraSpeedBus.Abstractions/Message/ICommand.cs +++ b/UltraSpeedBus.Abstractions/Message/ICommand.cs @@ -1,3 +1,6 @@ namespace UltraSpeedBus.Abstractions.Message; +/// +/// Command message marker interface +/// public interface ICommand : IMessage {} diff --git a/UltraSpeedBus.Abstractions/Message/ICommandHandler.cs b/UltraSpeedBus.Abstractions/Message/ICommandHandler.cs new file mode 100644 index 0000000..2022b97 --- /dev/null +++ b/UltraSpeedBus.Abstractions/Message/ICommandHandler.cs @@ -0,0 +1,7 @@ +namespace UltraSpeedBus.Abstractions.Message; + +public interface ICommandHandler + where TCommand : ICommand +{ + Task HandleAsync(TCommand command, CancellationToken cancellationToken); +} diff --git a/UltraSpeedBus.Abstractions/Message/ICorrelatedMessage.cs b/UltraSpeedBus.Abstractions/Message/ICorrelatedMessage.cs deleted file mode 100644 index 2524aa5..0000000 --- a/UltraSpeedBus.Abstractions/Message/ICorrelatedMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Message; - -public interface ICorrelatedMessage : IMessage -{ - Guid CorrelationId { get; } -} diff --git a/UltraSpeedBus.Abstractions/Message/IEvent.cs b/UltraSpeedBus.Abstractions/Message/IEvent.cs index b629c43..9f9ce4f 100644 --- a/UltraSpeedBus.Abstractions/Message/IEvent.cs +++ b/UltraSpeedBus.Abstractions/Message/IEvent.cs @@ -1,3 +1,6 @@ namespace UltraSpeedBus.Abstractions.Message; +/// +/// Event message marker interface +/// public interface IEvent : IMessage {} diff --git a/UltraSpeedBus.Abstractions/Message/IEventHandler.cs b/UltraSpeedBus.Abstractions/Message/IEventHandler.cs new file mode 100644 index 0000000..8791ab3 --- /dev/null +++ b/UltraSpeedBus.Abstractions/Message/IEventHandler.cs @@ -0,0 +1,7 @@ +namespace UltraSpeedBus.Abstractions.Message; + +public interface IEventHandler + where TEvent : IEvent +{ + Task HandleAsync(TEvent @event, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Message/IMessage.cs b/UltraSpeedBus.Abstractions/Message/IMessage.cs index a1f610c..a554c61 100644 --- a/UltraSpeedBus.Abstractions/Message/IMessage.cs +++ b/UltraSpeedBus.Abstractions/Message/IMessage.cs @@ -1,42 +1,14 @@ namespace UltraSpeedBus.Abstractions.Message; -// Message base interface public interface IMessage { + /// + /// It will be used for Saga, Idempotency, etc. + /// Guid MessageId { get; } - DateTime Timestamp { get; } - -} - -// Pipelines and middlewares -public interface IMessageMiddleware -{ -} - -public interface IPublishPipeline -{ -} - -public interface IConsumerPipeline -{ -} -// Policies and erros -public interface IErrorHandler -{ -} - -public interface IRetryPolicy -{ -} - -public interface IExceptionFilter -{ - -} - -// Telemetry - it will be integrated with OpenTelemetry -public interface ITracerAdapter -{ - + /// + /// It will be used for logging, tracing, etc. + /// + DateTime Timestamp { get; } } \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Message/IQuery.cs b/UltraSpeedBus.Abstractions/Message/IQuery.cs new file mode 100644 index 0000000..1a2a8b0 --- /dev/null +++ b/UltraSpeedBus.Abstractions/Message/IQuery.cs @@ -0,0 +1,3 @@ +namespace UltraSpeedBus.Abstractions.Message; + +public interface IQuery : IMessage {} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Message/IQueryHandler.cs b/UltraSpeedBus.Abstractions/Message/IQueryHandler.cs new file mode 100644 index 0000000..03740ec --- /dev/null +++ b/UltraSpeedBus.Abstractions/Message/IQueryHandler.cs @@ -0,0 +1,7 @@ +namespace UltraSpeedBus.Abstractions.Message; + +public interface IQueryHandler + where TQuery : IQuery +{ + Task HandleAsync(TQuery query, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Message/IScheduledMessage.cs b/UltraSpeedBus.Abstractions/Message/IScheduledMessage.cs deleted file mode 100644 index 16cb385..0000000 --- a/UltraSpeedBus.Abstractions/Message/IScheduledMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Message; - -public interface IScheduledMessage : IMessage -{ - DateTime ScheduledTime { get; } -} diff --git a/UltraSpeedBus.Abstractions/Message/MessageEnvelope.cs b/UltraSpeedBus.Abstractions/Message/MessageEnvelope.cs deleted file mode 100644 index 9a47d28..0000000 --- a/UltraSpeedBus.Abstractions/Message/MessageEnvelope.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Message; - -public class MessageEnvelope -{ - public Guid MessageId { get; init; } - public Guid? CorrelationId { get; set; } - public DateTime Timestamp { get; init; } - public Dictionary Headers { get; init; } - public object Payload { get; init; } - - public MessageEnvelope(object payload) - { - Payload = payload ?? throw new ArgumentNullException(nameof(payload)); - Timestamp = DateTime.UtcNow; - MessageId = Guid.NewGuid(); - Headers = new Dictionary(); - } -} diff --git a/UltraSpeedBus.Abstractions/Sagas/ISagaContext.cs b/UltraSpeedBus.Abstractions/Sagas/ISagaContext.cs deleted file mode 100644 index ef07589..0000000 --- a/UltraSpeedBus.Abstractions/Sagas/ISagaContext.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Sagas; - -public interface ISagaContext -{ -} diff --git a/UltraSpeedBus.Abstractions/Sagas/ISagaRepository.cs b/UltraSpeedBus.Abstractions/Sagas/ISagaRepository.cs deleted file mode 100644 index 2c9792e..0000000 --- a/UltraSpeedBus.Abstractions/Sagas/ISagaRepository.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Sagas; - -public interface ISagaRepository -{ -} diff --git a/UltraSpeedBus.Abstractions/Sagas/ISagaState.cs b/UltraSpeedBus.Abstractions/Sagas/ISagaState.cs deleted file mode 100644 index 6006c08..0000000 --- a/UltraSpeedBus.Abstractions/Sagas/ISagaState.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Sagas; - -// Sagas -public interface ISagaState -{ -} diff --git a/UltraSpeedBus.Abstractions/Serializer/IMessageSerializer.cs b/UltraSpeedBus.Abstractions/Serializer/IMessageSerializer.cs deleted file mode 100644 index 0461736..0000000 --- a/UltraSpeedBus.Abstractions/Serializer/IMessageSerializer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Abstractions.Serializer; - -public interface IMessageSerializer -{ - ReadOnlyMemory Serialize(MessageEnvelope envelope); - MessageEnvelope Deserialize(ReadOnlyMemory body, IReadOnlyDictionary headers); - string ContentType { get; } -} diff --git a/UltraSpeedBus.Abstractions/Transport/ConsumerTransportContext.cs b/UltraSpeedBus.Abstractions/Transport/ConsumerTransportContext.cs deleted file mode 100644 index d494e87..0000000 --- a/UltraSpeedBus.Abstractions/Transport/ConsumerTransportContext.cs +++ /dev/null @@ -1,29 +0,0 @@ -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Abstractions.Transport; - -public class ConsumerTransportContext -{ - public MessageEnvelope Envelope { get; } - public int DeliveryCount { get; } - public Func CompleteAsync { get; } - public Func AbandonAsync { get; } - public Func DeadLetterAsync { get; } // reason, description - public CancellationToken CancellationToken { get; } - - public ConsumerTransportContext( - MessageEnvelope envelope, - int deliveryCount, - Func completeAsync, - Func abandonAsync, - Func deadLetterAsync, - CancellationToken cancellationToken) - { - Envelope = envelope; - DeliveryCount = deliveryCount; - CompleteAsync = completeAsync; - AbandonAsync = abandonAsync; - DeadLetterAsync = deadLetterAsync; - CancellationToken = cancellationToken; - } -} diff --git a/UltraSpeedBus.Abstractions/Transport/ITransport.cs b/UltraSpeedBus.Abstractions/Transport/ITransport.cs new file mode 100644 index 0000000..6dca86c --- /dev/null +++ b/UltraSpeedBus.Abstractions/Transport/ITransport.cs @@ -0,0 +1,7 @@ +namespace UltraSpeedBus.Abstractions.Message; + +public interface ITransport +{ + ITransportProducer CreateProducer(); + ITransportConsumer CreateConsumer(string queueOrTopic); +} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Transport/ITransportConsumer.cs b/UltraSpeedBus.Abstractions/Transport/ITransportConsumer.cs index a0d7d86..6ec83e7 100644 --- a/UltraSpeedBus.Abstractions/Transport/ITransportConsumer.cs +++ b/UltraSpeedBus.Abstractions/Transport/ITransportConsumer.cs @@ -1,7 +1,23 @@ -namespace UltraSpeedBus.Abstractions.Transport; +namespace UltraSpeedBus.Abstractions.Message; +/// +/// Represents a transport-agnostic consumer interface that supports multiple message consumption patterns: +/// - Long polling (e.g., AWS SQS) +/// - Push-based delivery (e.g., Azure Service Bus) +/// - Subscription streaming (e.g., Apache Kafka) +/// - Polling loop (e.g., Redis Streams) +/// public interface ITransportConsumer : IAsyncDisposable { - Task StartAsync(Func onMessage, CancellationToken cancellationToken = default); - Task StopAsync(CancellationToken cancellationToken = default); + Task InitializeAsync(CancellationToken cancellationToken = default); + + Task StartConsumingAsync( + Func handler, + CancellationToken cancellationToken = default); + + Task StopConsumingAsync(CancellationToken cancellationToken = default); } + +public class ConsumerTransportContext +{ +} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Transport/ITransportProducer.cs b/UltraSpeedBus.Abstractions/Transport/ITransportProducer.cs index a9570a9..a8c3911 100644 --- a/UltraSpeedBus.Abstractions/Transport/ITransportProducer.cs +++ b/UltraSpeedBus.Abstractions/Transport/ITransportProducer.cs @@ -1,12 +1,20 @@ -using UltraSpeedBus.Abstractions.Message; +namespace UltraSpeedBus.Abstractions.Message; -namespace UltraSpeedBus.Abstractions.Transport; +public class MessageEnvelope +{ + public Guid MessageId { get; init; } + public string MessageType { get; init; } = null!; + public byte[] Payload { get; init; } = null!; +} +/// +/// Defines a transport producer capable of sending and publishing messages. +/// it will be used for Azure Service Bus, AWS, RabbitMQ fanout, SQS, Redis Streams, etc. +/// public interface ITransportProducer : IAsyncDisposable { - Task StartAsync(CancellationToken cancellationToken = default); - Task StopAsync(CancellationToken cancellationToken = default); + Task InitializeAsync(CancellationToken cancellationToken = default); - Task SendAsync(MessageEnvelope envolope, CancellationToken cancellationToken = default); - Task PublishAsync(MessageEnvelope envolope, CancellationToken cancellationToken = default); -} + Task SendAsync(string queue, MessageEnvelope envelop, CancellationToken cancellationToken = default); + Task PublishAsync(string topic, MessageEnvelope envelop, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/Transport/ITransportTopology.cs b/UltraSpeedBus.Abstractions/Transport/ITransportTopology.cs deleted file mode 100644 index ba7ba0f..0000000 --- a/UltraSpeedBus.Abstractions/Transport/ITransportTopology.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace UltraSpeedBus.Abstractions.Transport; - -public interface ITransportTopology -{ - Task EnsureQueueExistsAsync(string queueName, CancellationToken cancellationToken = default); - Task EnsureTopicExistsAsync(string topicName, CancellationToken cancellationToken = default); - Task EnsureSubscriptionExistsAsync(string topicName, string subscriptionName, CancellationToken cancellationToken = default); -} diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index 2217181..0000000 --- a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfo.cs b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfo.cs deleted file mode 100644 index b4f1d3a..0000000 --- a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("UltraSpeedBus")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright © UltraSpeedBus 2025")] -[assembly: System.Reflection.AssemblyDescriptionAttribute("Core abstractions and interfaces for UltraSpeedBus")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+331f3118c12b01673bd1e4d4ff545eeffb3dc9f6")] -[assembly: System.Reflection.AssemblyProductAttribute("UltraSpeedBus.Abstractions")] -[assembly: System.Reflection.AssemblyTitleAttribute("UltraSpeedBus.Abstractions")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/elyosemite/UltraSpeedBus")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfoInputs.cache b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfoInputs.cache deleted file mode 100644 index 3eedec9..0000000 --- a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -2092fb5082f39147c86b1a6ca0b398525ca29d40fa11d21514d7931a9927410a diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GeneratedMSBuildEditorConfig.editorconfig b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index c39a051..0000000 --- a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetFrameworkIdentifier = .NETCoreApp -build_property.TargetFrameworkVersion = v8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = UltraSpeedBus.Abstractions -build_property.ProjectDir = c:\Users\Alfredo\Projects\UltraSpeedBus\UltraSpeedBus.Abstractions\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 8.0 -build_property.EnableCodeStyleSeverity = diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GlobalUsings.g.cs b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GlobalUsings.g.cs deleted file mode 100644 index d12bcbc..0000000 --- a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using System; -global using System.Collections.Generic; -global using System.IO; -global using System.Linq; -global using System.Net.Http; -global using System.Threading; -global using System.Threading.Tasks; diff --git a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.assets.cache b/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.assets.cache deleted file mode 100644 index 5dc6d83..0000000 Binary files a/UltraSpeedBus.Abstractions/obj/Debug/net8.0/UltraSpeedBus.Abstractions.assets.cache and /dev/null differ diff --git a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.dgspec.json b/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.dgspec.json deleted file mode 100644 index 637eff1..0000000 --- a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.dgspec.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "format": 1, - "restore": { - "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj": {} - }, - "projects": { - "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj", - "projectName": "UltraSpeedBus.Abstractions", - "projectPath": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj", - "packagesPath": "C:\\Users\\Alfredo\\.nuget\\packages\\", - "outputPath": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Alfredo\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net8.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.100" - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.props b/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.props deleted file mode 100644 index 41812cc..0000000 --- a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\Alfredo\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 7.0.0 - - - - - - \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.targets b/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/UltraSpeedBus.Abstractions/obj/UltraSpeedBus.Abstractions.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/obj/project.assets.json b/UltraSpeedBus.Abstractions/obj/project.assets.json deleted file mode 100644 index 2f1a344..0000000 --- a/UltraSpeedBus.Abstractions/obj/project.assets.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "version": 3, - "targets": { - "net8.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net8.0": [] - }, - "packageFolders": { - "C:\\Users\\Alfredo\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj", - "projectName": "UltraSpeedBus.Abstractions", - "projectPath": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj", - "packagesPath": "C:\\Users\\Alfredo\\.nuget\\packages\\", - "outputPath": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Alfredo\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net8.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.100" - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/UltraSpeedBus.Abstractions/obj/project.nuget.cache b/UltraSpeedBus.Abstractions/obj/project.nuget.cache deleted file mode 100644 index a7c80dd..0000000 --- a/UltraSpeedBus.Abstractions/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "kNfiK4evkug=", - "success": true, - "projectFilePath": "c:\\Users\\Alfredo\\Projects\\UltraSpeedBus\\UltraSpeedBus.Abstractions\\UltraSpeedBus.Abstractions.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file diff --git a/UltraSpeedBus.Tests/Context/ConsumerContextTests.cs b/UltraSpeedBus.Tests/Context/ConsumerContextTests.cs deleted file mode 100644 index fe57efc..0000000 --- a/UltraSpeedBus.Tests/Context/ConsumerContextTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -using UltraSpeedBus.Contexts; - -namespace UltraSpeedBus.Tests.Context; - -public class ConsumerContextTests -{ - private class TestMessage { public required string Text { get; set; } } - - [Test] - public void ConsumerContext_Should_Create_With_Valid_Values() - { - var msg = new TestMessage { Text = "Test" }; - var envelope = MessageFactory.Create(msg); - var context = new ConsumerContext(envelope, deliveryCount: 2, CancellationToken.None); - - Assert.That(context.Message, Is.EqualTo(msg)); - Assert.That(context.DeliveryCount, Is.EqualTo(2)); - Assert.That(context.MessageId, Is.Not.EqualTo(Guid.Empty)); - Assert.That(context.Timestamp, Is.LessThanOrEqualTo(DateTime.UtcNow)); - } -} diff --git a/UltraSpeedBus.Tests/Context/MessageContext.cs b/UltraSpeedBus.Tests/Context/MessageContext.cs deleted file mode 100644 index abf6684..0000000 --- a/UltraSpeedBus.Tests/Context/MessageContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -using UltraSpeedBus.Contexts; - -namespace UltraSpeedBus.Tests.Context; - -internal class MessageContext -{ - [Test] - public void MessageContext_Should_Expose_Envelope_Properties() - { - var envelope = MessageFactory.Create("hello", correlationId: Guid.NewGuid()); - var ctx = new SendContext(envelope, CancellationToken.None); - - Assert.That(ctx.MessageId, Is.EqualTo(envelope.MessageId)); - Assert.That(ctx.CorrelationId, Is.EqualTo(envelope.CorrelationId)); - Assert.That(ctx.Timestamp, Is.EqualTo(envelope.Timestamp)); - } -} diff --git a/UltraSpeedBus.Tests/Context/SendContextTests.cs b/UltraSpeedBus.Tests/Context/SendContextTests.cs deleted file mode 100644 index dd1b831..0000000 --- a/UltraSpeedBus.Tests/Context/SendContextTests.cs +++ /dev/null @@ -1,20 +0,0 @@ -using UltraSpeedBus.Contexts; - -namespace UltraSpeedBus.Tests.Context; - -internal class SendContextTests -{ - private class DummyMessage { } - - [Test] - public void SendContext_Should_Add_Headers() - { - var envelope = MessageFactory.Create(new DummyMessage()); - var context = new SendContext(envelope, CancellationToken.None); - - context.AddHeader("key1", "value1"); - - Assert.That(context.Headers.ContainsKey("key1"), Is.True); - Assert.That(context.Headers["key1"], Is.EqualTo("value1")); - } -} diff --git a/UltraSpeedBus.Tests/InMemoryTransportTests.cs b/UltraSpeedBus.Tests/InMemoryTransportTests.cs deleted file mode 100644 index f960bc0..0000000 --- a/UltraSpeedBus.Tests/InMemoryTransportTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using UltraSpeedBus.Serialization; -using UltraSpeedBus.Transports.InMemory; - -namespace UltraSpeedBus.Tests; - -public class InMemoryTransportTests -{ - [Test] - public async Task InMemoryTransport_Send_Publishes_And_Consumer_Completes() - { - var serializer = new JsonMessageSerializer(); - var transport = new InMemoryTransport(serializer); - - await transport.StartAsync(); - var received = 0; - - await transport.StartAsync(async ctx => - { - received++; - await ctx.CompleteAsync(); - }); - - var envelope = MessageFactory.Create(new { Text = "hello" }, Guid.NewGuid()); - var sendTask = transport.SendAsync(envelope); - - // Allow consumer loop to pick message - await Task.Delay(50); - - // sendTask should complete when consumer calls CompleteAsync - await sendTask; - Assert.That(received, Is.EqualTo(1)); - - await transport.StopAsync(); - await transport.DisposeAsync(); - } -} diff --git a/UltraSpeedBus.Tests/JsonMessageSerializerTests.cs b/UltraSpeedBus.Tests/JsonMessageSerializerTests.cs deleted file mode 100644 index ce7ee6f..0000000 --- a/UltraSpeedBus.Tests/JsonMessageSerializerTests.cs +++ /dev/null @@ -1,29 +0,0 @@ -using UltraSpeedBus.Serialization; - -namespace UltraSpeedBus.Tests; - -public class JsonMessageSerializerTests -{ - [Test] - public void Serialize_And_Deserialize_Preserves_Metadata_And_Payload() - { - var serializer = new JsonMessageSerializer(); - var payload = new { Name = "Alice", Age = 30 }; - var envelope = MessageFactory.Create(payload, correlationId: Guid.NewGuid()); - envelope.Headers["foo"] = "bar"; - - var bytes = serializer.Serialize(envelope); - var headers = new Dictionary { { "transport", "inmem" } }; - - var deserialized = serializer.Deserialize(bytes, headers); - - Assert.AreEqual(envelope.MessageId, deserialized.MessageId); - Assert.AreEqual(envelope.CorrelationId, deserialized.CorrelationId); - Assert.That(deserialized.Headers.ContainsKey("foo")); - Assert.That(deserialized.Headers["transport"], Is.EqualTo("inmem")); - // payload is JsonElement; try to convert - var je = (System.Text.Json.JsonElement)deserialized.Payload; - var name = je.GetProperty("name").GetString(); - Assert.AreEqual("Alice", name); - } -} \ No newline at end of file diff --git a/UltraSpeedBus.Tests/MessageEnvelopeTests.cs b/UltraSpeedBus.Tests/MessageEnvelopeTests.cs deleted file mode 100644 index f8067c9..0000000 --- a/UltraSpeedBus.Tests/MessageEnvelopeTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Tests; - -public class MessageEnvelopeTests -{ - private class TestMessage { public required string Text { get; set; } } - - [Test] - public void Envelope_Should_Create_Default_Fields() - { - var msg = new TestMessage - { - Text = "Text" - }; - - var envelope = new MessageEnvelope(msg); - - Assert.That(envelope.Payload, Is.EqualTo(msg)); - Assert.That(envelope.MessageId, Is.Not.EqualTo(Guid.Empty)); - Assert.That(envelope.Timestamp, Is.LessThanOrEqualTo(DateTime.UtcNow)); - Assert.That(envelope.Headers, Is.Not.Null); - } -} \ No newline at end of file diff --git a/UltraSpeedBus.Tests/MessageFactoryTests.cs b/UltraSpeedBus.Tests/MessageFactoryTests.cs deleted file mode 100644 index 6d6016c..0000000 --- a/UltraSpeedBus.Tests/MessageFactoryTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace UltraSpeedBus.Tests; - -public class MessageFactoryTests -{ - private class DummyMessage { } - - [Test] - public void MessageFactory_Should_Set_CorrelationId() - { - var correlationId = Guid.NewGuid(); - var msg = new DummyMessage(); - - var envelope = MessageFactory.Create(msg, correlationId); - - Assert.That(envelope.CorrelationId, Is.EqualTo(correlationId)); - } - - [Test] - public void MessageFactory_Should_Not_Set_CorrelationId_When_Null() - { - var msg = new DummyMessage(); - var envelope = MessageFactory.Create(msg); - - Assert.That(envelope.CorrelationId, Is.Null); - } -} \ No newline at end of file diff --git a/UltraSpeedBus/Contexts/ConsumerContext.cs b/UltraSpeedBus/Contexts/ConsumerContext.cs deleted file mode 100644 index 913dc75..0000000 --- a/UltraSpeedBus/Contexts/ConsumerContext.cs +++ /dev/null @@ -1,19 +0,0 @@ -using UltraSpeedBus.Abstractions.Contexts; -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Contexts; - -public class ConsumerContext : MessageContext, IConsumerContext -{ - public object Message => _envelope.Payload; - public int DeliveryCount { get; } - - public ConsumerContext( - MessageEnvelope envelope, - int deliveryCount, - CancellationToken cancellationToken) - : base(envelope, cancellationToken) - { - DeliveryCount = deliveryCount; - } -} diff --git a/UltraSpeedBus/Contexts/MessageContext.cs b/UltraSpeedBus/Contexts/MessageContext.cs deleted file mode 100644 index bca3eab..0000000 --- a/UltraSpeedBus/Contexts/MessageContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using UltraSpeedBus.Abstractions.Contexts; -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Contexts; - -public abstract class MessageContext : IMessageContext -{ - protected readonly MessageEnvelope _envelope; - - - public Guid? MessageId => _envelope.MessageId; - public Guid? CorrelationId => _envelope.CorrelationId; - public DateTime Timestamp => _envelope.Timestamp; - public IReadOnlyDictionary Headers => _envelope.Headers; - - public CancellationToken CancelationToken { get; } - - protected MessageContext(MessageEnvelope envelope, CancellationToken cancellationToken) - { - _envelope = envelope ?? throw new ArgumentNullException(nameof(envelope)); - CancelationToken = cancellationToken; - } -} diff --git a/UltraSpeedBus/Contexts/SendContext.cs b/UltraSpeedBus/Contexts/SendContext.cs deleted file mode 100644 index f317fee..0000000 --- a/UltraSpeedBus/Contexts/SendContext.cs +++ /dev/null @@ -1,19 +0,0 @@ -using UltraSpeedBus.Abstractions.Contexts; -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus.Contexts; - -public class SendContext : MessageContext, ISendContext -{ - public object Payload => _envelope.Payload; - public SendContext( - MessageEnvelope envelope, - CancellationToken cancellationToken) - : base(envelope, cancellationToken) - { - } - public void AddHeader(string key, object? value) - { - _envelope.Headers[key] = value; - } -} \ No newline at end of file diff --git a/UltraSpeedBus/MessageFactory.cs b/UltraSpeedBus/MessageFactory.cs deleted file mode 100644 index 2269f85..0000000 --- a/UltraSpeedBus/MessageFactory.cs +++ /dev/null @@ -1,16 +0,0 @@ -using UltraSpeedBus.Abstractions.Message; - -namespace UltraSpeedBus; - -public static class MessageFactory -{ - public static MessageEnvelope Create(object message, Guid? correlationId = null) - { - var envelope = new MessageEnvelope(message); - - if (correlationId.HasValue) - envelope.CorrelationId = correlationId.Value; - - return envelope; - } -} diff --git a/UltraSpeedBus/Serialization/JsonMessageSerializer.cs b/UltraSpeedBus/Serialization/JsonMessageSerializer.cs deleted file mode 100644 index 381f437..0000000 --- a/UltraSpeedBus/Serialization/JsonMessageSerializer.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Text.Json; -using UltraSpeedBus.Abstractions.Message; -using UltraSpeedBus.Abstractions.Serializer; - -namespace UltraSpeedBus.Serialization; - -public class JsonMessageSerializer : IMessageSerializer -{ - private readonly JsonSerializerOptions _options; - public string ContentType => throw new NotImplementedException(); - - public MessageEnvelope Deserialize(ReadOnlyMemory body, IReadOnlyDictionary headers) - { - using var doc = JsonDocument.Parse(body); - var root = doc.RootElement; - - // Try to reconstruct envelope metadata; payload is left as JsonElement - var messageId = root.TryGetProperty("messageId", out var mid) && mid.ValueKind == JsonValueKind.String - ? Guid.Parse(mid.GetString()!) - : Guid.NewGuid(); - - Guid? correlationId = null; - if (root.TryGetProperty("correlationId", out var cid) && cid.ValueKind == JsonValueKind.String) - correlationId = Guid.Parse(cid.GetString()!); - - var timestamp = root.TryGetProperty("timestamp", out var ts) && ts.ValueKind == JsonValueKind.String - ? DateTime.Parse(ts.GetString()!) - : DateTime.UtcNow; - - object payload = null!; - if (root.TryGetProperty("payload", out var p)) - { - // Keep payload as JsonElement for later conversion by consumer - payload = p.Clone(); - } - - // Merge headers from transport with envelope headers (transport headers may override) - var envelopeHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var kv in headers) envelopeHeaders[kv.Key] = kv.Value; - - // if envelope-level headers exist in JSON, merge them too - if (root.TryGetProperty("headers", out var hdrs) && hdrs.ValueKind == JsonValueKind.Object) - { - foreach (var prop in hdrs.EnumerateObject()) - { - envelopeHeaders[prop.Name] = prop.Value.ValueKind == JsonValueKind.String ? prop.Value.GetString() : prop.Value.ToString(); - } - } - - var envelope = new MessageEnvelope(payload) - { - MessageId = messageId, - CorrelationId = correlationId, - Timestamp = timestamp, - Headers = envelopeHeaders - }; - - return envelope; - } - - public ReadOnlyMemory Serialize(Abstractions.Message.MessageEnvelope envelope) - { - // Represent envelope as object: metadata + payload - var wrapper = new - { - envelope.MessageId, - envelope.CorrelationId, - envelope.Timestamp, - Headers = envelope.Headers, - Payload = envelope.Payload - }; - - var bytes = JsonSerializer.SerializeToUtf8Bytes(wrapper, _options); - return bytes; - } - - public JsonMessageSerializer(JsonSerializerOptions? options = null) - { - _options = options ?? new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, - WriteIndented = false - }; - } -} diff --git a/UltraSpeedBus/Transports/InMemory/InMemoryTransport.cs b/UltraSpeedBus/Transports/InMemory/InMemoryTransport.cs deleted file mode 100644 index 2157511..0000000 --- a/UltraSpeedBus/Transports/InMemory/InMemoryTransport.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.Collections.Concurrent; -using System.Linq.Expressions; -using UltraSpeedBus.Abstractions.Message; -using UltraSpeedBus.Abstractions.Serializer; -using UltraSpeedBus.Abstractions.Transport; - -namespace UltraSpeedBus.Transports.InMemory; - -public class InMemoryTransport : ITransportProducer, ITransportConsumer -{ - private readonly IMessageSerializer _serializer; - private readonly ConcurrentQueue<(MessageEnvelope envelope, TaskCompletionSource tcs)> _queue = new(); - private CancellationTokenSource? _cts; - private Task? _consumerLoop; - - public InMemoryTransport(IMessageSerializer serializer) - { - _serializer = serializer; - } - - public ValueTask DisposeAsync() - { - _cts?.Cancel(); - _cts?.Dispose(); - return ValueTask.CompletedTask; - } - - public Task PublishAsync(MessageEnvelope envelope, CancellationToken cancellationToken = default) - { - // For in-memory, Send & Publish same semantics - return SendAsync(envelope, cancellationToken); - } - - public async Task SendAsync(MessageEnvelope envelope, CancellationToken cancellationToken = default) - { - var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - _queue.Enqueue((envelope, tcs)); - await tcs.Task.WaitAsync(cancellationToken); - } - - public Task StartAsync(CancellationToken cancellationToken = default) - { - _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); - return Task.CompletedTask; - } - - public Task StartAsync(Func onMessage, CancellationToken cancellationToken = default) - { - if (_cts == null) StartAsync(cancellationToken); - - var cts = _cts ?? throw new InvalidOperationException("CancellationTokenSource is not initialized."); - - _consumerLoop = Task.Run(async () => - { - try { - while (!_cts!.Token.IsCancellationRequested) - { - while (_queue.TryDequeue(out var item)) - { - var envelope = item.envelope; - var tcs = item.tcs; - - // Simulate delivery count = 1 - var ctx = new ConsumerTransportContext( - envelope, - deliveryCount: 1, - completeAsync: async () => { tcs.SetResult(true); await Task.CompletedTask; }, - abandonAsync: async () => { tcs.SetResult(false); await Task.CompletedTask; }, - deadLetterAsync: async (r, d) => { tcs.SetResult(false); await Task.CompletedTask; }, - cancellationToken: _cts.Token); - - try - { - await onMessage(ctx); - } - catch - { - // If handler throws and didn't complete, mark abandoned - if (!tcs.Task.IsCompleted) tcs.SetResult(false); - } - } - - await Task.Delay(10, _cts.Token); - } - } - catch (OperationCanceledException) - { - // Expected on cancellation - } - }, _cts.Token); - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken = default) - { - _cts?.Cancel(); - return _consumerLoop ?? Task.CompletedTask; - } -}