@@ -694,15 +694,17 @@ occurred on the [=remote end=].
694
694
are run when multiple events are enabled at once, with lower integers
695
695
indicating steps that run earlier.
696
696
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.
701
700
702
701
A [=BiDi session=] has a <dfn export for=event>navigable event map</dfn> ,
703
702
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).
706
708
707
709
<div algorithm>
708
710
@@ -713,7 +715,7 @@ To obtain a list of <dfn>event enabled navigables</dfn> given
713
715
714
716
1. For each |navigable| → |events| of |session|'s [=navigable event map=] :
715
717
716
- 1. If |events| contains |event name|, append |navigable| to |navigables|
718
+ 1. If |events| [=map/contain=] |event name|, append |navigable| to |navigables|
717
719
718
720
1. Return |navigables|.
719
721
@@ -755,9 +757,9 @@ Note: |navigables| is a set because a [=shared worker=] can be associated
755
757
be |event map|[|navigable|] . Otherwise let |navigable events| be null.
756
758
757
759
1. If |navigable events| is not null, and |navigable events|
758
- [=list /contains=] |event name|, return true.
760
+ [=map /contains=] |event name|, return true.
759
761
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
761
763
true.
762
764
763
765
1. Return false.
@@ -1466,22 +1468,18 @@ To <dfn>cleanup remote end state</dfn>.
1466
1468
1467
1469
<div algorithm>
1468
1470
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|:
1470
1472
1471
1473
Note: The return value of this algorithm is a map between event names and
1472
1474
navigables. When the events are being enabled, the navigables in the return value
1473
1475
are those for which the event are now enabled but were not previously. When
1474
1476
events are disabled, the return value is always empty.
1475
1477
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
1477
1479
|session|.
1478
1480
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|.
1485
1483
1486
1484
1. Let |event names| be an empty [=/set=] .
1487
1485
@@ -1491,73 +1489,116 @@ events are disabled, the return value is always empty.
1491
1489
1492
1490
1. Let |enabled events| be a new [=/map=] .
1493
1491
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|:
1495
1511
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:
1497
1537
1498
1538
1. For each |event name| of |event names|:
1499
1539
1500
- 1. If |global event set | doesn't contain |event name|:
1540
+ 1. If |global event map | doesn't [=map/ contain=] |event name|:
1501
1541
1502
- 1. Let |already enabled navigables| be the [=event enabled navigables=]
1542
+ 1. Let |already enabled navigables| be the [=event enabled navigables=]
1503
1543
given |session| and |event name|.
1504
1544
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=] .
1509
1546
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=]
1511
1548
that are not contained in |already enabled navigables|,
1512
1549
1513
- 1. Set |enabled events|[|event name|] to |newly enabled contexts|.
1550
+ 1. Set |enabled events|[|event name|] to |newly enabled contexts|.
1514
1551
1515
- 1. If |enabled| is false:
1552
+ 1. [=list/append=] |subscription| to |global event map| [||event name||] .
1516
1553
1517
- 1. For each |event name| in |event names| :
1554
+ 1. Otherwise, if |navigables| is not null :
1518
1555
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=] .
1522
1557
1523
- 1. Otherwise, if |navigables| is not null :
1558
+ 1. For each |navigable id| in |navigables| :
1524
1559
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|.
1526
1562
1527
- 1. For each | navigable id| in |navigables|:
1563
+ 1. Let |top-level traversable| be the [= navigable/top-level traversable=] for |navigable|.
1528
1564
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=] .
1531
1567
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|] .
1533
1569
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=] .
1536
1578
1537
- 1. Set |targets| [|top-level traversable|] to |event map |[|top-level traversable |] .
1579
+ 1. Append |navigable| to |enabled events |[|event name |] .
1538
1580
1539
- 1. For each |event name| in |event names| :
1581
+ 1. If |enabled| is false :
1540
1582
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|:
1542
1584
1543
- 1. For each |navigable| → |target| in |targets|:
1585
+ 1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
1544
1586
1545
- 1. If |enabled| is true and |target| does not contain |event name|:
1587
+ 1. TODO: clean up if empty.
1546
1588
1547
- 1. Add |event name| to |target| .
1589
+ 1. TODO: maybe error if not found .
1548
1590
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|:
1551
1592
1552
- 1. Append |navigable| to |enabled events| [| event name|] .
1593
+ 1. For each <var ignore> event name </var> -> |subscriptions| in |navigable event map|:
1553
1594
1554
- 1. If |enabled| is false:
1595
+ 1. |=list/remove=| items from |subscriptions| whose subscription id equals |subscription|'s subscription id.
1555
1596
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.
1559
1598
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|.
1561
1602
1562
1603
1. Set the [=navigable event map=] for |session| to |event map|.
1563
1604
@@ -1715,6 +1756,14 @@ session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";
1715
1756
The <code> session.UserPromptHandlerType</code> type represents the behavior
1716
1757
of the user prompt handler.
1717
1758
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
+
1718
1767
#### The session.SubscriptionRequest Type #### {#type-session-SubscriptionRequest}
1719
1768
1720
1769
<pre class="cddl remote-cddl">
@@ -1727,6 +1776,17 @@ session.SubscriptionRequest = {
1727
1776
The <code> session.SubscriptionRequest</code> type represents a request to
1728
1777
subscribe to or unsubscribe from a specific set of events.
1729
1778
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
+
1730
1790
### Commands ### {#module-session-commands}
1731
1791
1732
1792
#### The session.status Command #### {#command-session-status}
@@ -1920,9 +1980,11 @@ Issue: This needs to be generalized to work with realms too.
1920
1980
</dd>
1921
1981
<dt> Result Type</dt>
1922
1982
<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>
1926
1988
</dd>
1927
1989
</dl>
1928
1990
@@ -1935,8 +1997,10 @@ The [=remote end steps=] with |session| and |command parameters| are:
1935
1997
1. Let the |list of navigables| be the value of the <code> contexts</code>
1936
1998
field of |command parameters| if it is present or null if it isn't.
1937
1999
2000
+ 1. Let |subscription| be a [=subscription=] with subscription id set to the string representation of a UUID.
2001
+
1938
2002
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
1940
2004
enabled true.
1941
2005
1942
2006
1. Let |subscribe step events| be a new [=/map=] .
@@ -1982,7 +2046,7 @@ Issue: This needs to be generalised to work with realms too.
1982
2046
<pre class="cddl remote-cddl">
1983
2047
session.Unsubscribe = (
1984
2048
method: "session.unsubscribe",
1985
- params: session.SubscriptionRequest
2049
+ params: session.SubscriptionRequest / session.UnsubscribeRequest
1986
2050
)
1987
2051
</pre>
1988
2052
</dd>
@@ -2003,7 +2067,13 @@ The [=remote end steps=] with |session| and |command parameters| are:
2003
2067
1. Let the |list of contexts| be the value of the <code> contexts</code>
2004
2068
field of |command parameters| if it is present or null if it isn't.
2005
2069
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|,
2007
2077
|list of event names|, |list of contexts| and enabled false.
2008
2078
2009
2079
1. Return [=success=] with data null.
0 commit comments