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

## StreamState Class

Everything the transmitter holds about one stream: the configuration document the receiver
sees \(SSF 1\.0 Section 8\.1\.1\), the status \(Section 8\.1\.2\), and the subject bookkeeping the
receiver drives through the subject endpoints \(Section 8\.1\.3\)\. An immutable snapshot \- the
store replaces whole states, so a half\-applied update is unrepresentable\.

```csharp
public sealed record StreamState : System.IEquatable<Abblix.SharedSignals.Transmitter.StreamState>
```

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

Implements [System\.IEquatable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1 'System\.IEquatable\`1')[StreamState](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamState 'Abblix\.SharedSignals\.Transmitter\.StreamState')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1 'System\.IEquatable\`1')

### Remarks
The JSON member names are pinned rather than left to the property names, because a durable
[IStreamStore](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IStreamStore 'Abblix\.SharedSignals\.Transmitter\.IStreamStore') persists this type: without them a C\# rename \- a refactor with no
wire consequence anywhere else \- either breaks reading every stored registration or, for the
optional members, silently resets it, so a stream a receiver had paused would come back
enabled\. The names are storage, not protocol: the document a receiver reads back is
[Configuration](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamState#Abblix.SharedSignals.Transmitter.StreamState.Configuration 'Abblix\.SharedSignals\.Transmitter\.StreamState\.Configuration'), which carries its own\.
### Properties

## StreamState\.AddedSubjects Property {#Abblix.SharedSignals.Transmitter.StreamState.AddedSubjects}

The subjects the receiver added \(SSF 1\.0 Section 8\.1\.3\.2\)\. Under
[None](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamSubjectsMode#Abblix.SharedSignals.Transmitter.StreamSubjectsMode.None 'Abblix\.SharedSignals\.Transmitter\.StreamSubjectsMode\.None') these are the coverage; under
[All](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamSubjectsMode#Abblix.SharedSignals.Transmitter.StreamSubjectsMode.All 'Abblix\.SharedSignals\.Transmitter\.StreamSubjectsMode\.All') they undo earlier removals\.

```csharp
public System.Collections.Generic.IReadOnlyList<Abblix.SharedSignals.Transmitter.StreamSubject> AddedSubjects { get; init; }
```

#### Property Value
[System\.Collections\.Generic\.IReadOnlyList&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlylist-1 'System\.Collections\.Generic\.IReadOnlyList\`1')[StreamSubject](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamSubject 'Abblix\.SharedSignals\.Transmitter\.StreamSubject')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlylist-1 'System\.Collections\.Generic\.IReadOnlyList\`1')

## StreamState\.Configuration Property {#Abblix.SharedSignals.Transmitter.StreamState.Configuration}

The stream's configuration document, exactly as the receiver reads it back\.

```csharp
public Abblix.SharedSignals.Model.StreamConfiguration Configuration { get; init; }
```

#### Property Value
[StreamConfiguration](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Model.StreamConfiguration 'Abblix\.SharedSignals\.Model\.StreamConfiguration')

## StreamState\.LastVerificationRequestAt Property {#Abblix.SharedSignals.Transmitter.StreamState.LastVerificationRequestAt}

When the receiver last triggered a verification event, the fact the
"min\_verification\_interval" throttle is measured against \(SSF 1\.0 Sections 8\.1\.1,
8\.1\.4\.2\); null before the first trigger\.

```csharp
public System.Nullable<System.DateTimeOffset> LastVerificationRequestAt { get; init; }
```

#### Property Value
[System\.Nullable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.nullable-1 'System\.Nullable\`1')[System\.DateTimeOffset](https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset 'System\.DateTimeOffset')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.nullable-1 'System\.Nullable\`1')

## StreamState\.ReceiverId Property {#Abblix.SharedSignals.Transmitter.StreamState.ReceiverId}

The identity of the receiver the stream belongs to, as the host's authentication
established it\. The transmitter may serve every receiver from the same endpoints and
tell them apart by credentials \(SSF 1\.0 Section 8\.1\) \- this is where that identity
lands, and every management operation is scoped by it\.

```csharp
public string ReceiverId { get; init; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

## StreamState\.RemovedSubjects Property {#Abblix.SharedSignals.Transmitter.StreamState.RemovedSubjects}

The subjects the receiver removed \(SSF 1\.0 Section 8\.1\.3\.3\) \- meaningful under
[All](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.StreamSubjectsMode#Abblix.SharedSignals.Transmitter.StreamSubjectsMode.All 'Abblix\.SharedSignals\.Transmitter\.StreamSubjectsMode\.All'), where they carve subjects out of the default
coverage\.

```csharp
public System.Collections.Generic.IReadOnlyList<Abblix.SecurityEvents.Subjects.SubjectIdentifier> RemovedSubjects { get; init; }
```

#### Property Value
[System\.Collections\.Generic\.IReadOnlyList&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlylist-1 'System\.Collections\.Generic\.IReadOnlyList\`1')[Abblix\.SecurityEvents\.Subjects\.SubjectIdentifier](https://learn.microsoft.com/en-us/dotnet/api/abblix.securityevents.subjects.subjectidentifier 'Abblix\.SecurityEvents\.Subjects\.SubjectIdentifier')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlylist-1 'System\.Collections\.Generic\.IReadOnlyList\`1')

## StreamState\.Status Property {#Abblix.SharedSignals.Transmitter.StreamState.Status}

The stream's status value, one of [StreamStatuses](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Model.StreamStatuses 'Abblix\.SharedSignals\.Model\.StreamStatuses')\. A stream starts enabled:
creating one is the receiver asking for events, and a default that needed a second call
to start the flow would read as a broken stream\.

```csharp
public string Status { get; init; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

## StreamState\.StatusReason Property {#Abblix.SharedSignals.Transmitter.StreamState.StatusReason}

Why the status is what it is, when anyone said \(SSF 1\.0 Section 8\.1\.2\)\.

```csharp
public string? StatusReason { get; init; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

## StreamState\.StreamId Property {#Abblix.SharedSignals.Transmitter.StreamState.StreamId}

The stream's identifier, read off the configuration \- one value, one owner\.

```csharp
public string StreamId { get; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

## StreamState\.SubjectsMode Property {#Abblix.SharedSignals.Transmitter.StreamState.SubjectsMode}

Which subjects the stream covers by default, fixed at creation from the transmitter's
advertisement \(SSF 1\.0 Section 7\.1\)\.

```csharp
public Abblix.SharedSignals.Transmitter.StreamSubjectsMode SubjectsMode { get; init; }
```

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

## StreamState\.Version Property {#Abblix.SharedSignals.Transmitter.StreamState.Version}

What the store's copy looked like when this one was read, so a write can tell whether
anything happened in between\.

```csharp
public string? Version { get; init; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

### Remarks
Every mutation of a stream is a read, a change in memory and a write back, and without this
the write is unconditional: two calls adding a subject at once both read the same list, both
write, both are answered 200, and one addition is gone\. SSF 1\.0 Section 9\.1 tells a receiver
that a success says nothing about what the transmitter did, so it never retries and never
learns\.

Opaque, and the store's to mint: a caller passes back what it was given, and
[UpdateAsync\(StreamState, CancellationToken\)](https://www.abblix.com/en/docs/api/abblix-sharedsignals/Abblix.SharedSignals.Transmitter.IStreamStore#Abblix.SharedSignals.Transmitter.IStreamStore.UpdateAsync(Abblix.SharedSignals.Transmitter.StreamState,System.Threading.CancellationToken) 'Abblix\.SharedSignals\.Transmitter\.IStreamStore\.UpdateAsync\(Abblix\.SharedSignals\.Transmitter\.StreamState, System\.Threading\.CancellationToken\)') refuses a write carrying anything else. Null belongs
to a state that was built rather than read, which is why creation has its own method.
