1
- import type {
1
+ import {
2
+ RealtimeListener as WebxdcRealtimeListener ,
2
3
ReceivedStatusUpdate ,
3
4
SendingStatusUpdate ,
4
5
Webxdc ,
@@ -10,6 +11,7 @@ type UpdateListenerMulti = (updates: ReceivedStatusUpdate<any>[]) => boolean;
10
11
11
12
type ClearListener = ( ) => boolean ;
12
13
type DeleteListener = ( ) => boolean ;
14
+ type RTListener = ( data : Uint8Array ) => boolean ;
13
15
14
16
type Connect = (
15
17
updateListener : UpdateListenerMulti ,
@@ -20,7 +22,9 @@ type Connect = (
20
22
21
23
export type WebXdcMulti = {
22
24
connect : Connect ;
25
+ connectRealtime : ( listener : RTListener ) => void ;
23
26
sendUpdate : Webxdc < any > [ "sendUpdate" ] ;
27
+ sendRealtimeData : ( data : Uint8Array ) => void ;
24
28
} ;
25
29
26
30
export type OnMessage = ( message : Message ) => void ;
@@ -33,6 +37,7 @@ export interface IProcessor {
33
37
34
38
class Client implements WebXdcMulti {
35
39
updateListener : UpdateListenerMulti | null = null ;
40
+ realtimeListener : RTListener | null = null ;
36
41
clearListener : ClearListener | null = null ;
37
42
updateSerial : number | null = null ;
38
43
deleteListener : DeleteListener | null = null ;
@@ -46,6 +51,35 @@ class Client implements WebXdcMulti {
46
51
this . processor . distribute ( this . id , update ) ;
47
52
}
48
53
54
+ sendRealtimeData ( data : Uint8Array ) {
55
+ this . processor . distributeRealtime ( this . id , data ) ;
56
+ }
57
+
58
+ connectRealtime ( listener : RTListener ) {
59
+ this . processor . onMessage ( {
60
+ type : "connect-realtime" ,
61
+ instanceId : this . id ,
62
+ instanceColor : getColorForId ( this . id ) ,
63
+ timestamp : Date . now ( ) ,
64
+ } ) ;
65
+
66
+ const realtimeListener = ( data : Uint8Array ) => {
67
+ const hasReceived = listener ( data ) ;
68
+ if ( hasReceived ) {
69
+ this . processor . onMessage ( {
70
+ type : "realtime-received" ,
71
+ data,
72
+ instanceId : this . id ,
73
+ instanceColor : getColorForId ( this . id ) ,
74
+ timestamp : Date . now ( ) ,
75
+ } ) ;
76
+ }
77
+ return hasReceived ;
78
+ } ;
79
+
80
+ this . realtimeListener = realtimeListener ;
81
+ }
82
+
49
83
connect (
50
84
listener : UpdateListenerMulti ,
51
85
serial : number ,
@@ -108,6 +142,13 @@ class Client implements WebXdcMulti {
108
142
this . updateListener ( [ update ] ) ;
109
143
}
110
144
145
+ receiveRealtime ( data : Uint8Array ) {
146
+ if ( this . realtimeListener == null ) {
147
+ return ;
148
+ }
149
+ this . realtimeListener ( data ) ;
150
+ }
151
+
111
152
clear ( ) {
112
153
if (
113
154
this . clearListener == null ||
@@ -148,6 +189,21 @@ class Processor implements IProcessor {
148
189
this . clients . splice ( client_index , 1 ) ;
149
190
}
150
191
192
+ distributeRealtime ( instanceId : string , data : Uint8Array ) {
193
+ this . onMessage ( {
194
+ type : "realtime-sent" ,
195
+ instanceId : instanceId ,
196
+ instanceColor : getColorForId ( instanceId ) ,
197
+ data,
198
+ timestamp : Date . now ( ) ,
199
+ } ) ;
200
+ for ( const client of this . clients ) {
201
+ if ( client . id != instanceId ) {
202
+ client . receiveRealtime ( data ) ;
203
+ }
204
+ }
205
+ }
206
+
151
207
distribute ( instanceId : string , update : SendingStatusUpdate < any > ) {
152
208
this . currentSerial ++ ;
153
209
const receivedUpdate : ReceivedStatusUpdate < any > = {
0 commit comments