Skip to content

Commit 406879e

Browse files
committed
Add subscription IDs to events
1 parent a9e13a5 commit 406879e

File tree

1 file changed

+134
-60
lines changed

1 file changed

+134
-60
lines changed

index.bs

Lines changed: 134 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -694,15 +694,17 @@ occurred on the [=remote end=].
694694
are run when multiple events are enabled at once, with lower integers
695695
indicating steps that run earlier.
696696

697-
A [=BiDi session=] has a <dfn export for=event>global event set</dfn>
698-
which is a [=/set=] containing the event names for events that are enabled for all
699-
navigables. This initially contains the [=event name=] for events that
700-
are <dfn export for=event>in the default event set</dfn>.
697+
A [=BiDi session=] has a <dfn export for=event>global event map</dfn>
698+
which is a [=/map=] containing the event names for events that are enabled for all
699+
navigables as keys and a [=/list=] of [=subscriptions=] as values.
701700

702701
A [=BiDi session=] has a <dfn export for=event>navigable event map</dfn>,
703702
which is a [=/map=] with [=/top-level traversable=] keys and values
704-
that are a [=/set=] of [=event name=]s for events that are enabled in the given
705-
navigable.
703+
that are a [=/map=] containing the event names for events that are enabled for the
704+
the top-level traversable as keys and a [=/list=] of [=subscriptions=] as values.
705+
706+
A <dfn for=event>subscription</dfn> is a [=/struct=] consisting of a subscription id
707+
(a string) and an inherit flag (a boolean).
706708

707709
<div algorithm>
708710

@@ -713,7 +715,7 @@ To obtain a list of <dfn>event enabled navigables</dfn> given
713715

714716
1. For each |navigable| → |events| of |session|'s [=navigable event map=]:
715717

716-
1. If |events| contains |event name|, append |navigable| to |navigables|
718+
1. If |events| [=map/contain=] |event name|, append |navigable| to |navigables|
717719

718720
1. Return |navigables|.
719721

@@ -755,9 +757,9 @@ Note: |navigables| is a set because a [=shared worker=] can be associated
755757
be |event map|[|navigable|]. Otherwise let |navigable events| be null.
756758

757759
1. If |navigable events| is not null, and |navigable events|
758-
[=list/contains=] |event name|, return true.
760+
[=map/contains=] |event name|, return true.
759761

760-
1. If the [=global event set=] for |session| [=list/contains=] |event name| return
762+
1. If the [=global event map=] for |session| [=map/contains=] |event name| return
761763
true.
762764

763765
1. Return false.
@@ -1466,22 +1468,18 @@ To <dfn>cleanup remote end state</dfn>.
14661468

14671469
<div algorithm>
14681470
To <dfn>update the event map</dfn>, given
1469-
|session|, |requested event names|, |navigables|, and |enabled|:
1471+
|subscription|, |session|, |requested event names|, |navigables|, and |enabled|:
14701472

14711473
Note: The return value of this algorithm is a map between event names and
14721474
navigables. When the events are being enabled, the navigables in the return value
14731475
are those for which the event are now enabled but were not previously. When
14741476
events are disabled, the return value is always empty.
14751477

1476-
1. Let |global event set| be a [=set/clone=] of the [=global event set=] for
1478+
1. Let |global event map| be a [=map/clone=] of the [=global event map=] for
14771479
|session|.
14781480

1479-
1. Let |event map| be a new [=/map=].
1480-
1481-
1. For each |key| → |value| of the [=navigable event map=] for
1482-
|session|:
1483-
1484-
1. Set |event map|[|key|] to a [=set/clone=] of |value|.
1481+
1. Let |event map| be a [=map/clone=] of the [=navigable event map=] for
1482+
|session|.
14851483

14861484
1. Let |event names| be an empty [=/set=].
14871485

@@ -1491,73 +1489,120 @@ events are disabled, the return value is always empty.
14911489

14921490
1. Let |enabled events| be a new [=/map=].
14931491

1494-
1. If |navigables| is null:
1492+
1. if |subscription| is null:
1493+
1494+
Note: this is for backward compatibility.
1495+
1496+
1. assert |enabled| is false
14951497

1496-
1. If |enabled| is true:
1498+
1. If |navigables| is null:
1499+
1500+
1. For each |event name| in |event names|:
1501+
1502+
1. If |global event map| [=map/contains=] |event name|, remove |event
1503+
name| from |global event map|. Otherwise return [=error=] with
1504+
[=error code=] [=invalid argument=].
1505+
1506+
1. Otherwise, if |navigables| is not null:
1507+
1508+
1. Let |targets| be an empty [=/map=].
1509+
1510+
1. For each |navigable id| in |navigables|:
1511+
1512+
1. Let |navigable| be the result of [=trying=] to [=get a navigable=]
1513+
with |navigable id|.
1514+
1515+
1. Let |top-level traversable| be the [=navigable/top-level traversable=] for |navigable|.
1516+
1517+
1. If |event map| does not contain |top-level traversable|,
1518+
set |event map|[|top-level traversable|] to a new [=/set=].
1519+
1520+
1. Set |targets|[|top-level traversable|] to |event map|[|top-level traversable|].
1521+
1522+
1. For each |event name| in |event names|:
1523+
1524+
1. For each |navigable| → |target| in |targets|:
1525+
1526+
1. If |enabled| is false:
1527+
1528+
1. If |target| contains |event name|, remove |event name| from
1529+
|target|. Otherwise return [=error=] with [=error code=] [=invalid
1530+
argument=].
1531+
1532+
1. If |subscription| is not null:
1533+
1534+
1. If |enabled| is true:
1535+
1536+
Note: this handles different scopes of event subscriptions (e.g., global or navigable-scoped).
1537+
1538+
1. If |navigables| is null:
14971539

14981540
1. For each |event name| of |event names|:
14991541

1500-
1. If |global event set| doesn't contain |event name|:
1542+
1. If |global event map| doesn't [=map/contain=] |event name|:
15011543

1502-
1. Let |already enabled navigables| be the [=event enabled navigables=]
1544+
1. Let |already enabled navigables| be the [=event enabled navigables=]
15031545
given |session| and |event name|.
15041546

1505-
1. Add |event name| to |global event set|.
1506-
1507-
1. For each |navigable| of |already enabled navigables|, remove |event
1508-
name| from |event map|[|navigable|].
1547+
1. Set |global event map|[||event name||] to be a new [=/map=].
15091548

1510-
1. Let |newly enabled contexts| be a list of all [=/top-level traversable=]
1549+
1. Let |newly enabled contexts| be a list of all [=/top-level traversable=]
15111550
that are not contained in |already enabled navigables|,
15121551

1513-
1. Set |enabled events|[|event name|] to |newly enabled contexts|.
1552+
1. Set |enabled events|[|event name|] to |newly enabled contexts|.
15141553

1515-
1. If |enabled| is false:
1554+
1. [=list/append=] |subscription| to |global event map|[|event name|].
15161555

1517-
1. For each |event name| in |event names|:
1556+
1. Otherwise, if |navigables| is not null:
15181557

1519-
1. If |global event set| [=list/contains=] |event name|, remove |event
1520-
name| from |global event set|. Otherwise return [=error=] with
1521-
[=error code=] [=invalid argument=].
1558+
1. Let |targets| be an empty [=/map=].
15221559

1523-
1. Otherwise, if |navigables| is not null:
1560+
1. For each |navigable id| in |navigables|:
15241561

1525-
1. Let |targets| be an empty [=/map=].
1562+
1. Let |navigable| be the result of [=trying=] to [=get a navigable=]
1563+
with |navigable id|.
15261564

1527-
1. For each |navigable id| in |navigables|:
1565+
1. Let |top-level traversable| be the [=navigable/top-level traversable=] for |navigable|.
15281566

1529-
1. Let |navigable| be the result of [=trying=] to [=get a navigable=]
1530-
with |navigable id|.
1567+
1. If |event map| does not contain |top-level traversable|, set |event map|[|top-level traversable|]
1568+
to a new [=/map=].
15311569

1532-
1. Let |top-level traversable| be the [=navigable/top-level traversable=] for |navigable|.
1570+
1. Set |targets|[|top-level traversable|] to |event map|[|top-level traversable|].
15331571

1534-
1. If |event map| does not contain |top-level traversable|, set |event
1535-
map|[|top-level traversable|] to a new [=/set=].
1572+
1. For each |event name| in |event names|:
1573+
1574+
1. For each |navigable| → |target| in |targets|:
1575+
1576+
1. TODO: if |target| does not contain |event name|, set |target|[|event name|] to a new list.
1577+
1578+
1. [=list/append=] |subscription| to |target|[|event name|].
15361579

1537-
1. Set |targets|[|top-level traversable|] to |event map|[|top-level traversable|].
1580+
1. If |enabled events| does not contain |event name|, set |enabled
1581+
events|[|event name|] to a new [=/set=].
15381582

1539-
1. For each |event name| in |event names|:
1583+
1. Append |navigable| to |enabled events|[|event name|].
15401584

1541-
1. If |enabled| is true and |global event set| contains |event name|, continue.
1585+
1. If |enabled| is false:
15421586

1543-
1. For each |navigable| → |target| in |targets|:
1587+
1. For each |event name| → |subscriptions| in |global event map|:
15441588

1545-
1. If |enabled| is true and |target| does not contain |event name|:
1589+
1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
15461590

1547-
1. Add |event name| to |target|.
1591+
1. TODO: clean up if empty.
15481592

1549-
1. If |enabled events| does not contain |event name|, set |enabled
1550-
events|[|event name|] to a new [=/set=].
1593+
1. TODO: maybe error if not found.
15511594

1552-
1. Append |navigable| to |enabled events|[|event name|].
1595+
1. For each |navigable| -> |navigable event map| in |event map|:
15531596

1554-
1. If |enabled| is false:
1597+
1. For each <var ignore>event name</var> -> |subscriptions| in |navigable event map|:
15551598

1556-
1. If |target| contains |event name|, remove |event name| from
1557-
|target|. Otherwise return [=error=] with [=error code=] [=invalid
1558-
argument=].
1599+
1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
15591600

1560-
1. Set the [=global event set=] for |session| to |global event set|.
1601+
1. TODO: clean up if empty.
1602+
1603+
1. TODO: maybe error if not found.
1604+
1605+
1. Set the [=global event map=] for |session| to |global event map|.
15611606

15621607
1. Set the [=navigable event map=] for |session| to |event map|.
15631608

@@ -1715,6 +1760,14 @@ session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";
17151760
The <code>session.UserPromptHandlerType</code> type represents the behavior
17161761
of the user prompt handler.
17171762

1763+
#### The session.Subscription Type #### {#type-session-Subscription}
1764+
1765+
<pre class="cddl remote-cddl local-cddl">
1766+
session.Subscription = text
1767+
</pre>
1768+
1769+
The <code>session.Subscription</code> type represents a unique subscription identifier.
1770+
17181771
#### The session.SubscriptionRequest Type #### {#type-session-SubscriptionRequest}
17191772

17201773
<pre class="cddl remote-cddl">
@@ -1727,6 +1780,17 @@ session.SubscriptionRequest = {
17271780
The <code>session.SubscriptionRequest</code> type represents a request to
17281781
subscribe to or unsubscribe from a specific set of events.
17291782

1783+
#### The session.UnsubscribeRequest Type #### {#type-session-UnsubscribeRequest}
1784+
1785+
<pre class="cddl remote-cddl">
1786+
session.UnsubscribeRequest = {
1787+
subscribtion: session.Subscription,
1788+
}
1789+
</pre>
1790+
1791+
The <code>session.UnsubscribeRequest</code> type represents a request to
1792+
usubscribe using a subscription ID.
1793+
17301794
### Commands ### {#module-session-commands}
17311795

17321796
#### The session.status Command #### {#command-session-status}
@@ -1920,9 +1984,11 @@ Issue: This needs to be generalized to work with realms too.
19201984
</dd>
19211985
<dt>Result Type</dt>
19221986
<dd>
1923-
<pre class="cddl">
1924-
EmptyResult
1925-
</pre>
1987+
<pre class="cddl local-cddl">
1988+
session.SubscriptionRequestResult = {
1989+
subscription: session.Subscription,
1990+
}
1991+
</pre>
19261992
</dd>
19271993
</dl>
19281994

@@ -1935,8 +2001,10 @@ The [=remote end steps=] with |session| and |command parameters| are:
19352001
1. Let the |list of navigables| be the value of the <code>contexts</code>
19362002
field of |command parameters| if it is present or null if it isn't.
19372003

2004+
1. Let |subscription| be a [=subscription=] with subscription id set to the string representation of a UUID.
2005+
19382006
1. Let |enabled events| be the result of [=trying=] to [=update the event map=]
1939-
with |session|, |list of event names| , |list of navigables| and
2007+
with |subscription|, |session|, |list of event names| , |list of navigables| and
19402008
enabled true.
19412009

19422010
1. Let |subscribe step events| be a new [=/map=].
@@ -1982,7 +2050,7 @@ Issue: This needs to be generalised to work with realms too.
19822050
<pre class="cddl remote-cddl">
19832051
session.Unsubscribe = (
19842052
method: "session.unsubscribe",
1985-
params: session.SubscriptionRequest
2053+
params: session.SubscriptionRequest / session.UnsubscribeRequest
19862054
)
19872055
</pre>
19882056
</dd>
@@ -2003,7 +2071,13 @@ The [=remote end steps=] with |session| and |command parameters| are:
20032071
1. Let the |list of contexts| be the value of the <code>contexts</code>
20042072
field of |command parameters| if it is present or null if it isn't.
20052073

2006-
1. [=Try=] to [=update the event map=] with |session|,
2074+
1. Let the |subscription id| be the value of the <code>subscription</code>
2075+
field of |command parameters| if it is present or null if it isn't.
2076+
2077+
1. Let |subscription| be a [=subscription=] with subscription id set to
2078+
|subscription id| if |subscription id| is not null, and null otherwise.
2079+
2080+
1. [=Try=] to [=update the event map=] with |subscription|, |session|,
20072081
|list of event names|, |list of contexts| and enabled false.
20082082

20092083
1. Return [=success=] with data null.

0 commit comments

Comments
 (0)