Merge 13b35879a0 into e9f0f31d27
commit
1367ff3ca6
@ -0,0 +1,137 @@
|
||||
# MSC4300: Requesting and reporting event processing status
|
||||
|
||||
Matrix allows clients to exchange both built-in and custom events with other clients in rooms. There
|
||||
is, however, no way for a client to understand if the events it sent were actually understood by
|
||||
other clients or not. This is problematic as a compatibility mismatch means that the recipient user
|
||||
might only be able to see a fallback representation of an event or, in the worst case, nothing at
|
||||
all. At the same time, the sender is left wholly unaware of the recipient's experience.
|
||||
|
||||
These problems are aggravated when one or both of the participating clients are an automated system
|
||||
(a.k.a. bot) which cannot easily issue or respond to generic "Did you see my message?" questions.
|
||||
|
||||
The present proposal partially addresses this problem by defining a generic scheme for clients to
|
||||
request and receive an explicit processing status for events from other clients.
|
||||
|
||||
## Proposal
|
||||
|
||||
A new content block `m.request.status` is introduced to request a processing status from other
|
||||
clients when sending events. It has the following properties in `content`:
|
||||
|
||||
- `from_device` (required, string): The sending device's device ID. Allows recipients to optionally
|
||||
submit their responses privately via to-device messages in the future.
|
||||
- `lifetime` (integer): The duration in milliseconds during which the sender will consider responses
|
||||
to this request. Prevents meaningless delayed responses when new or previously disconnected
|
||||
devices encounter requests on older events.
|
||||
|
||||
Clients MAY add `m.request.status` as a top-level property in `content` on any event they send.
|
||||
|
||||
``` json5
|
||||
{
|
||||
"type": "m.pizza",
|
||||
"event_id": "$1",
|
||||
"content": {
|
||||
"m.request.status": {
|
||||
"from_device": "RJYKSTBOIE",
|
||||
"lifetime": 90000, // 90s
|
||||
},
|
||||
// properties specific to m.pizza
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Clients that receive events containing `m.request.status` content blocks MAY respond to them with a
|
||||
new room event type `m.response.status`. The latter contains an `m.reference` relation pointing to
|
||||
the original event as well as an `m.response.status` content block with the following properties:
|
||||
|
||||
- `from_device` (required, string): The sending device's device ID. Helps clients identify the
|
||||
remote echo of their own responses.
|
||||
- `status` (required, string, one of `success`, `error`): Whether the sending device has understood
|
||||
and successfully processed the event.
|
||||
- `messages` (array): An optional array of messages to help recipients understand the `status`.
|
||||
- `type`: (required, string, one of `info`, `warning`, `error`): The message category.
|
||||
- `m.text`: (required, object): The message in one or more textual representations as per
|
||||
[MSC1767].
|
||||
|
||||
The event `content` MAY contain further properties based on the type of the event that is being
|
||||
responded to.
|
||||
|
||||
``` json5
|
||||
{
|
||||
"type": "m.response.status",
|
||||
"content": {
|
||||
"m.response.status": {
|
||||
"from_device": "EIOBTSKYJR",
|
||||
"status": "error",
|
||||
"messages": [{
|
||||
"type": "error",
|
||||
"m.text": [{ "body": "Unknown event type m.pizza" }]
|
||||
}]
|
||||
},
|
||||
"m.relates_to": {
|
||||
"event_id": "$1",
|
||||
"rel_type": "m.reference",
|
||||
},
|
||||
// optional properties specific to m.pizza
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Clients can check whether a request has expired using `lifetime`, `origin_server_ts` and their local
|
||||
clock. Once a request has expired, clients SHOULD refrain from sending `m.response` events
|
||||
themselves and ignore any new `m.response` events received from other clients.
|
||||
|
||||
## Potential issues
|
||||
|
||||
This proposal doesn't strictly define what constitutes successful processing of an event. At a
|
||||
minimum, the meaning of success will depend on the type of event sent and the receiving client. An
|
||||
archival bot, for instance, may have to decrypt and export an event to consider it processed
|
||||
successfully. An instant messaging client for end users, on the other hand, might have to render an
|
||||
event in a way that allows the user to interact with it. The kind of rendering needed will be
|
||||
specific to the type of event in this case.
|
||||
|
||||
It is expected that the mechanism introduced in this proposal will be used as a basis for more
|
||||
specialised features that clearly define the semantics of success. Therefore, this aspect is
|
||||
consciously left unspecified here.
|
||||
|
||||
## Alternatives
|
||||
|
||||
Requests for processing statuses could be sent separately from the event being processed, for
|
||||
instance, via to-device messages. This, however, introduces complexity because now both messages
|
||||
have to be received and decrypted before responses can be sent. It is not clear what benefits, if
|
||||
any, this alternative would have over the solution proposed in the present proposal.
|
||||
|
||||
Instead of sending processing statuses per event, clients could statically advertise the types of
|
||||
events that they are able to understand, for instance, via profiles or state events in a room. This
|
||||
would allow senders to look up recipient capabilities ahead of time but would not allow recipients
|
||||
to communicate back detailed information about their processing status of individual events. As a
|
||||
result, the two mechanisms are not necessarily competing and could also play together.
|
||||
|
||||
Delivery receipts as proposed in [MSC4089] are a partial alternative to this proposal. These
|
||||
receipts only convey receipt and decryption status but not whether the decrypted event was actually
|
||||
understood and processed successfully. Additionally, delivery receipts don't cover the case where an
|
||||
event was received but failed to be processed. Lastly, receipts in their current form also don't
|
||||
support including additional encrypted information about the processing result.
|
||||
|
||||
## Security considerations
|
||||
|
||||
Communicating the processing status via room events leaks metadata by revealing client capabilities
|
||||
to all room participants. This can be mitigated by transporting the status via to-device messages
|
||||
instead. A future proposal may generalise the mechanism introduced here accordingly. Until then,
|
||||
clients are not required to respond to status requests under this proposal and MAY simply ignore
|
||||
them.
|
||||
|
||||
Contrary to the above, persisting processing status responses in timeline events can be necessary in
|
||||
scenarios that require auditability.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
While this MSC is not considered stable, `m.request.status` and `m.response.status` should be
|
||||
referred to as `de.gematik.msc4300.request.status` and `de.gematik.msc4300.response.status`,
|
||||
respectively.
|
||||
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
|
||||
[MSC1767]: https://github.com/matrix-org/matrix-spec-proposals/pull/1767
|
||||
[MSC4089]: https://github.com/matrix-org/matrix-spec-proposals/pull/4089
|
||||
Loading…
Reference in New Issue