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

## PushDeliverySender Class

One delivery pass of a stream's outbox over push \(RFC 8935, carried by SSF 1\.0
Section 6\.1\.1\): each pending SET is POSTed to the receiver's endpoint in enqueue order, an
accepted one is acknowledged out of the queue, and the pass stops at the first transient
failure so order survives into the next pass \- which is also where retry lives: the caller's
schedule IS the backoff, and this type stays a single honest attempt\.

```csharp
public sealed class PushDeliverySender
```

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

## PushDeliverySender\(HttpClient, IEventOutbox, ReceiverAddressPolicy, ILogger\<PushDeliverySender\>\) Constructor {#Abblix.SharedSignals.Transmitter.PushDeliverySender.PushDeliverySender(System.Net.Http.HttpClient,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy,Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliverySender_)}

One delivery pass of a stream's outbox over push \(RFC 8935, carried by SSF 1\.0
Section 6\.1\.1\): each pending SET is POSTed to the receiver's endpoint in enqueue order, an
accepted one is acknowledged out of the queue, and the pass stops at the first transient
failure so order survives into the next pass \- which is also where retry lives: the caller's
schedule IS the backoff, and this type stays a single honest attempt\.

```csharp
public PushDeliverySender(System.Net.Http.HttpClient httpClient, Abblix.SharedSignals.Transmitter.IEventOutbox outbox, Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy addressPolicy, Microsoft.Extensions.Logging.ILogger<Abblix.SharedSignals.Transmitter.PushDeliverySender> logger);
```
#### Parameters

###### `httpClient` [System\.Net\.Http\.HttpClient](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient 'System\.Net\.Http\.HttpClient') {#Abblix.SharedSignals.Transmitter.PushDeliverySender.PushDeliverySender(System.Net.Http.HttpClient,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy,Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliverySender_).httpClient}

The client transmissions travel through\.

###### `outbox` [IEventOutbox](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IEventOutbox 'Abblix\.SharedSignals\.Transmitter\.IEventOutbox') {#Abblix.SharedSignals.Transmitter.PushDeliverySender.PushDeliverySender(System.Net.Http.HttpClient,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy,Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliverySender_).outbox}

The queues being drained\.

###### `addressPolicy` [ReceiverAddressPolicy](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy 'Abblix\.SharedSignals\.Transmitter\.ReceiverAddressPolicy') {#Abblix.SharedSignals.Transmitter.PushDeliverySender.PushDeliverySender(System.Net.Http.HttpClient,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy,Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliverySender_).addressPolicy}

Judges the receiver's address before anything is sent to it\.

###### `logger` [Microsoft\.Extensions\.Logging\.ILogger&lt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1 'Microsoft\.Extensions\.Logging\.ILogger\`1')[PushDeliverySender](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.PushDeliverySender 'Abblix\.SharedSignals\.Transmitter\.PushDeliverySender')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1 'Microsoft\.Extensions\.Logging\.ILogger\`1') {#Abblix.SharedSignals.Transmitter.PushDeliverySender.PushDeliverySender(System.Net.Http.HttpClient,Abblix.SharedSignals.Transmitter.IEventOutbox,Abblix.SharedSignals.Transmitter.ReceiverAddressPolicy,Microsoft.Extensions.Logging.ILogger_Abblix.SharedSignals.Transmitter.PushDeliverySender_).logger}

Carries the receiver's own reason for a refusal into this deployment's log\.
### Methods

## PushDeliverySender\.SendPendingAsync\(StreamState, CancellationToken\) Method {#Abblix.SharedSignals.Transmitter.PushDeliverySender.SendPendingAsync(Abblix.SharedSignals.Transmitter.StreamState,System.Threading.CancellationToken)}

Sends what one stream has pending\.

```csharp
public System.Threading.Tasks.Task<Abblix.SharedSignals.Transmitter.PushDeliveryPassOutcome> SendPendingAsync(Abblix.SharedSignals.Transmitter.StreamState stream, 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.PushDeliverySender.SendPendingAsync(Abblix.SharedSignals.Transmitter.StreamState,System.Threading.CancellationToken).stream}

The stream whose queue is drained\.

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

Cancels the pass between transmissions\.

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[PushDeliveryPassOutcome](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.PushDeliveryPassOutcome 'Abblix\.SharedSignals\.Transmitter\.PushDeliveryPassOutcome')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
How the pass went: what was delivered, what the receiver rejected\.

### Remarks
A stream that is not enabled sends nothing except status announcements \- holding is the
pause's meaning \(SSF 1\.0 Section 8\.1\.2\.1\), and the announcement is the one item that
must still go out, since Section 8\.1\.5 wants it with the receiver although the stop has
already happened here\.

A "400 Bad Request" carries the receiver's verdict in its body (RFC 8935 Section 2.3), and the verdict
rather than the status decides what happens to the event. RFC 8935 Section 4 separates the two cases:
a structural complaint "is likely to remain when retransmitting the same SET", so the event is dropped
instead of poisoning the head of the queue, while a complaint about the transmitter's credentials or
authorization "may be transient" and the event stays queued for a pass made after the deployment fixes
what the receiver objected to.
