-
Notifications
You must be signed in to change notification settings - Fork 19
Description
In previous discussion, it was decided that we needed a way for there to be potentially more than one stream between a transmitter and receiver. Some use cases for this were the needs of GDPR to keep data localized, having different polling frequencies for different types of events, etc. What follows is a high-level proposal for how we could add stream IDs without significantly changing the structure of the SSE framework. I would like to have some discussion here so that the high-level details can be settled before I create a pull request for the change.
Support for default and/or named streams
First of all, because stream IDs dictate something about how the data model works, transmitters should be able to decide whether they support streams with IDs or not. Currently, there is a single default stream per receiver. I propose adding a new optional property to the transmitter configuration response from /.well-known/sse-configuration:
stream_types: [
"https://schemas.openid.net/secevent/stream_type/default",
"https://schemas.openid.net/secevent/stream_type/named"
]
This allows the transmitter to support both default and named streams. Many, perhaps most, receivers will only care about having a single stream, so continuing to support a default stream is user friendly.
The default stream does not need to be created. It exists as soon as there is a transmitter/receiver relations if the transmitter supports default streams. Any named streams must be explicitly created.
Changes to the configuration_endpoint
Changes to the stream configuration object
The most significant changes to the spec are centered around the configuration_endpoint, in the GET, POST and DELETE verbs, as well as in a new PATCH verb (detailed below).
With the exception of DELETE, all of these verbs either take a Stream Configuration object as an argument or return a Stream Configuration object. In all cases, we would update the Stream Configuration object to include a new optional parameter, stream_id:
- stream_id (if missing, assume default stream)
- iss (read only)
- aud (read only)
- events_supported (read only)
- events_delivered (read only)
- min_verification_interval (read only)
- events_requested (read/write)
- delivery (read/write)
- format (read/write)
In some ways, you could think of a default stream as a stream whose stream_id is null.
Create a Stream - configuration_endpoint [POST]
Creates a new stream
Arguments
- stream configuration object
- All attributes of the object are optional (but will raise error if
stream_idis missing)
- All attributes of the object are optional (but will raise error if
Results
- 200: New stream created, returns stream configuration object
- 400: Request cannot be parsed or a read-only value is present and incorrect
- 401: Authorization failed or is missing
- 403: Event receiver is not allowed to create a stream
- 409: A stream with
stream_idalready exists. Because the default stream always exists, calling this endpoint without astream_idwill always raise a 409 (or 501 if default streams are not supported) - 501: Not implemented. A
stream_idis present and named streams are not supported, orstream_idis missing and default streams are not supported.
Get Stream Configuration - configuration_endpoint [GET]
Gets the configuration of a stream.
Arguments
stream_id(optional)
Results
- 200: If the
stream_idargument is provided, returns the stream configuration object with thatstream_id. Otherwise, returns the stream configuration of the default stream. - 401: Authorization failed or is missing
- 403: Event receiver is not allowed to get streams
- 404: A
stream_idis present and the stream does not exist, orstream_idis missing and default streams are not supported.
Update a Stream - configuration_endpoint [PATCH]
Updates a stream's configuration.
Arguments
- A stream configuration object
Results
- 200: Stream updated, returns stream configuration object
- 400: Request cannot be parsed or read only property is incorrect
- 401: Authorization failed or is missing
- 403: If the Event Receiver is not allowed to update a stream
- 404: If the
stream_idis present and the stream does not exist orstream_idis missing and default streams not supported
Open question
How should we treat missing read/write values in the stream configuration object?
- PATCH semantics imply that missing values should be interpreted as "leave the value as it is".
- Current SSE framework interprets missing read/write values as "delete the value". But interprets missing read-only values as "leave the value as it is".
- Google best practice suggests including a field mask to indicate which fields are being updated. Do we want that?
Delete a Stream - configuration_endpoint [DELETE]
Deletes a named stream or resets a default stream to its default configuration. When a stream is deleted (or reset for default streams) all subjects that have been added to the stream, events that have been enqueued in the stream, or status that has been set on the stream should also be deleted.
Arguments
stream_id(optional)
Results
- 200: Success
- 401: Authorization failed or is missing
- 403: Event receiver is not allowed to delete streams
- 404: A
stream_idis present and the stream does not exist, orstream_idis missing and default streams are not supported.
New endpoint: list_streams_endpoint
A new endpoint will be included in the transmitter configuration response from /.well-known/sse-configuration:
list_streams_endpoint: "https://tr.example.com/sse/mgmt/list_streams"
List stream IDs - list_streams_endpoint [GET]
Returns a list of the stream IDs in use
Arguments
- None
Results
- 200: A list of stream IDs. Note that the default stream has a
nullID and will not be present in the list. - 401: Authorization failed or is missing
- 403: Event receiver is not allowed to list streams
Other changes
The following endpoints all get an optional stream_id argument, either in the body of the POST endpoints or the URL params of the GET endpoint. If the stream_id argument is missing, assume the default stream is being indicated.
- status_endpoint [GET]
- status_endpoint [POST]
- add_subject_endpoint [POST]
- remove_subject_endpoint [POST]
- verification_endpoint [POST]
All five methods get a new possible return value:
- 404: A
stream_idis present and the stream does not exist, orstream_idis missing and default streams are not supported.