Skip to content

SharedSignalsTransmitterOptions Class

What a transmitter deployment decides once: its identity, its event vocabulary, and the policies SSF 1.0 leaves to the implementation - how many streams a receiver may hold (Section 8.1.1.1), what a new stream covers by default (Section 7.1), and how often verification may be asked for (Section 8.1.1).

C#
public sealed record SharedSignalsTransmitterOptions : System.IEquatable<Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions>

Inheritance System.Object → SharedSignalsTransmitterOptions

Implements System.IEquatable<SharedSignalsTransmitterOptions>

Properties

SharedSignalsTransmitterOptions.AllowedReceiverAddresses Property

The receiver origins this deployment may deliver to whatever their address, matched by scheme, host and port. Empty leaves every receiver to the ordinary rules: HTTPS, and an address outside the deployment's own network.

C#
public System.Collections.Generic.IReadOnlyList<System.Uri> AllowedReceiverAddresses { get; init; }

Property Value

System.Collections.Generic.IReadOnlyList<System.Uri>

Remarks

A receiver names its own delivery endpoint, so the address arrives from outside and is refused when it points inside the network. That refusal is wrong for exactly one deployment shape: a receiver of the operator's own, reached at a private address. Naming it here is how an operator says so, and it is deliberately an origin rather than a switch, so permitting one receiver does not permit the rest.

SharedSignalsTransmitterOptions.AllowMultipleStreamsPerReceiver Property

Whether one receiver may hold several streams. When false - the default - a second create answers "409 Conflict", and the receiver's move is to read and update the stream it has (SSF 1.0 Section 8.1.1.1).

C#
public bool AllowMultipleStreamsPerReceiver { get; init; }

Property Value

System.Boolean

SharedSignalsTransmitterOptions.AudiencesFactory Property

Derives the "aud" of a receiver's streams from the receiver's identity. The default uses the identity itself: "Values that uniquely identify the Receiver to the Transmitter MAY be used" (SSF 1.0 Section 4.1.8).

C#
public System.Func<string,System.Collections.Generic.IReadOnlyList<string>>? AudiencesFactory { get; init; }

Property Value

System.Func<System.String,System.Collections.Generic.IReadOnlyList<System.String>>

SharedSignalsTransmitterOptions.AuthorizationSchemes Property

The authorization scheme descriptions the configuration metadata advertises (SSF 1.0 Section 7.1.1), kept as raw JSON because their shape is scheme-specific and authorization itself is the host's, not this package's.

C#
public System.Collections.Generic.IReadOnlyList<System.Text.Json.Nodes.JsonObject>? AuthorizationSchemes { get; init; }

Property Value

System.Collections.Generic.IReadOnlyList<System.Text.Json.Nodes.JsonObject>

Remarks

Three settings, and the first of them makes an assertion on the deployment's behalf.

  • Left unset, the document advertises OAuth 2.0 - the value the CAEP Interoperability Profile 1.0 Section 2.3.7 requires and Section 2.4.3 requires receivers to use. That is a claim about how this deployment authorizes its Stream Management API, made by this package because the profile demands it and most deployments do exactly that. A deployment authorizing by something else must not leave it unset.
  • Set to a list, the member is that list verbatim. The host owns it, including whether the OAuth entry is in it, and is told once at startup if it is not.
  • Set to an EMPTY list, the member is omitted entirely. That is how a deployment says it advertises no scheme at all, and nothing warns about it, because it is a decision rather than an oversight.

SharedSignalsTransmitterOptions.DefaultSubjectsMode Property

What a newly created stream covers by default (SSF 1.0 Section 7.1). The conservative default is None: nothing flows until the receiver names its subjects, so a misconfigured stream leaks nothing.

C#
public Abblix.SharedSignals.Transmitter.StreamSubjectsMode DefaultSubjectsMode { get; init; }

Property Value

StreamSubjectsMode

Remarks

A deployment targeting the CAEP Interoperability Profile 1.0 sets this to All. Its Section 2.4.4 tells a receiver to "assume that all subjects are implicitly included in a Stream, without any Add Subject method invocations", so a conformant receiver adds none - and against a transmitter covering nothing by default it receives nothing, with no error on either side to say why. The profile binds only the receiver, so the default is left where it is and said out loud at startup instead.

Changing it reaches only streams created afterwards, because a stream takes its mode at creation - which is what keeps a later change from silently re-scoping what a receiver already has. What is left behind therefore depends on the store: the in-memory default keeps nothing across the restart the change requires, a configured stream set writes the declared mode over every stream on the next reconcile, and a store outliving the process keeps its streams at the mode they were created with. The startup warning stops the moment this option changes, in all three.

SharedSignalsTransmitterOptions.DefaultSubjectsValue Property

The "default_subjects" value the mode advertises, kept beside the enum so the wire word and the behavior cannot drift apart.

C#
public string DefaultSubjectsValue { get; }

Property Value

System.String

SharedSignalsTransmitterOptions.EventsSupported Property

The event types this transmitter can emit, advertised in each stream's "events_supported"; what a stream actually carries is the intersection with the receiver's request (SSF 1.0 Section 8.1.1).

C#
public System.Collections.Generic.IReadOnlyList<string> EventsSupported { get; init; }

Property Value

System.Collections.Generic.IReadOnlyList<System.String>

SharedSignalsTransmitterOptions.Issuer Property

The transmitter's issuer identifier: the "iss" of every SET and of every stream configuration, identical to what the configuration metadata asserts (SSF 1.0 Sections 7.1, 4.1.6).

C#
public string Issuer { get; init; }

Property Value

System.String

SharedSignalsTransmitterOptions.JwksUri Property

Where this transmitter publishes the JWK Set its SETs verify against, advertised as "jwks_uri" (SSF 1.0 Section 7.1). Required in practice AND on paper: that section says "This value MUST be specified if the Transmitter intends to generate signed JWTs", and this transmitter signs every event it sends. Left null, no receiver can obtain a key and the deployment is told so at startup.

C#
public System.Uri? JwksUri { get; init; }

Property Value

System.Uri

SharedSignalsTransmitterOptions.MinVerificationInterval Property

The least time between verification requests, advertised as "min_verification_interval" and enforced with "429 Too Many Requests" (SSF 1.0 Sections 8.1.1, 8.1.4.2); null advertises no bound and throttles nothing.

C#
public System.Nullable<System.TimeSpan> MinVerificationInterval { get; init; }

Property Value

System.Nullable<System.TimeSpan>

SharedSignalsTransmitterOptions.PollEndpointFactory Property

Where the outside world reaches this transmitter's poll endpoint for a stream (SSF 1.0 Section 6.1.2). Unset takes the address the poll route was mapped on, so a host that maps the transmitter's endpoints offers poll delivery without naming anything.

C#
public System.Func<string,System.Uri>? PollEndpointFactory { get; init; }

Property Value

System.Func<System.String,System.Uri>

Remarks

Set it when the poll address is not this deployment's advertised prefix plus the poll route on the issuer's authority - a separate host name for delivery, say, or a path the route shape cannot express. A proxy that merely REWRITES paths needs nothing here: AdvertisedPrefix is what the mapping declares, so the poll address follows it along with the five management addresses. It wins over the mapped address wherever both exist.

It is also how a host that maps its own routes - on some other web framework, or by hand - offers poll at all, since nothing else then knows the address. With neither source the transmitter offers no poll delivery: the configuration document omits the method, and a create asking for poll, or omitting delivery, which Section 8.1.1.1 reads as poll, is refused with "400 Bad Request".

SharedSignalsTransmitterOptions.PushDeliveryInterval Property

How often the transmitter sweeps its push streams and delivers what is queued; null leaves the sweeping to the host.

C#
public System.Nullable<System.TimeSpan> PushDeliveryInterval { get; init; }

Property Value

System.Nullable<System.TimeSpan>

Remarks

Push delivery is the transmitter reaching out, so something has to decide when. A default rather than an opt-in because the alternative fails silently: every part works, none of them is called, and a host sees streams created and events queued with nothing delivered and nothing logged. Null is for a host that drives passes itself - from its own scheduler, or one pass per business event.

SharedSignalsTransmitterOptions.PushDeliveryLeaseDuration Property

How long one instance's claim on a stream's delivery holds, and therefore the longest a single pass over that stream may run.

C#
public System.TimeSpan PushDeliveryLeaseDuration { get; init; }

Property Value

System.TimeSpan

Remarks

The claim keeps concurrent instances off one another's streams, and it expires because expiry is the only release an instance that died mid-pass can perform. That makes this one value two limits at once, erring in opposite directions and both of them safe: too short cuts a legitimate pass off at the deadline and its remainder goes out on the next one, too long parks a stream for the rest of the claim after the instance holding it dies. The default is comfortably longer than a pass over a responsive receiver and well short of an outage anybody would sit through.