Initial draft
parent
5beaf2e7a7
commit
99366b90ad
@ -0,0 +1,180 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="133.16223mm"
|
||||||
|
height="135.95966mm"
|
||||||
|
viewBox="0 0 133.16223 135.95966"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="marker22"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
markerWidth="1"
|
||||||
|
markerHeight="1"
|
||||||
|
viewBox="0 0 1 1"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
transform="scale(0.7)"
|
||||||
|
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
id="path22" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="RoundedArrow"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
markerWidth="1"
|
||||||
|
markerHeight="1"
|
||||||
|
viewBox="0 0 1 1"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
transform="scale(0.7)"
|
||||||
|
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
id="path8" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(5.4889936,-19.321178)">
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#99c1f1;fill-opacity:1;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
id="rect1"
|
||||||
|
width="133.16223"
|
||||||
|
height="32.02956"
|
||||||
|
x="-5.4889936"
|
||||||
|
y="19.321178"
|
||||||
|
rx="10"
|
||||||
|
ry="10" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:7.02215px;line-height:1;font-family:'TeX Gyre Schola';-inkscape-font-specification:'TeX Gyre Schola';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;opacity:1;fill:#000000;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
x="61.095631"
|
||||||
|
y="37.983307"
|
||||||
|
id="text1"><tspan
|
||||||
|
id="tspan1"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="61.095631"
|
||||||
|
y="37.983307">m.rtc.member</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.51724px;line-height:1;font-family:'TeX Gyre Schola';-inkscape-font-specification:'TeX Gyre Schola';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
x="18.564566"
|
||||||
|
y="61.062046"
|
||||||
|
id="text1-1"><tspan
|
||||||
|
id="tspan1-5"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="61.062046">m.call.notify</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="65.949699"
|
||||||
|
id="tspan2">{</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="70.837357"
|
||||||
|
id="tspan3"> "notify_type": "ring"</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="75.725006"
|
||||||
|
id="tspan4"> "m.relates_to": {</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="80.612663"
|
||||||
|
id="tspan12"> "rel_type": "m.call.notification",</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="85.500313"
|
||||||
|
id="tspan14"> "event_id": "$state_event_id",</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="90.38797"
|
||||||
|
id="tspan15"> }</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="95.27562"
|
||||||
|
id="tspan11"> ...</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="18.564566"
|
||||||
|
y="100.16328"
|
||||||
|
id="tspan5">}</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.51724px;line-height:1;font-family:'TeX Gyre Schola';-inkscape-font-specification:'TeX Gyre Schola';text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
x="15.176634"
|
||||||
|
y="112.12274"
|
||||||
|
id="text10"><tspan
|
||||||
|
id="tspan6"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="112.12274">m.call.notify</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="117.0104"
|
||||||
|
id="tspan7">{</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="121.89805"
|
||||||
|
id="tspan8"> "notify_type": "decline"</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="126.78571"
|
||||||
|
id="tspan16"> "m.relates_to": {</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="131.67336"
|
||||||
|
id="tspan17"> "rel_type": "m.call.notification",</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="136.561"
|
||||||
|
id="tspan18"> "event_id": "$initial_ring_event_id",</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="141.44867"
|
||||||
|
id="tspan19"> }</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="146.33632"
|
||||||
|
id="tspan9"> ...</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Noto Sans Mono CJK HK';-inkscape-font-specification:'Noto Sans Mono CJK HK';text-align:start;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.4"
|
||||||
|
x="15.176634"
|
||||||
|
y="151.22397"
|
||||||
|
id="tspan10">}</tspan></text>
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffbe6f;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
id="rect19"
|
||||||
|
width="106.08814"
|
||||||
|
height="48.376209"
|
||||||
|
x="8.0480509"
|
||||||
|
y="54.317131"
|
||||||
|
ry="10"
|
||||||
|
rx="10" />
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffbe6f;stroke-width:0.4;stroke-opacity:0.972549"
|
||||||
|
id="rect20"
|
||||||
|
width="106.08814"
|
||||||
|
height="48.376209"
|
||||||
|
x="8.0480509"
|
||||||
|
y="106.70462"
|
||||||
|
ry="10"
|
||||||
|
rx="10" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffbe6f;stroke-width:0.4;stroke-opacity:0.972549;marker-end:url(#marker22)"
|
||||||
|
d="m 96.03539,83.728545 c 33.21135,-7.116718 28.27098,-26.070992 25.22096,-31.832143"
|
||||||
|
id="path20" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffbe6f;stroke-width:0.4;stroke-opacity:0.972549;marker-end:url(#RoundedArrow)"
|
||||||
|
d="m 108.37848,134.54422 c 20.33348,-7.45561 12.91952,-31.96274 6.1417,-38.401674"
|
||||||
|
id="path21" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
@ -0,0 +1,107 @@
|
|||||||
|
# MSXXXX: MatrixRTC decline `m.rtc.notify`
|
||||||
|
|
||||||
|
MatrixRTC is the base layer that defines how devices participate in a call. For the specific
|
||||||
|
usecase of a voice/video call we need additional signalling (outside of MatrixRTC) to provide
|
||||||
|
the expected user experience.
|
||||||
|
|
||||||
|
It is important to understand that this (and related) proposals intentionally detangle rtc specific
|
||||||
|
signalling and general purpose MatrixRTC session state.
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
This proposal builds on the concept of [MSC4075: MatrixRTC Call Ringing](https://github.com/matrix-org/matrix-spec-proposals/pull/4075)
|
||||||
|
introducint the `m.call.notify` event.
|
||||||
|
This event lives in parallel with the MatrixRTC session and uses intentional mentions to make the receiving clients ring.
|
||||||
|
The receiving clients will then monitor the room state and stop ringing once the user joined with one of their devices.
|
||||||
|
|
||||||
|
## Proposal
|
||||||
|
|
||||||
|
Conceptually this MSC will introduce a new event that will be sent as a relation to the `m.call.notify` event
|
||||||
|
which communicates a decline from one or more parties. It can be used on the clients to provide a good UX around
|
||||||
|
a call decline (stop ringing, play a decline sound, prompt the user with: "the call has been declined" ...)
|
||||||
|
|
||||||
|
### Introduction
|
||||||
|
|
||||||
|
While the concept of this proposal is simple it is important to outline what needs to be achievable with
|
||||||
|
the proposed solution.
|
||||||
|
|
||||||
|
- A client needs to easily react to such an event and needs to be able to **correlate the decline** with a
|
||||||
|
`m.call.notify` event and best case even the **MatrixRTC session** to check if the declien is relevant.
|
||||||
|
- It needs to be **flexible for 1:1 calls and group calls**. It should be possible to design a group ring
|
||||||
|
and per group participant decline flow with this proposal even if some products might not need this feature.
|
||||||
|
- Clients have two possible ways of displaying **historic calls in the timeline**. They can compute the exact call
|
||||||
|
history using the `m.rtc.member` events which contain the information at what time, which device joined.
|
||||||
|
Alternatively they can use the notify and decline events only to render when a person tried to start a call
|
||||||
|
and if that got declined. This is much simpler and therefore desired for very simple client implementations.
|
||||||
|
|
||||||
|
### Proposal (Changes)
|
||||||
|
|
||||||
|
This MSC Proposes to extend the `m.call.notify` event with two more properties and a new `notify_type` :
|
||||||
|
|
||||||
|
- relation: `"m.relates_to": {"rel_type":"m.decline", "eventId":"$call_notify_event_id"}`
|
||||||
|
- reason:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"decline_reason"?: "decline description"
|
||||||
|
```
|
||||||
|
|
||||||
|
- decline type: `notify_type: "decline" | "ring" | "notify"`
|
||||||
|
|
||||||
|
The `m.relates_to` field allows to reference the original notify event. The optional reason
|
||||||
|
allows to provide a message to the user receiving the decline.
|
||||||
|
the `notify_type` from the `m.call.notify` event gets a new case. The decline case.
|
||||||
|
|
||||||
|
This results in a tree of notify events on `m.rtc.member` events.
|
||||||
|
|
||||||
|
<img src="./XXXX-matrixRTC-call-decline-realtions.svg" width=400 alt="matrixRTC-call-decline-relations"/>
|
||||||
|
|
||||||
|
Fetching the `m.rtc.member` events to compute a timeline item summarizing the call allows to easily get all the
|
||||||
|
related elements and provide additional context in the timeline tile. If a call was declined, who (can be multiple) started
|
||||||
|
the call by ringing others ...
|
||||||
|
|
||||||
|
## Potential issues
|
||||||
|
|
||||||
|
Since this is reusing the `m.call.notify` event type which did not have this usecase in mind,
|
||||||
|
the event type name might be a bit off:
|
||||||
|
Instead of calling it`m.call.notify`, `m.call.signalling` might be more approprita.
|
||||||
|
|
||||||
|
### Alternatives
|
||||||
|
|
||||||
|
There are other formats in which the decline relation could be formatted:
|
||||||
|
|
||||||
|
#### Reaction
|
||||||
|
|
||||||
|
Use already existing reactions to the notify event. This makes it extremely trivial to implement:
|
||||||
|
|
||||||
|
- Pros ✅
|
||||||
|
- All clients already have support.
|
||||||
|
- The timeline rendering already has access to the reaction and can incorporate this into the custom tile rendering.
|
||||||
|
- Cons ❌
|
||||||
|
- Feels hacky
|
||||||
|
- Will be unencrypted as reactions
|
||||||
|
- Does not allow for more custom fields (decline call later, decline ooo, decline in meeting)
|
||||||
|
- Might collide with already existing reaction logic in clients
|
||||||
|
- Hard to include into an rtc member based timeline rendering
|
||||||
|
|
||||||
|
#### Custom Event
|
||||||
|
|
||||||
|
Introduce a new custom event and a new reaction type.
|
||||||
|
This custom event will be sent as a reaction to the initial notify event:
|
||||||
|
|
||||||
|
- Pros ✅
|
||||||
|
- clear separation and usecase
|
||||||
|
- Cons ❌
|
||||||
|
- new event needs new widget permissions and more event types introduced in js-sdk and rust sdk
|
||||||
|
|
||||||
|
## Security considerations
|
||||||
|
|
||||||
|
Relations are unencrypted and the custom relation type will leak metadata about call notify and deline events.
|
||||||
|
|
||||||
|
## Unstable prefix
|
||||||
|
|
||||||
|
While this is an open proposal the prefix `org.matrix.mscXXXX.decline` needs to be used for the new relation type
|
||||||
|
(and the `m.call.notify` event type will use the `org.matrix.msc4075.call.notify` prefixed version as described in [MSC4075](https://github.com/matrix-org/matrix-spec-proposals/pull/4075))
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
This MSC builds on [MSC4075](https://github.com/matrix-org/matrix-spec-proposals/pull/4075)
|
||||||
Loading…
Reference in New Issue