@@ -342,8 +342,14 @@ describe("MatrixClient event timelines", function() {
342
342
httpBackend . verifyNoOutstandingExpectation ( ) ;
343
343
client . stopClient ( ) ;
344
344
Thread . setServerSideSupport ( FeatureSupport . None ) ;
345
+ Thread . setServerSideListSupport ( FeatureSupport . None ) ;
346
+ Thread . setServerSideFwdPaginationSupport ( FeatureSupport . None ) ;
345
347
} ) ;
346
348
349
+ async function flushHttp < T > ( promise : Promise < T > ) : Promise < T > {
350
+ return Promise . all ( [ promise , httpBackend . flushAllExpected ( ) ] ) . then ( ( [ result ] ) => result ) ;
351
+ }
352
+
347
353
describe ( "getEventTimeline" , function ( ) {
348
354
it ( "should create a new timeline for new events" , function ( ) {
349
355
const room = client . getRoom ( roomId ) ! ;
@@ -595,31 +601,51 @@ describe("MatrixClient event timelines", function() {
595
601
// @ts -ignore
596
602
client . clientOpts . experimentalThreadSupport = true ;
597
603
Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
598
- client . stopClient ( ) ; // we don't need the client to be syncing at this time
604
+ await client . stopClient ( ) ; // we don't need the client to be syncing at this time
599
605
const room = client . getRoom ( roomId ) ! ;
600
- const thread = room . createThread ( THREAD_ROOT . event_id ! , undefined , [ ] , false ) ;
601
- const timelineSet = thread . timelineSet ;
602
606
603
- httpBackend . when ( "GET" , "/rooms/!foo%3Abar/context/" + encodeURIComponent ( THREAD_REPLY . event_id ! ) )
607
+ httpBackend . when ( "GET" , "/rooms/!foo%3Abar/event/" + encodeURIComponent ( THREAD_ROOT . event_id ! ) )
608
+ . respond ( 200 , function ( ) {
609
+ return THREAD_ROOT ;
610
+ } ) ;
611
+
612
+ httpBackend . when ( "GET" , "/rooms/!foo%3Abar/relations/" +
613
+ encodeURIComponent ( THREAD_ROOT . event_id ! ) + "/" +
614
+ encodeURIComponent ( THREAD_RELATION_TYPE . name ) + "?dir=b&limit=1" )
604
615
. respond ( 200 , function ( ) {
605
616
return {
606
- start : "start_token0" ,
607
- events_before : [ ] ,
608
- event : THREAD_REPLY ,
609
- events_after : [ ] ,
610
- end : "end_token0" ,
611
- state : [ ] ,
617
+ original_event : THREAD_ROOT ,
618
+ chunk : [ THREAD_REPLY ] ,
619
+ // no next batch as this is the oldest end of the timeline
612
620
} ;
613
621
} ) ;
614
622
623
+ const thread = room . createThread ( THREAD_ROOT . event_id ! , undefined , [ ] , false ) ;
624
+ await httpBackend . flushAllExpected ( ) ;
625
+ const timelineSet = thread . timelineSet ;
626
+
627
+ const timelinePromise = client . getEventTimeline ( timelineSet , THREAD_REPLY . event_id ! ) ;
628
+ const timeline = await timelinePromise ;
629
+
630
+ expect ( timeline ! . getEvents ( ) . find ( e => e . getId ( ) === THREAD_ROOT . event_id ! ) ) . toBeTruthy ( ) ;
631
+ expect ( timeline ! . getEvents ( ) . find ( e => e . getId ( ) === THREAD_REPLY . event_id ! ) ) . toBeTruthy ( ) ;
632
+ } ) ;
633
+
634
+ it ( "should handle thread replies with server support by fetching a contiguous thread timeline" , async ( ) => {
635
+ // @ts -ignore
636
+ client . clientOpts . experimentalThreadSupport = true ;
637
+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
638
+ await client . stopClient ( ) ; // we don't need the client to be syncing at this time
639
+ const room = client . getRoom ( roomId ) ! ;
640
+
615
641
httpBackend . when ( "GET" , "/rooms/!foo%3Abar/event/" + encodeURIComponent ( THREAD_ROOT . event_id ! ) )
616
642
. respond ( 200 , function ( ) {
617
643
return THREAD_ROOT ;
618
644
} ) ;
619
645
620
646
httpBackend . when ( "GET" , "/rooms/!foo%3Abar/relations/" +
621
647
encodeURIComponent ( THREAD_ROOT . event_id ! ) + "/" +
622
- encodeURIComponent ( THREAD_RELATION_TYPE . name ) + "?limit=20 " )
648
+ encodeURIComponent ( THREAD_RELATION_TYPE . name ) + "?dir=b& limit=1 " )
623
649
. respond ( 200 , function ( ) {
624
650
return {
625
651
original_event : THREAD_ROOT ,
@@ -628,9 +654,11 @@ describe("MatrixClient event timelines", function() {
628
654
} ;
629
655
} ) ;
630
656
631
- const timelinePromise = client . getEventTimeline ( timelineSet , THREAD_REPLY . event_id ! ) ;
657
+ const thread = room . createThread ( THREAD_ROOT . event_id ! , undefined , [ ] , false ) ;
632
658
await httpBackend . flushAllExpected ( ) ;
659
+ const timelineSet = thread . timelineSet ;
633
660
661
+ const timelinePromise = client . getEventTimeline ( timelineSet , THREAD_REPLY . event_id ! ) ;
634
662
const timeline = await timelinePromise ;
635
663
636
664
expect ( timeline ! . getEvents ( ) . find ( e => e . getId ( ) === THREAD_ROOT . event_id ! ) ) . toBeTruthy ( ) ;
@@ -1025,10 +1053,6 @@ describe("MatrixClient event timelines", function() {
1025
1053
} ) ;
1026
1054
1027
1055
describe ( "paginateEventTimeline for thread list timeline" , function ( ) {
1028
- async function flushHttp < T > ( promise : Promise < T > ) : Promise < T > {
1029
- return Promise . all ( [ promise , httpBackend . flushAllExpected ( ) ] ) . then ( ( [ result ] ) => result ) ;
1030
- }
1031
-
1032
1056
const RANDOM_TOKEN = "7280349c7bee430f91defe2a38a0a08c" ;
1033
1057
1034
1058
function respondToFilter ( ) : ExpectedHttpRequest {
@@ -1050,7 +1074,7 @@ describe("MatrixClient event timelines", function() {
1050
1074
next_batch : RANDOM_TOKEN as string | null ,
1051
1075
} ,
1052
1076
) : ExpectedHttpRequest {
1053
- const request = httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/r0 /rooms/$roomId/threads" , {
1077
+ const request = httpBackend . when ( "GET" , encodeUri ( "/_matrix/client/v1 /rooms/$roomId/threads" , {
1054
1078
$roomId : roomId ,
1055
1079
} ) ) ;
1056
1080
request . respond ( 200 , response ) ;
@@ -1089,8 +1113,9 @@ describe("MatrixClient event timelines", function() {
1089
1113
beforeEach ( ( ) => {
1090
1114
// @ts -ignore
1091
1115
client . clientOpts . experimentalThreadSupport = true ;
1092
- Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
1116
+ Thread . setServerSideSupport ( FeatureSupport . Stable ) ;
1093
1117
Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
1118
+ Thread . setServerSideFwdPaginationSupport ( FeatureSupport . Stable ) ;
1094
1119
} ) ;
1095
1120
1096
1121
async function testPagination ( timelineSet : EventTimelineSet , direction : Direction ) {
@@ -1111,7 +1136,7 @@ describe("MatrixClient event timelines", function() {
1111
1136
1112
1137
it ( "should allow you to paginate all threads backwards" , async function ( ) {
1113
1138
const room = client . getRoom ( roomId ) ;
1114
- const timelineSets = await ( room ? .createThreadsTimelineSets ( ) ) ;
1139
+ const timelineSets = await room ! . createThreadsTimelineSets ( ) ;
1115
1140
expect ( timelineSets ) . not . toBeNull ( ) ;
1116
1141
const [ allThreads , myThreads ] = timelineSets ! ;
1117
1142
await testPagination ( allThreads , Direction . Backward ) ;
@@ -1120,7 +1145,7 @@ describe("MatrixClient event timelines", function() {
1120
1145
1121
1146
it ( "should allow you to paginate all threads forwards" , async function ( ) {
1122
1147
const room = client . getRoom ( roomId ) ;
1123
- const timelineSets = await ( room ? .createThreadsTimelineSets ( ) ) ;
1148
+ const timelineSets = await room ! . createThreadsTimelineSets ( ) ;
1124
1149
expect ( timelineSets ) . not . toBeNull ( ) ;
1125
1150
const [ allThreads , myThreads ] = timelineSets ! ;
1126
1151
@@ -1130,7 +1155,7 @@ describe("MatrixClient event timelines", function() {
1130
1155
1131
1156
it ( "should allow fetching all threads" , async function ( ) {
1132
1157
const room = client . getRoom ( roomId ) ! ;
1133
- const timelineSets = await room . createThreadsTimelineSets ( ) ;
1158
+ const timelineSets = await room ! . createThreadsTimelineSets ( ) ;
1134
1159
expect ( timelineSets ) . not . toBeNull ( ) ;
1135
1160
respondToThreads ( ) ;
1136
1161
respondToThreads ( ) ;
@@ -1418,74 +1443,115 @@ describe("MatrixClient event timelines", function() {
1418
1443
} ) ;
1419
1444
} ) ;
1420
1445
1421
- it ( "should re-insert room IDs for bundled thread relation events" , async ( ) => {
1422
- // @ts -ignore
1423
- client . clientOpts . experimentalThreadSupport = true ;
1424
- Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
1425
-
1426
- httpBackend . when ( "GET" , "/sync" ) . respond ( 200 , {
1427
- next_batch : "s_5_4" ,
1428
- rooms : {
1429
- join : {
1430
- [ roomId ] : {
1431
- timeline : {
1432
- events : [
1433
- SYNC_THREAD_ROOT ,
1434
- ] ,
1435
- prev_batch : "f_1_1" ,
1446
+ describe ( "should re-insert room IDs for bundled thread relation events" , ( ) => {
1447
+ async function doTest ( ) {
1448
+ httpBackend . when ( "GET" , "/sync" ) . respond ( 200 , {
1449
+ next_batch : "s_5_4" ,
1450
+ rooms : {
1451
+ join : {
1452
+ [ roomId ] : {
1453
+ timeline : {
1454
+ events : [
1455
+ SYNC_THREAD_ROOT ,
1456
+ ] ,
1457
+ prev_batch : "f_1_1" ,
1458
+ } ,
1436
1459
} ,
1437
1460
} ,
1438
1461
} ,
1439
- } ,
1440
- } ) ;
1441
- await Promise . all ( [ httpBackend . flushAllExpected ( ) , utils . syncPromise ( client ) ] ) ;
1462
+ } ) ;
1463
+ await Promise . all ( [ httpBackend . flushAllExpected ( ) , utils . syncPromise ( client ) ] ) ;
1442
1464
1443
- const room = client . getRoom ( roomId ) ! ;
1444
- const thread = room . getThread ( THREAD_ROOT . event_id ! ) ! ;
1445
- const timelineSet = thread . timelineSet ;
1465
+ const room = client . getRoom ( roomId ) ! ;
1466
+ const thread = room . getThread ( THREAD_ROOT . event_id ! ) ! ;
1467
+ const timelineSet = thread . timelineSet ;
1446
1468
1447
- httpBackend . when ( "GET" , "/rooms/!foo%3Abar/context/" + encodeURIComponent ( THREAD_ROOT . event_id ! ) )
1448
- . respond ( 200 , {
1449
- start : "start_token" ,
1450
- events_before : [ ] ,
1451
- event : THREAD_ROOT ,
1452
- events_after : [ ] ,
1453
- state : [ ] ,
1454
- end : "end_token" ,
1455
- } ) ;
1456
- httpBackend . when ( "GET" , "/rooms/!foo%3Abar/relations/" +
1457
- encodeURIComponent ( THREAD_ROOT . event_id ! ) + "/" +
1458
- encodeURIComponent ( THREAD_RELATION_TYPE . name ) + "?limit=20" )
1459
- . respond ( 200 , function ( ) {
1460
- return {
1461
- original_event : THREAD_ROOT ,
1462
- chunk : [ THREAD_REPLY ] ,
1463
- // no next batch as this is the oldest end of the timeline
1464
- } ;
1465
- } ) ;
1466
- await Promise . all ( [
1467
- client . getEventTimeline ( timelineSet , THREAD_ROOT . event_id ! ) ,
1468
- httpBackend . flushAllExpected ( ) ,
1469
- ] ) ;
1469
+ const buildParams = ( direction : Direction , token : string ) : string => {
1470
+ if ( Thread . hasServerSideFwdPaginationSupport === FeatureSupport . Experimental ) {
1471
+ return `?from=${ token } &org.matrix.msc3715.dir=${ direction } ` ;
1472
+ } else {
1473
+ return `?dir=${ direction } &from=${ token } ` ;
1474
+ }
1475
+ } ;
1470
1476
1471
- httpBackend . when ( "GET" , "/sync" ) . respond ( 200 , {
1472
- next_batch : "s_5_5" ,
1473
- rooms : {
1474
- join : {
1475
- [ roomId ] : {
1476
- timeline : {
1477
- events : [
1478
- SYNC_THREAD_REPLY ,
1479
- ] ,
1480
- prev_batch : "f_1_2" ,
1477
+ httpBackend . when ( "GET" , "/rooms/!foo%3Abar/context/" + encodeURIComponent ( THREAD_ROOT . event_id ! ) )
1478
+ . respond ( 200 , {
1479
+ start : "start_token" ,
1480
+ events_before : [ ] ,
1481
+ event : THREAD_ROOT ,
1482
+ events_after : [ ] ,
1483
+ state : [ ] ,
1484
+ end : "end_token" ,
1485
+ } ) ;
1486
+ httpBackend . when ( "GET" , "/rooms/!foo%3Abar/relations/" +
1487
+ encodeURIComponent ( THREAD_ROOT . event_id ! ) + "/" +
1488
+ encodeURIComponent ( THREAD_RELATION_TYPE . name ) + buildParams ( Direction . Backward , "start_token" ) )
1489
+ . respond ( 200 , function ( ) {
1490
+ return {
1491
+ original_event : THREAD_ROOT ,
1492
+ chunk : [ ] ,
1493
+ } ;
1494
+ } ) ;
1495
+ httpBackend . when ( "GET" , "/rooms/!foo%3Abar/relations/" +
1496
+ encodeURIComponent ( THREAD_ROOT . event_id ! ) + "/" +
1497
+ encodeURIComponent ( THREAD_RELATION_TYPE . name ) + buildParams ( Direction . Forward , "end_token" ) )
1498
+ . respond ( 200 , function ( ) {
1499
+ return {
1500
+ original_event : THREAD_ROOT ,
1501
+ chunk : [ THREAD_REPLY ] ,
1502
+ } ;
1503
+ } ) ;
1504
+ const timeline = await flushHttp ( client . getEventTimeline ( timelineSet , THREAD_ROOT . event_id ! ) ) ;
1505
+
1506
+ httpBackend . when ( "GET" , "/sync" ) . respond ( 200 , {
1507
+ next_batch : "s_5_5" ,
1508
+ rooms : {
1509
+ join : {
1510
+ [ roomId ] : {
1511
+ timeline : {
1512
+ events : [
1513
+ SYNC_THREAD_REPLY ,
1514
+ ] ,
1515
+ prev_batch : "f_1_2" ,
1516
+ } ,
1481
1517
} ,
1482
1518
} ,
1483
1519
} ,
1484
- } ,
1520
+ } ) ;
1521
+
1522
+ await Promise . all ( [ httpBackend . flushAllExpected ( ) , utils . syncPromise ( client ) ] ) ;
1523
+
1524
+ expect ( timeline ! . getEvents ( ) [ 1 ] ! . event ) . toEqual ( THREAD_REPLY ) ;
1525
+ }
1526
+
1527
+ it ( "in stable mode" , async ( ) => {
1528
+ // @ts -ignore
1529
+ client . clientOpts . experimentalThreadSupport = true ;
1530
+ Thread . setServerSideSupport ( FeatureSupport . Stable ) ;
1531
+ Thread . setServerSideListSupport ( FeatureSupport . Stable ) ;
1532
+ Thread . setServerSideFwdPaginationSupport ( FeatureSupport . Stable ) ;
1533
+
1534
+ return doTest ( ) ;
1485
1535
} ) ;
1486
1536
1487
- await Promise . all ( [ httpBackend . flushAllExpected ( ) , utils . syncPromise ( client ) ] ) ;
1537
+ it ( "in backwards compatible unstable mode" , async ( ) => {
1538
+ // @ts -ignore
1539
+ client . clientOpts . experimentalThreadSupport = true ;
1540
+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
1541
+ Thread . setServerSideListSupport ( FeatureSupport . Experimental ) ;
1542
+ Thread . setServerSideFwdPaginationSupport ( FeatureSupport . Experimental ) ;
1488
1543
1489
- expect ( thread . liveTimeline . getEvents ( ) [ 1 ] . event ) . toEqual ( THREAD_REPLY ) ;
1544
+ return doTest ( ) ;
1545
+ } ) ;
1546
+
1547
+ it ( "in backwards compatible mode" , async ( ) => {
1548
+ // @ts -ignore
1549
+ client . clientOpts . experimentalThreadSupport = true ;
1550
+ Thread . setServerSideSupport ( FeatureSupport . Experimental ) ;
1551
+ Thread . setServerSideListSupport ( FeatureSupport . None ) ;
1552
+ Thread . setServerSideFwdPaginationSupport ( FeatureSupport . None ) ;
1553
+
1554
+ return doTest ( ) ;
1555
+ } ) ;
1490
1556
} ) ;
1491
1557
} ) ;
0 commit comments