@@ -2,6 +2,11 @@ import { MatrixEvent } from 'matrix-js-sdk';
2
2
3
3
import * as MatrixSDK from 'matrix-js-sdk' ;
4
4
5
+ import {
6
+ MSC3575SlidingSyncRequest ,
7
+ MSC3575SlidingSyncResponse ,
8
+ } from 'matrix-js-sdk/lib/sliding-sync' ;
9
+
5
10
import { baseRealm , unixTime } from '@cardstack/runtime-common' ;
6
11
7
12
import {
@@ -57,8 +62,12 @@ export class MockClient implements ExtendedClient {
57
62
}
58
63
59
64
async startClient (
60
- _opts ?: MatrixSDK . IStartClientOpts | undefined ,
65
+ opts ?: MatrixSDK . IStartClientOpts | undefined ,
61
66
) : Promise < void > {
67
+ if ( opts ?. slidingSync ) {
68
+ await opts . slidingSync . start ( ) ;
69
+ }
70
+
62
71
this . serverState . onEvent ( ( serverEvent : IEvent ) => {
63
72
this . emitEvent ( new MatrixEvent ( serverEvent ) ) ;
64
73
} ) ;
@@ -619,4 +628,60 @@ export class MockClient implements ExtendedClient {
619
628
mxcUrlToHttp ( mxcUrl : string ) : string {
620
629
return mxcUrl . replace ( 'mxc://' , 'http://mock-server/' ) ;
621
630
}
631
+
632
+ async slidingSync (
633
+ req : MSC3575SlidingSyncRequest ,
634
+ _proxyBaseUrl : string ,
635
+ _signal : AbortSignal ,
636
+ ) : Promise < MSC3575SlidingSyncResponse > {
637
+ let listKey = Object . keys ( req . lists || { } ) [ 0 ] ;
638
+ if ( ! listKey || ! req . lists ?. [ listKey ] ?. ranges ?. [ 0 ] ) {
639
+ return Promise . resolve ( {
640
+ pos : '0' ,
641
+ lists : { } ,
642
+ rooms : { } ,
643
+ extensions : { } ,
644
+ } ) ;
645
+ }
646
+
647
+ let [ start , end ] = req . lists [ listKey ] . ranges [ 0 ] ;
648
+ let roomsInRange = this . serverState . rooms
649
+ . filter ( ( r ) => r . id . includes ( 'mock' ) )
650
+ . slice ( start , end + 1 ) ;
651
+
652
+ let response : MSC3575SlidingSyncResponse = {
653
+ pos : String ( Date . now ( ) ) ,
654
+ lists : {
655
+ [ listKey ] : {
656
+ count : this . serverState . rooms . length ,
657
+ ops : [
658
+ {
659
+ op : 'SYNC' ,
660
+ range : [ start , end ] ,
661
+ room_ids : roomsInRange . map ( ( r ) => r . id ) ,
662
+ } ,
663
+ ] ,
664
+ } ,
665
+ } ,
666
+ rooms : { } ,
667
+ extensions : { } ,
668
+ } ;
669
+
670
+ roomsInRange . forEach ( ( room ) => {
671
+ response . rooms [ room . id ] = {
672
+ name :
673
+ this . serverState . getRoomState ( room . id , 'm.room.name' , '' ) ?. content
674
+ ?. name ?? 'room' ,
675
+ required_state : [ ] ,
676
+ timeline : this . serverState . getRoomEvents ( room . id ) ,
677
+ notification_count : 0 ,
678
+ highlight_count : 0 ,
679
+ joined_count : 1 ,
680
+ invited_count : 0 ,
681
+ initial : true ,
682
+ } ;
683
+ } ) ;
684
+
685
+ return Promise . resolve ( response ) ;
686
+ }
622
687
}
0 commit comments