@@ -17,6 +17,16 @@ const PusherWebsocketReactNative = NativeModules.PusherWebsocketReactNative
17
17
}
18
18
) ;
19
19
20
+ enum EVENT_TYPE {
21
+ ON_AUTHORIZER = 'PusherReactNative:onAuthorizer' ,
22
+ ON_CONNECTION_STATE_CHANGE = 'PusherReactNative:onConnectionStateChange' ,
23
+ ON_SUBSCRIPTION_ERROR = 'PusherReactNative:onSubscriptionError' ,
24
+ ON_EVENT = 'PusherReactNative:onEvent' ,
25
+ ON_ERROR = 'PusherReactNative:onError' ,
26
+ ON_MEMBER_ADDED = 'PusherReactNative:onMemberAdded' ,
27
+ ON_MEMBER_REMOVED = 'PusherReactNative:onMemberRemoved' ,
28
+ }
29
+
20
30
export interface PusherAuthorizerResult {
21
31
/** required for private channels */
22
32
auth ?: string ;
@@ -122,8 +132,10 @@ export class Pusher {
122
132
return Pusher . instance ;
123
133
}
124
134
125
- private addListener ( event : string , callback : ( event : any ) => void ) {
126
- const pusherEventName = `PusherReactNative:${ event } ` ;
135
+ private addListener (
136
+ pusherEventName : EVENT_TYPE ,
137
+ callback : ( event : any ) => void
138
+ ) {
127
139
return this . pusherEventEmitter . addListener ( pusherEventName , callback ) ;
128
140
}
129
141
@@ -162,19 +174,19 @@ export class Pusher {
162
174
onMemberAdded ?: ( channelName : string , member : PusherMember ) => void ;
163
175
onMemberRemoved ?: ( channelName : string , member : PusherMember ) => void ;
164
176
} ) {
165
- this . addListener ( 'onConnectionStateChange' , ( event : any ) => {
177
+ this . addListener ( EVENT_TYPE . ON_CONNECTION_STATE_CHANGE , ( event : any ) => {
166
178
this . connectionState = event . currentState . toUpperCase ( ) ;
167
179
args . onConnectionStateChange ?.(
168
180
event . currentState . toUpperCase ( ) ,
169
181
event . previousState . toUpperCase ( )
170
182
) ;
171
183
} ) ;
172
184
173
- this . addListener ( 'onError' , ( event : any ) =>
185
+ this . addListener ( EVENT_TYPE . ON_ERROR , ( event : any ) =>
174
186
args . onError ?.( event . message , event . code , event . error )
175
187
) ;
176
188
177
- this . addListener ( 'onEvent' , ( event : any ) => {
189
+ this . addListener ( EVENT_TYPE . ON_EVENT , ( event : any ) => {
178
190
const channelName = event . channelName ;
179
191
const eventName = event . eventName ;
180
192
const data = event . data ;
@@ -216,7 +228,7 @@ export class Pusher {
216
228
}
217
229
} ) ;
218
230
219
- this . addListener ( 'onMemberAdded' , ( event ) => {
231
+ this . addListener ( EVENT_TYPE . ON_MEMBER_ADDED , ( event ) => {
220
232
const user = event . user ;
221
233
const channelName = event . channelName ;
222
234
var member = new PusherMember ( user . userId , user . userInfo ) ;
@@ -226,7 +238,7 @@ export class Pusher {
226
238
channel ?. onMemberAdded ?.( member ) ;
227
239
} ) ;
228
240
229
- this . addListener ( 'onMemberRemoved' , ( event ) => {
241
+ this . addListener ( EVENT_TYPE . ON_MEMBER_REMOVED , ( event ) => {
230
242
const user = event . user ;
231
243
const channelName = event . channelName ;
232
244
var member = new PusherMember ( user . userId , user . userInfo ) ;
@@ -236,19 +248,22 @@ export class Pusher {
236
248
channel ?. onMemberRemoved ?.( member ) ;
237
249
} ) ;
238
250
239
- this . addListener ( 'onAuthorizer' , async ( { channelName, socketId } ) => {
240
- const data = await args . onAuthorizer ?.( channelName , socketId ) ;
241
- if ( data ) {
242
- await PusherWebsocketReactNative . onAuthorizer (
243
- channelName ,
244
- socketId ,
245
- data
246
- ) ;
251
+ this . addListener (
252
+ EVENT_TYPE . ON_AUTHORIZER ,
253
+ async ( { channelName, socketId } ) => {
254
+ const data = await args . onAuthorizer ?.( channelName , socketId ) ;
255
+ if ( data ) {
256
+ await PusherWebsocketReactNative . onAuthorizer (
257
+ channelName ,
258
+ socketId ,
259
+ data
260
+ ) ;
261
+ }
247
262
}
248
- } ) ;
263
+ ) ;
249
264
250
265
this . addListener (
251
- 'onSubscriptionError' ,
266
+ EVENT_TYPE . ON_SUBSCRIPTION_ERROR ,
252
267
async ( { channelName, message, type } ) => {
253
268
args . onSubscriptionError ?.( channelName , message , type ) ;
254
269
}
@@ -277,6 +292,26 @@ export class Pusher {
277
292
return await PusherWebsocketReactNative . disconnect ( ) ;
278
293
}
279
294
295
+ private unsubscribeAllChannels ( ) {
296
+ const channelsCopy = new Map ( this . channels ) ;
297
+ channelsCopy . forEach ( ( channel ) => {
298
+ this . unsubscribe ( { channelName : channel . channelName } ) ;
299
+ } ) ;
300
+ }
301
+
302
+ private removeAllListeners ( ) {
303
+ this . pusherEventEmitter . removeAllListeners ( EVENT_TYPE . ON_AUTHORIZER ) ;
304
+ this . pusherEventEmitter . removeAllListeners ( EVENT_TYPE . ON_ERROR ) ;
305
+ this . pusherEventEmitter . removeAllListeners ( EVENT_TYPE . ON_EVENT ) ;
306
+ this . pusherEventEmitter . removeAllListeners ( EVENT_TYPE . ON_MEMBER_ADDED ) ;
307
+ this . pusherEventEmitter . removeAllListeners ( EVENT_TYPE . ON_MEMBER_REMOVED ) ;
308
+ }
309
+
310
+ public async resetPusherInstance ( ) {
311
+ this . removeAllListeners ( ) ;
312
+ this . unsubscribeAllChannels ( ) ;
313
+ }
314
+
280
315
async subscribe ( args : {
281
316
channelName : string ;
282
317
onSubscriptionSucceeded ?: ( data : any ) => void ;
0 commit comments