react-native/React/Inspector/RCTInspector.mm

132 lines
3.1 KiB
Plaintext

#import "RCTInspector.h"
#if RCT_DEV
#include <jschelpers/InspectorInterfaces.h>
#include <jschelpers/JavaScriptCore.h>
#import "RCTDefines.h"
#import "RCTInspectorPackagerConnection.h"
#import "RCTLog.h"
#import "RCTSRWebSocket.h"
#import "RCTUtils.h"
using namespace facebook::react;
// This is a port of the Android impl, at
// react-native-github/ReactAndroid/src/main/java/com/facebook/react/bridge/Inspector.java
// react-native-github/ReactAndroid/src/main/jni/xreact/jni/JInspector.cpp
// please keep consistent :)
class RemoteConnection : public IRemoteConnection {
public:
RemoteConnection(RCTInspectorRemoteConnection *connection) :
_connection(connection) {}
virtual void onMessage(std::string message) override {
[_connection onMessage:@(message.c_str())];
}
virtual void onDisconnect() override {
[_connection onDisconnect];
}
private:
const RCTInspectorRemoteConnection *_connection;
};
@interface RCTInspectorPage () {
NSInteger _id;
NSString *_title;
}
- (instancetype)initWithId:(NSInteger)id
title:(NSString *)title;
@end
@interface RCTInspectorLocalConnection () {
std::unique_ptr<ILocalConnection> _connection;
}
- (instancetype)initWithConnection:(std::unique_ptr<ILocalConnection>)connection;
@end
// Only safe to call with Custom JSC. Custom JSC check must occur earlier
// in the stack
static IInspector *getInstance()
{
static dispatch_once_t onceToken;
static IInspector *s_inspector;
dispatch_once(&onceToken, ^{
s_inspector = customJSCWrapper()->JSInspectorGetInstance();
});
return s_inspector;
}
@implementation RCTInspector
RCT_NOT_IMPLEMENTED(- (instancetype)init)
+ (NSArray<RCTInspectorPage *> *)pages
{
std::vector<InspectorPage> pages = getInstance()->getPages();
NSMutableArray<RCTInspectorPage *> *array = [NSMutableArray arrayWithCapacity:pages.size()];
for (size_t i = 0; i < pages.size(); i++) {
RCTInspectorPage *pageWrapper = [[RCTInspectorPage alloc] initWithId:pages[i].id
title:@(pages[i].title.c_str())];
[array addObject:pageWrapper];
}
return array;
}
+ (RCTInspectorLocalConnection *)connectPage:(NSInteger)pageId
forRemoteConnection:(RCTInspectorRemoteConnection *)remote
{
auto localConnection = getInstance()->connect(pageId, std::make_unique<RemoteConnection>(remote));
return [[RCTInspectorLocalConnection alloc] initWithConnection:std::move(localConnection)];
}
@end
@implementation RCTInspectorPage
RCT_NOT_IMPLEMENTED(- (instancetype)init)
- (instancetype)initWithId:(NSInteger)id
title:(NSString *)title
{
if (self = [super init]) {
_id = id;
_title = title;
}
return self;
}
@end
@implementation RCTInspectorLocalConnection
RCT_NOT_IMPLEMENTED(- (instancetype)init)
- (instancetype)initWithConnection:(std::unique_ptr<ILocalConnection>)connection
{
if (self = [super init]) {
_connection = std::move(connection);
}
return self;
}
- (void)sendMessage:(NSString *)message
{
_connection->sendMessage([message UTF8String]);
}
- (void)disconnect
{
_connection->disconnect();
}
@end
#endif