v3.0.0
+
BREAKING CHANGES
+
+IDispatchTracker<TAction> is not longer taking a TAction and the service is no longer register per action but instead as a scope service IDispatchTracker.
+IDispatcher.Prepare<TAction>().DispatchAsync(CancellationToken ct = default) no longer returns Guid as it was unused artifacts of a idea of a system for cancellations.
+IDispatcher.Prepare<TAction>().DispatchAsync(bool asSafe = false, CancellationToken ct = default) no longer takes bool as first param instead use fluent api .AsSafe() to achieve the same result.
+
+
WARNING CHANGES
+
+IDispatcherMiddleware.OnDispatchFailure(Exception exception, object action); renamed arguments to IDispatcherMiddleware.OnDispatchFailure(Exception ex, object action); which could trigger compiler warnings.
+
+
+
New Features
+
+- Dispatch now supports Cancellation tokens.
+- Token are passed down to all subsequent chain until you define a different one
DispatchAsync(false,new CT);.
+.DoNotAwait() is now available, design for effect sub-dispatches when specific dispatch should not be awaited in case the origin call awaits the full pipeline... some tasks should not be awaited? that's your method.
+- Access Token from effects using
dispatcher.CancelToken which is default or correspond to upper chain origin.
+- You can check if you shouldd stop execution of effect using
dispatcher.IsCancellationRequested.
+dispatcher.IsCancellationRequested include now if the anti-duplication chain that was cancelled but slipped through the cracks if any you can now catch it in the effects.
+dispatcer.AsSafe() replaces the first param IDispatcher.Prepare<TAction>().DispatchAsync(bool asSafe = false, CancellationToken ct = default) to execute the context with race condition resistance.
+dispatcer.AsUnSafe() turn off the the rc resistance, it is useful to disconnect a usually safe flow to prevent cancellation.
+
+
+
+- Improved Dispatcher Performance up to 24% by removing class creation via reflection at every dispatch.
+- Improved Dispatch Performance up to 20% by only performing allocation for the middleware class when middlewares are actually present. (Note: the second you start adding middleware slight performance drop is expected).
+- Improved Reducer Performance, we initially tested every single state registered to compare if the running action had reducers... now we get reducers by Action or by State directly.
+
+
Major Fixes
+
+- Await feature did not await the full pipeline, subsequent dispatches were set as normal fire-and-yield unless specified. Now the await feature passes down the await flag thus fully awaiting as the intended feature was design for.
+
+
v2.2.0
Fix
- Major fix of Middleware not able to be registered multiple times therefore prevent multiple middleware to work for same interface.
v2.1.0
-
+
- The Global Tracker now uses an event‑based mechanism to invoke Self Disposal Check directly on each
IStatePulse instance, removing the need to iterate the internal registry. The registry itself is scheduled for removal in version 3.0 and is now marked with the appropriate Obsolete attribute. Cleanup is no longer driven by a continuous loop; instead, the tracker schedules a self‑check only when activity occurs in the registry and goes idle when the application becomes inactive. This preserves memory‑leak protection without a permanent cycle. A minimum delay of 10 seconds is enforced between checks, and when burst activity occurs, only the final activity triggers a single final cleanup run rather than multiple redundant executions.
Fix
This is one of those “bug or feature?” situations. By design, StateOf<TState>() is meant to notify the component when its state changes. However, earlier Blazor assumptions overlooked scenarios where one state might render through one route while another state uses a different route.
-
Before version 2.0.11, StatePulse always treated the latest route as the default route for all states registered by a component, this is was BUG. Starting with 2.0.11, each state that a component subscribes to StatePulse now respects those route differences if any.
+
Before version 2.1.0, StatePulse always treated the latest route as the default route for all states registered by a component, this is was BUG. Starting with 2.1.0, each state that a component subscribes to StatePulse now respects those route differences if any.
v2.0.1
Fixes
- Moved Fluent API Extension Methods into Abstraction Package.
v2.0.0
-
BREAKING CHANGES
+
BREAKING CHANGES
-
New Features
+
New Features
- Enhanced Configuration Options - New global configuration properties:
@@ -148,7 +181,7 @@ Minor Change<
- Splited Abstractions into StatePulse.Net.Abstractions (Will not break anything Namespace is the same)
v1.0.0
-New Features
+New Features
- Action Effect Validator: Allows effects to run conditionally by validating them before execution.
- Middleware Support:
@@ -222,6 +255,6 @@
v0.9.2
- Deprecated now part of StatePulse regular since we have removed the dependencies to blazor component.
... that was quick!
-