SsfApi
extends ManagementSupport
in package
A tenant's Shared Signals Framework streams (CONTRACT §32): which receiver -- an OAuth2 client of the tenant -- receives which CAEP and RISC security events, as SETs pushed to its endpoint or polled. The receiver's own protocol (transmitter metadata, the SSF stream management API, polling) is not in this registry.
The ssf namespace handle (CONTRACT.md §27.2), reached as $client->management()->ssf().
Every method here goes through the one shared ManagementTransport, so §3 CSRF, the §4
cookie jar, the §5 tenant header, §6 TLS, §16 retry and §19 telemetry apply without this
class doing anything to opt in (§27.8).
Table of Contents
Methods
- __construct() : mixed
- createStream() : SsfStream
- `POST /api/v1/tenants/{tenant_id}/ssf/streams`
- deleteStream() : void
- `DELETE /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}` — the stream and its buffered events.
- forTenant() : static
- A COPY of this handle scoped to `$tenantId` (§27.4 rule 3). See {@see self::inOrg()} for why it copies.
- getStream() : SsfStream
- `GET /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}`
- inOrg() : static
- A COPY of this handle scoped to `$orgId` (§27.4 rule 3).
- listStreams() : Page<string|int, SsfStream>
- `GET /api/v1/tenants/{tenant_id}/ssf/streams`
- updateStream() : SsfStream
- `PUT /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}` — a **replacement**: an omitted optional member takes its default, except the header, which absent keeps.
Methods
__construct()
public
__construct(ManagementTransport $transport[, NamespaceScope $scope = new NamespaceScope() ][, string|null $clientOrgId = null ][, string|null $clientTenantId = null ]) : mixed
Parameters
- $transport : ManagementTransport
-
The one wire path (§27.8).
- $scope : NamespaceScope = new NamespaceScope()
-
Per-handle
{org_id}/{tenant_id}overrides. - $clientOrgId : string|null = null
-
The client's own organization id, or
null. - $clientTenantId : string|null = null
-
The client's own tenant id, or
null.
createStream()
`POST /api/v1/tenants/{tenant_id}/ssf/streams`
public
createStream(SsfStreamInput $body) : SsfStream
Parameters
- $body : SsfStreamInput
-
the request body
Return values
SsfStreamdeleteStream()
`DELETE /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}` — the stream and its buffered events.
public
deleteStream(string $streamId) : void
DELETE /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}.
Returns nothing; the server answers with an empty body.
NOT idempotent (§27.4 rule 6): deleting something already deleted raises NotFoundError rather than succeeding quietly.
Parameters
- $streamId : string
-
the
{stream_id}path parameter
forTenant()
A COPY of this handle scoped to `$tenantId` (§27.4 rule 3). See {@see self::inOrg()} for why it copies.
public
forTenant(string $tenantId) : static
Parameters
- $tenantId : string
Return values
staticgetStream()
`GET /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}`
public
getStream(string $streamId) : SsfStream
Parameters
- $streamId : string
-
the
{stream_id}path parameter
Return values
SsfStreaminOrg()
A COPY of this handle scoped to `$orgId` (§27.4 rule 3).
public
inOrg(string $orgId) : static
Returns a new handle rather than mutating this one. An administrator holding a handle to their own organization should not find it repointed at someone else's because an unrelated code path re-scoped a shared object — and on a management surface that failure mode writes to the wrong tenant rather than merely reading from it.
Parameters
- $orgId : string
Return values
staticlistStreams()
`GET /api/v1/tenants/{tenant_id}/ssf/streams`
public
listStreams([PageRequest|null $page = null ]) : Page<string|int, SsfStream>
Returns ONE page. Page::$total is the server's count across all pages and is not
count($page) — see §27.4 rule 4.
Parameters
- $page : PageRequest|null = null
-
which page to fetch; defaults to the first
Return values
Page<string|int, SsfStream>updateStream()
`PUT /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}` — a **replacement**: an omitted optional member takes its default, except the header, which absent keeps.
public
updateStream(string $streamId, SsfStreamInput $body) : SsfStream
PUT /api/v1/tenants/{tenant_id}/ssf/streams/{stream_id}.
An omitted optional member takes its default (§32.2) -- except authorization_header,
which absent keeps the stored one -- unless the update moves endpoint_url to another
scheme, host or port while a header is stored: then it must carry authorization_header
again or clear_authorization_header: true, else 400 (§32.3 rule 5). On an update the
omitted members take these defaults: description, endpoint_url and status_reason
null, events_requested every event of events_allowed, subject_format iss_sub,
status enabled, clear_authorization_header false. events_requested has three
meanings (§32.2, contract 1.62), and they are not interchangeable: absent (the
property left null) resets the stream to every event of events_allowed, widening
a narrowing the receiver made; [] is stored as the receiver's "none" -- it does not
widen, and the stream carries nothing; a list is stored as given and refused (400) if
any entry is outside events_allowed. A caller with no SDK is bound by the same
meaning: an events_requested left out of the PUT resets the stream. An edit
therefore sends back the events_requested and the expected_updated_at it read --
the updated_at string exactly as the response carried it, which makes the update
conditional on that version (409 if the stream was written since, by the receiver as
well as by an administrator; never retried) -- and, when it lowers events_allowed,
cuts events_requested to the new ceiling. Start from ReadModifyWrite::ssfStream(), which does all of that: it takes
the stream you read and the changes you want. An update overtaken by the receiver's own
write is 409: read the stream again.
Parameters
- $streamId : string
-
the
{stream_id}path parameter - $body : SsfStreamInput
-
the request body