@@ -3,7 +3,8 @@ import Foundation
3
3
4
4
@objc ( PusherWebsocketReactNative)
5
5
@objcMembers class PusherWebsocketReactNative : RCTEventEmitter , PusherDelegate , Authorizer {
6
- private var pusher : Pusher !
6
+ private static var shared : PusherWebsocketReactNative !
7
+ private static var pusher : Pusher !
7
8
8
9
private var authorizerCompletionHandlers = [ String : ( [ String : String ] ) -> Void ] ( )
9
10
private var authorizerCompletionHandlerTimeout = 10 // seconds
@@ -12,6 +13,12 @@ import Foundation
12
13
private let authErrorType = " AuthError "
13
14
private let pusherEventPrefix = " PusherReactNative "
14
15
16
+ override init ( ) {
17
+ super. init ( )
18
+
19
+ PusherWebsocketReactNative . shared = self
20
+ }
21
+
15
22
override func supportedEvents( ) -> [ String ] ! {
16
23
return [ " \( pusherEventPrefix) :onConnectionStateChange " ,
17
24
" \( pusherEventPrefix) :onSubscriptionError " ,
@@ -26,18 +33,19 @@ import Foundation
26
33
27
34
private func callback( name: String , body: Any ) -> Void {
28
35
let pusherEventname = " \( pusherEventPrefix) : \( name) "
29
- self . sendEvent ( withName: pusherEventname, body: body)
36
+ PusherWebsocketReactNative . shared . sendEvent ( withName: pusherEventname, body: body)
30
37
}
31
38
32
39
func initialize( _ args: [ String : Any ] , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
33
- if pusher != nil {
34
- pusher. disconnect ( )
40
+ if PusherWebsocketReactNative . pusher != nil {
41
+ PusherWebsocketReactNative . pusher. unsubscribeAll ( )
42
+ PusherWebsocketReactNative . pusher. disconnect ( )
35
43
}
36
44
var authMethod : AuthMethod = . noMethod
37
45
if args [ " authEndpoint " ] is String {
38
46
authMethod = . endpoint( authEndpoint: args [ " authEndpoint " ] as! String )
39
47
} else if args [ " authorizer " ] is Bool {
40
- authMethod = . authorizer( authorizer: self )
48
+ authMethod = . authorizer( authorizer: PusherWebsocketReactNative . shared )
41
49
}
42
50
var host : PusherHost = . defaultHost
43
51
if args [ " host " ] is String {
@@ -77,23 +85,23 @@ import Foundation
77
85
useTLS: useTLS,
78
86
activityTimeout: activityTimeout
79
87
)
80
- pusher = Pusher ( key: args [ " apiKey " ] as! String , options: options)
88
+ PusherWebsocketReactNative . pusher = Pusher ( key: args [ " apiKey " ] as! String , options: options)
81
89
if args [ " maxReconnectionAttempts " ] is Int {
82
- pusher. connection. reconnectAttemptsMax = ( args [ " maxReconnectionAttempts " ] as! Int )
90
+ PusherWebsocketReactNative . pusher. connection. reconnectAttemptsMax = ( args [ " maxReconnectionAttempts " ] as! Int )
83
91
}
84
92
if args [ " maxReconnectGapInSeconds " ] is TimeInterval {
85
- pusher. connection. maxReconnectGapInSeconds = ( args [ " maxReconnectGapInSeconds " ] as! TimeInterval )
93
+ PusherWebsocketReactNative . pusher. connection. maxReconnectGapInSeconds = ( args [ " maxReconnectGapInSeconds " ] as! TimeInterval )
86
94
}
87
95
if args [ " pongTimeout " ] is Int {
88
- pusher. connection. pongResponseTimeoutInterval = args [ " pongTimeout " ] as! TimeInterval / 1000.0
96
+ PusherWebsocketReactNative . pusher. connection. pongResponseTimeoutInterval = args [ " pongTimeout " ] as! TimeInterval / 1000.0
89
97
}
90
98
91
99
if let authorizerTimeoutInSeconds = args [ " authorizerTimeoutInSeconds " ] as? Int {
92
- self . authorizerCompletionHandlerTimeout = authorizerTimeoutInSeconds
100
+ PusherWebsocketReactNative . shared . authorizerCompletionHandlerTimeout = authorizerTimeoutInSeconds
93
101
}
94
102
95
- pusher. connection. delegate = self
96
- pusher. bind ( eventCallback: onEvent)
103
+ PusherWebsocketReactNative . pusher. connection. delegate = PusherWebsocketReactNative . shared
104
+ PusherWebsocketReactNative . pusher. bind ( eventCallback: onEvent)
97
105
resolve ( nil )
98
106
}
99
107
@@ -102,7 +110,7 @@ import Foundation
102
110
}
103
111
104
112
public func fetchAuthValue( socketID: String , channelName: String , completionHandler: @escaping ( PusherAuth ? ) -> Void ) {
105
- self . callback ( name: " onAuthorizer " , body: [
113
+ PusherWebsocketReactNative . shared . callback ( name: " onAuthorizer " , body: [
106
114
" socketId " : socketID,
107
115
" channelName " : channelName
108
116
] )
@@ -118,9 +126,9 @@ import Foundation
118
126
authorizerCompletionHandlers [ key] = authCallback
119
127
120
128
// the JS thread might not call onAuthorizer – we need to cleanup the completion handler after timeout
121
- let timeout = DispatchTimeInterval . seconds ( self . authorizerCompletionHandlerTimeout)
129
+ let timeout = DispatchTimeInterval . seconds ( PusherWebsocketReactNative . shared . authorizerCompletionHandlerTimeout)
122
130
DispatchQueue . main. asyncAfter ( deadline: . now( ) + timeout) {
123
- if let storedAuthHandler = self . authorizerCompletionHandlers. removeValue ( forKey: key) {
131
+ if let storedAuthHandler = PusherWebsocketReactNative . shared . authorizerCompletionHandlers. removeValue ( forKey: key) {
124
132
storedAuthHandler ( [ " auth " : " <authorizer_timeout>:error " ] )
125
133
}
126
134
}
@@ -132,9 +140,9 @@ import Foundation
132
140
storedAuthHandler ( data)
133
141
}
134
142
}
135
-
143
+
136
144
public func changedConnectionState( from old: ConnectionState , to new: ConnectionState ) {
137
- self . callback ( name: " onConnectionStateChange " , body: [
145
+ PusherWebsocketReactNative . shared . callback ( name: " onConnectionStateChange " , body: [
138
146
" previousState " : old. stringValue ( ) ,
139
147
" currentState " : new. stringValue ( )
140
148
] )
@@ -156,7 +164,7 @@ import Foundation
156
164
type = authErrorType
157
165
}
158
166
159
- self . callback ( name: " onSubscriptionError " , body: [
167
+ PusherWebsocketReactNative . shared . callback ( name: " onSubscriptionError " , body: [
160
168
" message " : ( error != nil ) ? error!. localizedDescription : ( ( data != nil ) ? data! : error. debugDescription) ,
161
169
" type " : type,
162
170
" code " : code,
@@ -165,7 +173,7 @@ import Foundation
165
173
}
166
174
167
175
public func receivedError( error: PusherError ) {
168
- self . callback (
176
+ PusherWebsocketReactNative . shared . callback (
169
177
name: " onError " , body: [
170
178
" message " : error. message,
171
179
" code " : error. code ?? - 1 ,
@@ -175,7 +183,7 @@ import Foundation
175
183
}
176
184
177
185
public func failedToDecryptEvent( eventName: String , channelName: String , data: String ? ) {
178
- self . callback (
186
+ PusherWebsocketReactNative . shared . callback (
179
187
name: " onDecryptionFailure " , body: [
180
188
" eventName " : eventName,
181
189
" reason " : data
@@ -184,29 +192,29 @@ import Foundation
184
192
}
185
193
186
194
public func connect( _ resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
187
- pusher. connect ( )
195
+ PusherWebsocketReactNative . pusher. connect ( )
188
196
resolve ( nil )
189
197
}
190
198
191
199
public func disconnect( _ resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
192
- pusher. disconnect ( )
200
+ PusherWebsocketReactNative . pusher. disconnect ( )
193
201
resolve ( nil )
194
202
}
195
203
196
204
public func getSocketId( ) -> String ? {
197
- return pusher. connection. socketId
205
+ return PusherWebsocketReactNative . pusher. connection. socketId
198
206
}
199
207
200
208
func onEvent( event: PusherEvent ) {
201
209
var userId : String ? = nil
202
210
var mappedEventName : String ? = nil
203
211
if event. eventName == " pusher:subscription_succeeded " {
204
- if let channel = pusher. connection. channels. findPresence ( name: event. channelName!) {
212
+ if let channel = PusherWebsocketReactNative . pusher. connection. channels. findPresence ( name: event. channelName!) {
205
213
userId = channel. myId
206
214
}
207
215
mappedEventName = " pusher_internal:subscription_succeeded "
208
216
}
209
- self . callback (
217
+ PusherWebsocketReactNative . shared . callback (
210
218
name: " onEvent " , body: [
211
219
" channelName " : event. channelName,
212
220
" eventName " : mappedEventName ?? event. eventName,
@@ -219,25 +227,25 @@ import Foundation
219
227
func subscribe( _ channelName: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
220
228
if channelName. hasPrefix ( " presence- " ) {
221
229
let onMemberAdded : ( PusherPresenceChannelMember ) -> ( ) = { user in
222
- self . callback ( name: " onMemberAdded " , body: [
230
+ PusherWebsocketReactNative . shared . callback ( name: " onMemberAdded " , body: [
223
231
" channelName " : channelName,
224
232
" user " : [ " userId " : user. userId, " userInfo " : user. userInfo ]
225
233
] )
226
234
}
227
235
let onMemberRemoved : ( PusherPresenceChannelMember ) -> ( ) = { user in
228
- self . callback ( name: " onMemberRemoved " , body: [
236
+ PusherWebsocketReactNative . shared . callback ( name: " onMemberRemoved " , body: [
229
237
" channelName " : channelName,
230
238
" user " : [ " userId " : user. userId, " userInfo " : user. userInfo ]
231
239
] )
232
240
}
233
- pusher. subscribeToPresenceChannel (
241
+ PusherWebsocketReactNative . pusher. subscribeToPresenceChannel (
234
242
channelName: channelName,
235
243
onMemberAdded: onMemberAdded,
236
244
onMemberRemoved: onMemberRemoved
237
245
)
238
246
} else {
239
247
let onSubscriptionCount : ( Int ) -> ( ) = { subscriptionCount in
240
- self . callback (
248
+ PusherWebsocketReactNative . shared . callback (
241
249
name: " onEvent " , body: [
242
250
" channelName " : channelName,
243
251
" eventName " : " pusher_internal:subscription_count " ,
@@ -248,19 +256,19 @@ import Foundation
248
256
]
249
257
)
250
258
}
251
- pusher. subscribe ( channelName: channelName,
252
- onSubscriptionCountChanged: onSubscriptionCount)
259
+ PusherWebsocketReactNative . pusher. subscribe ( channelName: channelName,
260
+ onSubscriptionCountChanged: onSubscriptionCount)
253
261
}
254
262
resolve ( nil )
255
263
}
256
264
257
265
func unsubscribe( _ channelName: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
258
- pusher. unsubscribe ( channelName)
266
+ PusherWebsocketReactNative . pusher. unsubscribe ( channelName)
259
267
resolve ( nil )
260
268
}
261
269
262
270
func trigger( _ channelName: String , eventName: String , data: Any , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
263
- if let channel = pusher. connection. channels. find ( name: channelName) {
271
+ if let channel = PusherWebsocketReactNative . pusher. connection. channels. find ( name: channelName) {
264
272
channel. trigger ( eventName: eventName, data: data)
265
273
}
266
274
resolve ( nil )
0 commit comments