#### [Abblix\.SharedSignals](https://www.abblix.com/en/docs/api/abblix-sharedsignals 'index')
### [Abblix\.SharedSignals\.Transmitter](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter 'Abblix\.SharedSignals\.Transmitter')

## EventDispatcher Class

Fans one security event out to the streams it belongs on: for every stream it checks the
status, the delivered event types, the subject coverage \(SSF 1\.0 Section 8\.1\.3\.1\) and \-
last \- the sharing policy \(Section 9\.2\), then mints a per\-stream SET and hands it to the
stream's outbox\. Delivery itself is someone else's clock: a sender drains the outbox for
enabled streams, and a paused stream's events simply wait\.

```csharp
public sealed class EventDispatcher
```

Inheritance [System\.Object](https://learn.microsoft.com/en-us/dotnet/api/system.object 'System\.Object') → EventDispatcher
### Constructors

## EventDispatcher\(ILogger\<EventDispatcher\>, IStreamStore, IEventOutbox, ISecurityEventTokenSigner, string, IEventSharingPolicy, IEventPayloadPolicy, TimeProvider\) Constructor {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider)}

Fans one security event out to the streams it belongs on: for every stream it checks the
status, the delivered event types, the subject coverage \(SSF 1\.0 Section 8\.1\.3\.1\) and \-
last \- the sharing policy \(Section 9\.2\), then mints a per\-stream SET and hands it to the
stream's outbox\. Delivery itself is someone else's clock: a sender drains the outbox for
enabled streams, and a paused stream's events simply wait\.

```csharp
public EventDispatcher(Microsoft.Extensions.Logging.ILogger<Abblix.SharedSignals.Transmitter.EventDispatcher> logger, Abblix.SharedSignals.Transmitter.IStreamStore streams, Abblix.SharedSignals.Transmitter.IEventOutbox outbox, Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner signer, string issuer, Abblix.SharedSignals.Transmitter.IEventSharingPolicy? sharingPolicy=null, Abblix.SecurityEvents.Events.IEventPayloadPolicy? payloadPolicy=null, System.TimeProvider? clock=null);
```
#### Parameters

###### `logger` [Microsoft\.Extensions\.Logging\.ILogger&lt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1 'Microsoft\.Extensions\.Logging\.ILogger\`1')[EventDispatcher](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.EventDispatcher 'Abblix\.SharedSignals\.Transmitter\.EventDispatcher')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1 'Microsoft\.Extensions\.Logging\.ILogger\`1') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).logger}

Records the streams a fan\-out could not reach\.

###### `streams` [IStreamStore](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IStreamStore 'Abblix\.SharedSignals\.Transmitter\.IStreamStore') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).streams}

The transmitter's streams\.

###### `outbox` [IEventOutbox](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IEventOutbox 'Abblix\.SharedSignals\.Transmitter\.IEventOutbox') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).outbox}

Where minted SETs wait for delivery\.

###### `signer` [Abblix\.SecurityEvents\.Abstractions\.ISecurityEventTokenSigner](https://learn.microsoft.com/en-us/dotnet/api/abblix.securityevents.abstractions.isecurityeventtokensigner 'Abblix\.SecurityEvents\.Abstractions\.ISecurityEventTokenSigner') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).signer}

Signs each minted SET\.

###### `issuer` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).issuer}

The transmitter's issuer identifier \- the "iss" of every SET, identical to the issuer the
configuration metadata asserts \(SSF 1\.0 Section 7\.1\)\.

###### `sharingPolicy` [IEventSharingPolicy](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IEventSharingPolicy 'Abblix\.SharedSignals\.Transmitter\.IEventSharingPolicy') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).sharingPolicy}

The host's Section 9\.2 verdict; null shares every otherwise\-matching event, which is the
honest default only for a transmitter whose events carry nothing the receiver may not see\.

###### `payloadPolicy` [Abblix\.SecurityEvents\.Events\.IEventPayloadPolicy](https://learn.microsoft.com/en-us/dotnet/api/abblix.securityevents.events.ieventpayloadpolicy 'Abblix\.SecurityEvents\.Events\.IEventPayloadPolicy') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).payloadPolicy}

What this deployment refuses to emit, over and above what the event vocabulary permits \- how a
deployment claims a profile such as the CAEP Interoperability Profile\. Null emits whatever the host
builds, which is what a transmitter claiming no profile does\.

###### `clock` [System\.TimeProvider](https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider 'System\.TimeProvider') {#Abblix.SharedSignals.Transmitter.EventDispatcher.EventDispatcher(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.EventDispatcher_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SecurityEvents.Abstractions.ISecurityEventTokenSigner,string,Abblix.SharedSignals.Transmitter.IEventSharingPolicy,Abblix.SecurityEvents.Events.IEventPayloadPolicy,System.TimeProvider).clock}

Supplies "iat"; null takes the system clock\.
### Methods

## EventDispatcher\.DispatchAsync\(SecurityEventDescriptor, CancellationToken\) Method {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchAsync(Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,System.Threading.CancellationToken)}

Dispatches one event to every stream it matches\.

```csharp
public System.Threading.Tasks.Task<int> DispatchAsync(Abblix.SharedSignals.Transmitter.SecurityEventDescriptor descriptor, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));
```
#### Parameters

###### `descriptor` [SecurityEventDescriptor](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.SecurityEventDescriptor 'Abblix\.SharedSignals\.Transmitter\.SecurityEventDescriptor') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchAsync(Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,System.Threading.CancellationToken).descriptor}

The event as the application states it\.

###### `cancellationToken` [System\.Threading\.CancellationToken](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken 'System\.Threading\.CancellationToken') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchAsync(Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,System.Threading.CancellationToken).cancellationToken}

Cancels store reads, policy calls and signing\.

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[System\.Int32](https://learn.microsoft.com/en-us/dotnet/api/system.int32 'System\.Int32')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
How many streams the event was enqueued for \- zero is a legitimate answer for
            an event nobody subscribed to\.

## EventDispatcher\.DispatchToStreamAsync\(StreamState, SecurityEventDescriptor, bool, CancellationToken\) Method {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState,Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,bool,System.Threading.CancellationToken)}

Dispatches one event to one stream, skipping the matching checks: the door for the
framework's own signals, which a transmitter may send "even if the event is not present
in the events\_supported, events\_requested and / or events\_delivered fields"
\(SSF 1\.0 Sections 8\.1\.4, 8\.1\.5\) \- and which must go out even to a stream being paused
or disabled, since the stream\-updated event precedes the stop\.

```csharp
public System.Threading.Tasks.Task DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState stream, Abblix.SharedSignals.Transmitter.SecurityEventDescriptor descriptor, bool asStatusAnnouncement=false, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));
```
#### Parameters

###### `stream` [StreamState](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamState 'Abblix\.SharedSignals\.Transmitter\.StreamState') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState,Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,bool,System.Threading.CancellationToken).stream}

The stream the event targets\.

###### `descriptor` [SecurityEventDescriptor](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.SecurityEventDescriptor 'Abblix\.SharedSignals\.Transmitter\.SecurityEventDescriptor') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState,Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,bool,System.Threading.CancellationToken).descriptor}

The event; for verification and stream\-updated its subject is
            the stream's own opaque identifier \(SSF 1\.0 Sections 8\.1\.4\.1, 8\.1\.5\)\.

###### `asStatusAnnouncement` [System\.Boolean](https://learn.microsoft.com/en-us/dotnet/api/system.boolean 'System\.Boolean') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState,Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,bool,System.Threading.CancellationToken).asStatusAnnouncement}

True for the stream\-updated event escorting a transmitter\-initiated status change, so
delivery carries it even over the stream it stops \(SSF 1\.0 Section 8\.1\.5\)\.

###### `cancellationToken` [System\.Threading\.CancellationToken](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken 'System\.Threading\.CancellationToken') {#Abblix.SharedSignals.Transmitter.EventDispatcher.DispatchToStreamAsync(Abblix.SharedSignals.Transmitter.StreamState,Abblix.SharedSignals.Transmitter.SecurityEventDescriptor,bool,System.Threading.CancellationToken).cancellationToken}

Cancels signing and the enqueue\.

#### Returns
[System\.Threading\.Tasks\.Task](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task 'System\.Threading\.Tasks\.Task')
