/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import #if RCT_DEV || RCT_REMOTE_PROFILE #include #import #import #import #import 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/react/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; NSString *_vm; } - (instancetype)initWithId:(NSInteger)id title:(NSString *)title vm:(NSString *)vm; @end @interface RCTInspectorLocalConnection () { std::unique_ptr _connection; } - (instancetype)initWithConnection:(std::unique_ptr)connection; @end static IInspector *getInstance() { return &facebook::react::getInspectorInstance(); } @implementation RCTInspector RCT_NOT_IMPLEMENTED(-(instancetype)init) + (NSArray *)pages { std::vector pages = getInstance()->getPages(); NSMutableArray *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()) vm:@(pages[i].vm.c_str())]; [array addObject:pageWrapper]; } return array; } + (RCTInspectorLocalConnection *)connectPage:(NSInteger)pageId forRemoteConnection:(RCTInspectorRemoteConnection *)remote { auto localConnection = getInstance()->connect((int)pageId, std::make_unique(remote)); return [[RCTInspectorLocalConnection alloc] initWithConnection:std::move(localConnection)]; } @end @implementation RCTInspectorPage RCT_NOT_IMPLEMENTED(-(instancetype)init) - (instancetype)initWithId:(NSInteger)id title:(NSString *)title vm:(NSString *)vm { if (self = [super init]) { _id = id; _title = title; _vm = vm; } return self; } @end @implementation RCTInspectorLocalConnection RCT_NOT_IMPLEMENTED(-(instancetype)init) - (instancetype)initWithConnection:(std::unique_ptr)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