1
- import { Webxdc , ReceivedStatusUpdate } from "@webxdc/types" ;
2
- import { RealtimeListener as RTL } from "../backend/message" ;
1
+ import { Webxdc , ReceivedStatusUpdate , RealtimeListener as WebxdcRealtimeListener } from "@webxdc/types" ;
3
2
type UpdatesMessage = {
4
3
type : "updates" ;
5
4
updates : ReceivedStatusUpdate < any > [ ] ;
6
5
} ;
7
6
8
- type SendRealtimeMessage = {
9
- type : "sendRealtime " ;
7
+ type RealtimeMessage = {
8
+ type : "realtime " ;
10
9
data : Uint8Array ;
11
10
} ;
12
11
@@ -33,7 +32,7 @@ type Message =
33
32
| ClearMessage
34
33
| InfoMessage
35
34
| DeleteMessage
36
- | SendRealtimeMessage ;
35
+ | RealtimeMessage ;
37
36
38
37
export type TransportMessageCallback = ( message : Message ) => void ;
39
38
@@ -52,12 +51,54 @@ export type Transport = {
52
51
53
52
type Log = ( ...args : any [ ] ) => void ;
54
53
54
+ export class RealtimeListener implements WebxdcRealtimeListener {
55
+ private trashed = false ;
56
+ private listener : ( data : Uint8Array ) => void = ( ) => { } ;
57
+
58
+ constructor (
59
+ public sendHook : ( data : Uint8Array ) => void = ( ) => { } ,
60
+ public setListenerHook : ( ) => void = ( ) => { } ,
61
+ private leaveHook : ( ) => void = ( ) => { } ,
62
+ ) { }
63
+
64
+ is_trashed ( ) : boolean {
65
+ return this . trashed ;
66
+ }
67
+
68
+ receive ( data : Uint8Array ) {
69
+ if ( this . trashed ) {
70
+ throw new Error ( "realtime listener is trashed and can no longer be used" ) ;
71
+ }
72
+ if ( this . listener ) {
73
+ this . listener ( data ) ;
74
+ }
75
+ }
76
+
77
+ setListener ( listener : ( data : Uint8Array ) => void ) {
78
+ this . setListenerHook ( ) ;
79
+ this . listener = listener ;
80
+ }
81
+
82
+ send ( data : Uint8Array ) {
83
+ if ( ! ( data instanceof Uint8Array ) ) {
84
+ throw new Error ( "realtime listener data must be a Uint8Array" ) ;
85
+ }
86
+ this . sendHook ( data ) ;
87
+ }
88
+
89
+ leave ( ) {
90
+ this . leaveHook ( ) ;
91
+ this . trashed = true ;
92
+ }
93
+ }
94
+
55
95
export function createWebXdc (
56
96
transport : Transport ,
57
97
log : Log = ( ) => { } ,
58
98
) : Webxdc < any > {
59
99
let resolveUpdateListenerPromise : ( ( ) => void ) | null = null ;
60
- let realtime : RTL | null = null ;
100
+ let realtime : RealtimeListener | null = null ;
101
+
61
102
const webXdc : Webxdc < any > = {
62
103
sendUpdate : ( update ) => {
63
104
transport . send ( { type : "sendUpdate" , update } ) ;
@@ -208,7 +249,7 @@ export function createWebXdc(
208
249
} ,
209
250
210
251
joinRealtimeChannel : ( ) => {
211
- realtime = new RTL (
252
+ realtime = new RealtimeListener (
212
253
( ) => { } ,
213
254
( ) => {
214
255
transport . send ( { type : "setRealtimeListener" } ) ;
@@ -219,7 +260,7 @@ export function createWebXdc(
219
260
) ;
220
261
transport . onConnect ( ( ) => {
221
262
realtime ! . sendHook = ( data ) => {
222
- transport . send ( { type : "sendRealtime " , data } as SendRealtimeMessage ) ;
263
+ transport . send ( { type : "realtime " , data } as RealtimeMessage ) ;
223
264
log ( "send realtime" , { data } ) ;
224
265
} ;
225
266
} ) ;
@@ -241,8 +282,8 @@ function isUpdatesMessage(data: Message): data is UpdatesMessage {
241
282
return data . type === "updates" ;
242
283
}
243
284
244
- function isRealtimeMessage ( data : Message ) : data is SendRealtimeMessage {
245
- return data . type === "sendRealtime " ;
285
+ function isRealtimeMessage ( data : Message ) : data is RealtimeMessage {
286
+ return data . type === "realtime " ;
246
287
}
247
288
248
289
function isClearMessage ( data : Message ) : data is ClearMessage {
0 commit comments