#### [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')

## PushDeliveryScheduler Class

Drains every push stream's queue on a timer\.

```csharp
public sealed class PushDeliveryScheduler : Microsoft.Extensions.Hosting.BackgroundService
```

Inheritance [System\.Object](https://learn.microsoft.com/en-us/dotnet/api/system.object 'System\.Object') → [Microsoft\.Extensions\.Hosting\.BackgroundService](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice 'Microsoft\.Extensions\.Hosting\.BackgroundService') → PushDeliveryScheduler

### Remarks
Push delivery is the transmitter reaching out, so something has to decide when\. Without this a
host that wired the transmitter and mapped its endpoints got streams created, events minted,
signed and queued \- and nothing delivered, with nothing logged and no error anywhere, because
every part worked and none of them was called\. Poll streams worked throughout, which made it
read as "push is broken" rather than "push was never started"\.

A pass is best-effort by design. One stream's failure must not stop the others, so each is
caught and logged and the sweep continues; the sender itself decides what a failed delivery
means for the queue, keeping a transient refusal and dropping a final one.

Every instance of the application runs this, so each stream is claimed through an
[IDeliveryLease](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IDeliveryLease 'Abblix\.SharedSignals\.Transmitter\.IDeliveryLease') before it is swept. Without that, a pass reads a queue the other
instances are reading at the same moment and every one of them POSTs the same SETs - which
RFC 8935 Section 2 tells a transmitter not to do outside a suspected recoverable failure. The
claim is what makes running N instances a division of the streams rather than N copies of the
work.
### Constructors

## PushDeliveryScheduler\(ILogger\<PushDeliveryScheduler\>, IStreamStore, PushDeliverySender, IDeliveryLease, SharedSignalsTransmitterOptions, TimeProvider\) Constructor {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider)}

Drains every push stream's queue on a timer\.

```csharp
public PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger<Abblix.SharedSignals.Transmitter.PushDeliveryScheduler> logger, Abblix.SharedSignals.Transmitter.IStreamStore store, Abblix.SharedSignals.Transmitter.PushDeliverySender sender, Abblix.SharedSignals.Transmitter.IDeliveryLease lease, Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions options, System.TimeProvider timeProvider);
```
#### 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')[PushDeliveryScheduler](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.PushDeliveryScheduler 'Abblix\.SharedSignals\.Transmitter\.PushDeliveryScheduler')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1 'Microsoft\.Extensions\.Logging\.ILogger\`1') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).logger}

Records what a pass did, and what it could not do\.

###### `store` [IStreamStore](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IStreamStore 'Abblix\.SharedSignals\.Transmitter\.IStreamStore') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).store}

Where the streams to sweep are read from\.

###### `sender` [PushDeliverySender](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.PushDeliverySender 'Abblix\.SharedSignals\.Transmitter\.PushDeliverySender') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).sender}

Performs one stream's pass\.

###### `lease` [IDeliveryLease](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IDeliveryLease 'Abblix\.SharedSignals\.Transmitter\.IDeliveryLease') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).lease}

Decides which instance sweeps a given stream this round\.

###### `options` [SharedSignalsTransmitterOptions](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions 'Abblix\.SharedSignals\.Transmitter\.SharedSignalsTransmitterOptions') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).options}

Carries the interval between passes and the claim's duration\.

###### `timeProvider` [System\.TimeProvider](https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider 'System\.TimeProvider') {#Abblix.SharedSignals.Transmitter.PushDeliveryScheduler.PushDeliveryScheduler(Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliveryScheduler_,Abblix.SharedSignals.Transmitter.IStreamStore,Abblix.SharedSignals.Transmitter.PushDeliverySender,Abblix.SharedSignals.Transmitter.IDeliveryLease,Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions,System.TimeProvider).timeProvider}

The clock the timer and the deadlines run on; a test hands in a fake\.

### Remarks
Push delivery is the transmitter reaching out, so something has to decide when\. Without this a
host that wired the transmitter and mapped its endpoints got streams created, events minted,
signed and queued \- and nothing delivered, with nothing logged and no error anywhere, because
every part worked and none of them was called\. Poll streams worked throughout, which made it
read as "push is broken" rather than "push was never started"\.

A pass is best-effort by design. One stream's failure must not stop the others, so each is
caught and logged and the sweep continues; the sender itself decides what a failed delivery
means for the queue, keeping a transient refusal and dropping a final one.

Every instance of the application runs this, so each stream is claimed through an
[IDeliveryLease](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IDeliveryLease 'Abblix\.SharedSignals\.Transmitter\.IDeliveryLease') before it is swept. Without that, a pass reads a queue the other
instances are reading at the same moment and every one of them POSTs the same SETs - which
RFC 8935 Section 2 tells a transmitter not to do outside a suspected recoverable failure. The
claim is what makes running N instances a division of the streams rather than N copies of the
work.
