Skip to content

Commit 9180d4e

Browse files
adamjernstfacebook-github-bot
authored andcommitted
Make RCTPackagerConnection a singleton
Reviewed By: fromcelticpark Differential Revision: D6361741 fbshipit-source-id: 96e92dff5dd3d7aa1f7555442b0eba90e7dbf47c
1 parent c91d872 commit 9180d4e

24 files changed

+448
-714
lines changed

Libraries/WebSocket/RCTReconnectingWebSocket.h

+14-13
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,29 @@
1111

1212
#if RCT_DEV // Only supported in dev mode
1313

14-
@class RCTSRWebSocket;
15-
16-
@protocol RCTWebSocketProtocolDelegate
17-
18-
- (void)webSocketDidOpen:(RCTSRWebSocket *)webSocket;
19-
20-
- (void)webSocket:(RCTSRWebSocket *)webSocket didReceiveMessage:(id)message;
21-
22-
- (void)webSocket:(RCTSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
14+
@class RCTReconnectingWebSocket;
2315

16+
@protocol RCTReconnectingWebSocketDelegate
17+
- (void)reconnectingWebSocketDidOpen:(RCTReconnectingWebSocket *)webSocket;
18+
- (void)reconnectingWebSocket:(RCTReconnectingWebSocket *)webSocket didReceiveMessage:(id)message;
19+
/** Sent when the socket has closed due to error or clean shutdown. An automatic reconnect will start shortly. */
20+
- (void)reconnectingWebSocketDidClose:(RCTReconnectingWebSocket *)webSocket;
2421
@end
2522

2623
@interface RCTReconnectingWebSocket : NSObject
2724

28-
- (instancetype)initWithURL:(NSURL *)url;
29-
@property (nonatomic, weak) id<RCTWebSocketProtocolDelegate> delegate;
30-
/** @brief Must be set before -start to have effect */
31-
@property (nonatomic, strong) dispatch_queue_t delegateDispatchQueue;
25+
/** Delegate will be messaged on the given queue (required). */
26+
- (instancetype)initWithURL:(NSURL *)url queue:(dispatch_queue_t)queue;
27+
28+
@property (nonatomic, weak) id<RCTReconnectingWebSocketDelegate> delegate;
3229
- (void)send:(id)data;
3330
- (void)start;
3431
- (void)stop;
3532

33+
- (instancetype)initWithURL:(NSURL *)url __deprecated_msg("Use initWithURL:queue: instead");
34+
/** @brief Must be set before -start to have effect */
35+
@property (nonatomic, strong) dispatch_queue_t delegateDispatchQueue __deprecated_msg("Use initWithURL:queue: instead");
36+
3637
@end
3738

3839
#endif

Libraries/WebSocket/RCTReconnectingWebSocket.m

+12-11
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ @implementation RCTReconnectingWebSocket {
5858
RCTSRWebSocket *_socket;
5959
}
6060

61-
@synthesize delegate = _delegate;
62-
6361
+ (void)load
6462
{
6563
static dispatch_once_t onceToken;
@@ -75,14 +73,20 @@ + (void)load
7573
});
7674
}
7775

78-
- (instancetype)initWithURL:(NSURL *)url
76+
- (instancetype)initWithURL:(NSURL *)url queue:(dispatch_queue_t)queue
7977
{
8078
if (self = [super init]) {
8179
_url = url;
80+
_delegateDispatchQueue = queue;
8281
}
8382
return self;
8483
}
8584

85+
- (instancetype)initWithURL:(NSURL *)url
86+
{
87+
return [self initWithURL:url queue:dispatch_get_main_queue()];
88+
}
89+
8690
- (void)send:(id)data
8791
{
8892
[_socket send:data];
@@ -93,9 +97,7 @@ - (void)start
9397
[self stop];
9498
_socket = [[RCTSRWebSocket alloc] initWithURL:_url];
9599
_socket.delegate = self;
96-
if (_delegateDispatchQueue) {
97-
[_socket setDelegateDispatchQueue:_delegateDispatchQueue];
98-
}
100+
[_socket setDelegateDispatchQueue:_delegateDispatchQueue];
99101
[_socket open];
100102
}
101103

@@ -108,9 +110,7 @@ - (void)stop
108110

109111
- (void)webSocket:(RCTSRWebSocket *)webSocket didReceiveMessage:(id)message
110112
{
111-
if (_delegate) {
112-
[_delegate webSocket:webSocket didReceiveMessage:message];
113-
}
113+
[_delegate reconnectingWebSocket:self didReceiveMessage:message];
114114
}
115115

116116
- (void)reconnect
@@ -126,17 +126,18 @@ - (void)reconnect
126126

127127
- (void)webSocketDidOpen:(RCTSRWebSocket *)webSocket
128128
{
129-
[self.delegate webSocketDidOpen:webSocket];
129+
[_delegate reconnectingWebSocketDidOpen:self];
130130
}
131131

132132
- (void)webSocket:(RCTSRWebSocket *)webSocket didFailWithError:(NSError *)error
133133
{
134+
[_delegate reconnectingWebSocketDidClose:self];
134135
[self reconnect];
135136
}
136137

137138
- (void)webSocket:(RCTSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
138139
{
139-
[self.delegate webSocket:webSocket didCloseWithCode:code reason:reason wasClean:wasClean];
140+
[_delegate reconnectingWebSocketDidClose:self];
140141
[self reconnect];
141142
}
142143

React/Base/RCTBridge+Private.h

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* of patent rights can be found in the PATENTS file in the same directory.
88
*/
99

10+
#import <JavaScriptCore/JavaScriptCore.h>
1011
#import <JavaScriptCore/JSBase.h>
1112

1213
#import <React/RCTBridge.h>
@@ -158,6 +159,15 @@ RCT_EXTERN void RCTVerifyAllModulesExported(NSArray *extraModules);
158159

159160
@end
160161

162+
@interface RCTBridge (JavaScriptCore)
163+
164+
/**
165+
* The raw JSGlobalContextRef used by the bridge.
166+
*/
167+
@property (nonatomic, readonly, assign) JSGlobalContextRef jsContextRef;
168+
169+
@end
170+
161171
@interface RCTBatchedBridge : RCTBridge <RCTInvalidating>
162172

163173
@property (nonatomic, weak, readonly) RCTBridge *parentBridge;

React/Base/RCTBridge.m

-10
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#if RCT_ENABLE_INSPECTOR
1818
#import "RCTInspectorDevServerHelper.h"
1919
#endif
20-
#import "RCTJSEnvironment.h"
2120
#import "RCTLog.h"
2221
#import "RCTModuleData.h"
2322
#import "RCTPerformanceLogger.h"
@@ -403,15 +402,6 @@ - (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path
403402
[self.batchedBridge registerSegmentWithId:segmentId path:path];
404403
}
405404

406-
@end
407-
408-
@implementation RCTBridge (JavaScriptCore)
409-
410-
- (JSContext *)jsContext
411-
{
412-
return [self.batchedBridge jsContext];
413-
}
414-
415405
- (JSGlobalContextRef)jsContextRef
416406
{
417407
return [self.batchedBridge jsContextRef];

React/Base/RCTBundleURLProvider.h

-5
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@ extern const NSUInteger kRCTBundleURLProviderDefaultPort;
5959
resourceExtension:(NSString *)extension
6060
offlineBundle:(NSBundle *)offlineBundle;
6161

62-
/**
63-
* Returns the URL of the packager server.
64-
*/
65-
- (NSURL *)packagerServerURL;
66-
6762
/**
6863
* The IP address or hostname of the packager.
6964
*/

React/Base/RCTBundleURLProvider.m

-6
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,6 @@ - (NSString *)packagerServerHost
111111
return nil;
112112
}
113113

114-
- (NSURL *)packagerServerURL
115-
{
116-
NSString *const host = [self packagerServerHost];
117-
return host ? serverRootWithHost(host) : nil;
118-
}
119-
120114
- (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot fallbackResource:(NSString *)resourceName fallbackExtension:(NSString *)extension
121115
{
122116
NSString *packagerServerHost = [self packagerServerHost];

React/Base/RCTJSEnvironment.h

-29
This file was deleted.

React/CxxBridge/RCTCxxBridge.mm

-5
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,6 @@ + (void)initialize
188188
}
189189
}
190190

191-
- (JSContext *)jsContext
192-
{
193-
return contextForGlobalContextRef([self jsContextRef]);
194-
}
195-
196191
- (JSGlobalContextRef)jsContextRef
197192
{
198193
return (JSGlobalContextRef)(self->_reactInstance ? self->_reactInstance->getJavaScriptContext() : nullptr);

React/DevSupport/RCTPackagerClient.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
#if RCT_DEV // Only supported in dev mode
1313

1414
@class RCTPackagerClientResponder;
15-
@class RCTSRWebSocket;
15+
@class RCTReconnectingWebSocket;
1616

1717
extern const int RCT_PACKAGER_CLIENT_PROTOCOL_VERSION;
1818

1919
@protocol RCTPackagerClientMethod <NSObject>
2020

21-
- (void)handleRequest:(id)params withResponder:(RCTPackagerClientResponder *)responder;
22-
- (void)handleNotification:(id)params;
21+
- (void)handleRequest:(NSDictionary<NSString *, id> *)params withResponder:(RCTPackagerClientResponder *)responder;
22+
- (void)handleNotification:(NSDictionary<NSString *, id> *)params;
2323

2424
@optional
2525

@@ -30,7 +30,7 @@ extern const int RCT_PACKAGER_CLIENT_PROTOCOL_VERSION;
3030

3131
@interface RCTPackagerClientResponder : NSObject
3232

33-
- (instancetype)initWithId:(id)msgId socket:(RCTSRWebSocket *)socket;
33+
- (instancetype)initWithId:(id)msgId socket:(RCTReconnectingWebSocket *)socket;
3434
- (void)respondWithResult:(id)result;
3535
- (void)respondWithError:(id)error;
3636

React/DevSupport/RCTPackagerClient.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#import "RCTPackagerClient.h"
1111

1212
#import <React/RCTLog.h>
13-
#import <React/RCTSRWebSocket.h>
13+
#import <React/RCTReconnectingWebSocket.h>
1414
#import <React/RCTUtils.h>
1515

1616
#if RCT_DEV // Only supported in dev mode
@@ -19,10 +19,10 @@
1919

2020
@implementation RCTPackagerClientResponder {
2121
id _msgId;
22-
__weak RCTSRWebSocket *_socket;
22+
__weak RCTReconnectingWebSocket *_socket;
2323
}
2424

25-
- (instancetype)initWithId:(id)msgId socket:(RCTSRWebSocket *)socket
25+
- (instancetype)initWithId:(id)msgId socket:(RCTReconnectingWebSocket *)socket
2626
{
2727
if (self = [super init]) {
2828
_msgId = msgId;

React/DevSupport/RCTPackagerConnection.h

+48-13
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,62 @@
1515

1616
NS_ASSUME_NONNULL_BEGIN
1717

18-
@class RCTBridge;
1918
@protocol RCTPackagerClientMethod;
20-
@protocol RCTPackagerConnectionConfig;
19+
@class RCTPackagerClientResponder;
20+
21+
typedef uint32_t RCTHandlerToken;
22+
typedef void (^RCTNotificationHandler)(NSDictionary<NSString *, id> *);
23+
typedef void (^RCTRequestHandler)(NSDictionary<NSString *, id> *, RCTPackagerClientResponder *);
24+
typedef void (^RCTConnectedHandler)(void);
25+
26+
/** Encapsulates singleton connection to React Native packager. */
27+
@interface RCTPackagerConnection : NSObject
28+
29+
+ (instancetype)sharedPackagerConnection;
2130

2231
/**
23-
* Encapsulates connection to React Native packager.
24-
* Dispatches messages from websocket to message handlers that must implement
25-
* <RCTPackagerClientMethod> protocol.
26-
* Message dispatch is performed on the main queue, unless message handler
27-
* provides its own queue by overriding "methodQueue" method.
32+
* Registers a handler for a notification broadcast from the packager. An
33+
* example is "reload" - an instruction to reload from the packager.
34+
* If multiple notification handlers are registered for the same method, they
35+
* will all be invoked sequentially.
2836
*/
29-
@interface RCTPackagerConnection : NSObject
37+
- (RCTHandlerToken)addNotificationHandler:(RCTNotificationHandler)handler
38+
queue:(dispatch_queue_t)queue
39+
forMethod:(NSString *)method;
40+
41+
/**
42+
* Registers a handler for a request from the packager. An example is
43+
* pokeSamplingProfiler; it asks for profile data from the client.
44+
* Only one handler can be registered for a given method; calling this
45+
* displaces any previous request handler registered for that method.
46+
*/
47+
- (RCTHandlerToken)addRequestHandler:(RCTRequestHandler)handler
48+
queue:(dispatch_queue_t)queue
49+
forMethod:(NSString *)method;
50+
51+
/**
52+
* Registers a handler that runs at most once, when the connection to the
53+
* packager has been established. The handler will be dispatched immediately
54+
* if the connection is already established.
55+
*/
56+
- (RCTHandlerToken)addConnectedHandler:(RCTConnectedHandler)handler
57+
queue:(dispatch_queue_t)queue;
3058

31-
+ (void)checkDefaultConnectionWithCallback:(void (^)(BOOL isRunning))callback
32-
queue:(dispatch_queue_t)queue;
59+
/** Removes a handler. Silently does nothing if the token is not valid. */
60+
- (void)removeHandler:(RCTHandlerToken)token;
3361

34-
+ (instancetype)connectionForBridge:(RCTBridge *)bridge;
35-
- (instancetype)initWithConfig:(id<RCTPackagerConnectionConfig>)config;
36-
- (void)addHandler:(id<RCTPackagerClientMethod>)handler forMethod:(NSString *)name;
62+
/** Disconnects and removes all handlers. */
3763
- (void)stop;
3864

65+
/**
66+
* Historically no distinction was made between notification and request
67+
* handlers. If you use this method, it will be registered as *both* a
68+
* notification handler *and* a request handler. You should migrate to the
69+
* new block-based API instead.
70+
*/
71+
- (void)addHandler:(id<RCTPackagerClientMethod>)handler
72+
forMethod:(NSString *)method __deprecated_msg("Use addRequestHandler or addNotificationHandler instead");
73+
3974
@end
4075

4176
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)