1
- import * as Socket from '../../lib/ socket' ;
1
+ import * as Socket from '@superviz/ socket-client ' ;
2
2
import throttle from 'lodash/throttle' ;
3
3
4
- import { ComponentLifeCycleEvent } from '../../common/types/events.types' ;
5
4
import { Participant } from '../../common/types/participant.types' ;
6
5
import { Logger , Observable , Observer } from '../../common/utils' ;
7
6
import { IOC } from '../../services/io' ;
8
7
9
- import { RealtimeChannelEvent , RealtimeChannelState , RealtimeData , RealtimeMessage } from './types' ;
8
+ import {
9
+ RealtimeChannelEvent ,
10
+ RealtimeChannelState ,
11
+ RealtimeData ,
12
+ RealtimeMessage ,
13
+ RealtimePublish ,
14
+ RealtimeChannelSubscribe ,
15
+ Callback ,
16
+ } from './types' ;
17
+ import { RealtimePresence } from './presence' ;
10
18
11
19
export class Channel extends Observable {
12
20
private name : string ;
@@ -19,6 +27,7 @@ export class Channel extends Observable {
19
27
event : string ;
20
28
callback : ( data : unknown ) => void ;
21
29
} > = [ ] ;
30
+ public participant : RealtimePresence ;
22
31
23
32
constructor (
24
33
name : string ,
@@ -36,6 +45,7 @@ export class Channel extends Observable {
36
45
37
46
this . subscribeToRealtimeEvents ( ) ;
38
47
this . logger . log ( 'started' ) ;
48
+ this . participant = new RealtimePresence ( this . channel ) ;
39
49
}
40
50
41
51
public async disconnect ( ) : Promise < void > {
@@ -51,16 +61,11 @@ export class Channel extends Observable {
51
61
52
62
/**
53
63
* @function publish
54
- * @description Publishes an event with optional data to the channel.
64
+ * @description Publishes an event with data to the channel.
55
65
* @param event - The name of the event to publish.
56
- * @param data - Optional data to be sent along with the event.
66
+ * @param data - Data to be sent along with the event.
57
67
*/
58
- public publish = throttle ( ( event : string , data ?: unknown ) : void => {
59
- if ( Object . values ( ComponentLifeCycleEvent ) . includes ( event as ComponentLifeCycleEvent ) ) {
60
- this . publishEventToClient ( event , data ) ;
61
- return ;
62
- }
63
-
68
+ public publish : RealtimePublish = throttle ( ( event : string , data ) : void => {
64
69
if ( this . state !== RealtimeChannelState . CONNECTED ) {
65
70
const message = `Realtime channel ${ this . name } is not started yet. You can't publish event ${ event } before start` ;
66
71
this . logger . log ( message ) ;
@@ -78,7 +83,10 @@ export class Channel extends Observable {
78
83
* @param event - The name of the event to subscribe to.
79
84
* @param callback - The callback function to handle the received data. It takes a parameter of type `RealtimeMessage` or `string`.
80
85
*/
81
- public subscribe = ( event : string , callback : ( data : RealtimeMessage | string ) => void ) : void => {
86
+ public subscribe : RealtimeChannelSubscribe = < T = unknown > (
87
+ event : string ,
88
+ callback : Callback < T > ,
89
+ ) : void => {
82
90
if ( this . state !== RealtimeChannelState . CONNECTED ) {
83
91
this . callbacksToSubscribeWhenJoined . push ( { event, callback } ) ;
84
92
return ;
@@ -97,13 +105,11 @@ export class Channel extends Observable {
97
105
* @param event - The event to unsubscribe from.
98
106
* @param callback - An optional callback function to be called when the event is unsubscribed.
99
107
*/
100
- public unsubscribe = (
108
+ public unsubscribe : RealtimeChannelSubscribe = < T = unknown > (
101
109
event : string ,
102
- callback ?: ( data : RealtimeMessage | string ) => void ,
110
+ callback ?: Callback < T > ,
103
111
) : void => {
104
- if ( ! this . observers [ event ] ) return ;
105
-
106
- this . observers [ event ] . unsubscribe ( callback ) ;
112
+ this . observers [ event ] ?. unsubscribe ( callback ) ;
107
113
} ;
108
114
109
115
/**
@@ -116,7 +122,10 @@ export class Channel extends Observable {
116
122
this . logger . log ( 'realtime component @ changeState - state changed' , state ) ;
117
123
this . state = state ;
118
124
119
- this . publishEventToClient ( RealtimeChannelEvent . REALTIME_CHANNEL_STATE_CHANGED , this . state ) ;
125
+ this . publishEventToClient < RealtimeChannelState > (
126
+ RealtimeChannelEvent . REALTIME_CHANNEL_STATE_CHANGED ,
127
+ this . state ,
128
+ ) ;
120
129
}
121
130
122
131
private subscribeToRealtimeEvents ( ) : void {
@@ -136,13 +145,13 @@ export class Channel extends Observable {
136
145
137
146
this . channel . on < RealtimeData > ( `message:${ this . name } ` , ( event ) => {
138
147
this . logger . log ( 'message received' , event ) ;
139
- this . publishEventToClient ( event . data . name , {
148
+ this . publishEventToClient < RealtimeMessage > ( event . data . name , {
140
149
data : event . data . payload ,
141
- participantId : event ?. presence ?. id || null ,
150
+ participantId : event ?. presence ?. id ?? null ,
142
151
name : event . data . name ,
143
152
timestamp : event . timestamp ,
144
153
connectionId : event . connectionId ,
145
- } as RealtimeMessage ) ;
154
+ } ) ;
146
155
} ) ;
147
156
}
148
157
@@ -214,11 +223,9 @@ export class Channel extends Observable {
214
223
* @param data - data to publish
215
224
* @returns {void }
216
225
*/
217
- private publishEventToClient = ( event : string , data ?: unknown ) : void => {
226
+ private publishEventToClient = < T = unknown > ( event : string , data ?: T ) : void => {
218
227
this . logger . log ( 'realtime channel @ publishEventToClient' , { event, data } ) ;
219
228
220
- if ( ! this . observers [ event ] ) return ;
221
-
222
- this . observers [ event ] . publish ( data ) ;
229
+ this . observers [ event ] ?. publish ( data ) ;
223
230
} ;
224
231
}
0 commit comments