Skip to content

Commit 1a496fc

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

File tree

1 file changed

+130
-60
lines changed

1 file changed

+130
-60
lines changed

index.bs

Lines changed: 130 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,116 @@ 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
1497+
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|:
14951511

1496-
1. If |enabled| is true:
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+
1. If |navigables| is null:
14971537

14981538
1. For each |event name| of |event names|:
14991539

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

1502-
1. Let |already enabled navigables| be the [=event enabled navigables=]
1542+
1. Let |already enabled navigables| be the [=event enabled navigables=]
15031543
given |session| and |event name|.
15041544

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|].
1545+
1. Set |global event map|[||event name||] to be a new [=/map=].
15091546

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

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

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

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

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=].
1556+
1. Let |targets| be an empty [=/map=].
15221557

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

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

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

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

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

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

1537-
1. Set |targets|[|top-level traversable|] to |event map|[|top-level traversable|].
1579+
1. Append |navigable| to |enabled events|[|event name|].
15381580

1539-
1. For each |event name| in |event names|:
1581+
1. If |enabled| is false:
15401582

1541-
1. If |enabled| is true and |global event set| contains |event name|, continue.
1583+
1. For each |event name| → |subscriptions| in |global event map|:
15421584

1543-
1. For each |navigable| → |target| in |targets|:
1585+
1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
15441586

1545-
1. If |enabled| is true and |target| does not contain |event name|:
1587+
1. TODO: clean up if empty.
15461588

1547-
1. Add |event name| to |target|.
1589+
1. TODO: maybe error if not found.
15481590

1549-
1. If |enabled events| does not contain |event name|, set |enabled
1550-
events|[|event name|] to a new [=/set=].
1591+
1. For each |navigable| -> |navigable event map| in |event map|:
15511592

1552-
1. Append |navigable| to |enabled events|[|event name|].
1593+
1. For each <var ignore>event name</var> -> |subscriptions| in |navigable event map|:
15531594

1554-
1. If |enabled| is false:
1595+
1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
15551596

1556-
1. If |target| contains |event name|, remove |event name| from
1557-
|target|. Otherwise return [=error=] with [=error code=] [=invalid
1558-
argument=].
1597+
1. TODO: clean up if empty.
15591598

1560-
1. Set the [=global event set=] for |session| to |global event set|.
1599+
1. TODO: maybe error if not found.
1600+
1601+
1. Set the [=global event map=] for |session| to |global event map|.
15611602

15621603
1. Set the [=navigable event map=] for |session| to |event map|.
15631604

@@ -1715,6 +1756,14 @@ session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";
17151756
The <code>session.UserPromptHandlerType</code> type represents the behavior
17161757
of the user prompt handler.
17171758

1759+
#### The session.Subscription Type #### {#type-session-Subscription}
1760+
1761+
<pre class="cddl remote-cddl local-cddl">
1762+
session.Subscription = text
1763+
</pre>
1764+
1765+
The <code>session.Subscription</code> type represents a unique subscription identifier.
1766+
17181767
#### The session.SubscriptionRequest Type #### {#type-session-SubscriptionRequest}
17191768

17201769
<pre class="cddl remote-cddl">
@@ -1727,6 +1776,17 @@ session.SubscriptionRequest = {
17271776
The <code>session.SubscriptionRequest</code> type represents a request to
17281777
subscribe to or unsubscribe from a specific set of events.
17291778

1779+
#### The session.UnsubscribeRequest Type #### {#type-session-UnsubscribeRequest}
1780+
1781+
<pre class="cddl remote-cddl">
1782+
session.UnsubscribeRequest = {
1783+
subscribtion: session.Subscription,
1784+
}
1785+
</pre>
1786+
1787+
The <code>session.UnsubscribeRequest</code> type represents a request to
1788+
usubscribe using a subscription ID.
1789+
17301790
### Commands ### {#module-session-commands}
17311791

17321792
#### The session.status Command #### {#command-session-status}
@@ -1920,9 +1980,11 @@ Issue: This needs to be generalized to work with realms too.
19201980
</dd>
19211981
<dt>Result Type</dt>
19221982
<dd>
1923-
<pre class="cddl">
1924-
EmptyResult
1925-
</pre>
1983+
<pre class="cddl local-cddl">
1984+
session.SubscriptionRequestResult = {
1985+
subscription: session.Subscription,
1986+
}
1987+
</pre>
19261988
</dd>
19271989
</dl>
19281990

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

2000+
1. Let |subscription| be a [=subscription=] with subscription id set to the string representation of a UUID.
2001+
19382002
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
2003+
with |subscription|, |session|, |list of event names| , |list of navigables| and
19402004
enabled true.
19412005

19422006
1. Let |subscribe step events| be a new [=/map=].
@@ -1982,7 +2046,7 @@ Issue: This needs to be generalised to work with realms too.
19822046
<pre class="cddl remote-cddl">
19832047
session.Unsubscribe = (
19842048
method: "session.unsubscribe",
1985-
params: session.SubscriptionRequest
2049+
params: session.SubscriptionRequest / session.UnsubscribeRequest
19862050
)
19872051
</pre>
19882052
</dd>
@@ -2003,7 +2067,13 @@ The [=remote end steps=] with |session| and |command parameters| are:
20032067
1. Let the |list of contexts| be the value of the <code>contexts</code>
20042068
field of |command parameters| if it is present or null if it isn't.
20052069

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

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

0 commit comments

Comments
 (0)