From e2b5b6504cb4dee8f2ec67f1d3a410801e1ca09a Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Wed, 22 Sep 2021 10:36:45 -0700 Subject: [PATCH] Propose to connect metro server programmatically (#31828) Summary: nowadays, we could only specify metro server by either dev settings or building time ip.txt. this pr adds a new way to specify metro server programmatically which makes rn launcher or testing more feasible. ## Changelog [Internal] [iOS] [Added] - Propose to connect metro server programmatically Pull Request resolved: https://github.com/facebook/react-native/pull/31828 Test Plan: just exposing a public interface for RCTPackagerConnection without much code change. test to call this interface success locally. Reviewed By: sammy-SC Differential Revision: D30878774 Pulled By: yungsters fbshipit-source-id: 5f1d6a4835a983abde7e095d20153e4ba2146a61 --- React/DevSupport/RCTPackagerConnection.h | 3 +++ React/DevSupport/RCTPackagerConnection.mm | 14 +++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/React/DevSupport/RCTPackagerConnection.h b/React/DevSupport/RCTPackagerConnection.h index 7f1bbd1d0ea..795a3fcad5b 100644 --- a/React/DevSupport/RCTPackagerConnection.h +++ b/React/DevSupport/RCTPackagerConnection.h @@ -59,6 +59,9 @@ typedef void (^RCTConnectedHandler)(void); /** Disconnects and removes all handlers. */ - (void)stop; +/** Reconnect with given packager server. */ +- (void)reconnect:(NSString *)packagerServerHostPort; + /** * Historically no distinction was made between notification and request * handlers. If you use this method, it will be registered as *both* a diff --git a/React/DevSupport/RCTPackagerConnection.mm b/React/DevSupport/RCTPackagerConnection.mm index bffd8b5a641..4434d67ca62 100644 --- a/React/DevSupport/RCTPackagerConnection.mm +++ b/React/DevSupport/RCTPackagerConnection.mm @@ -125,28 +125,32 @@ static RCTReconnectingWebSocket *socketForLocation(NSString *const serverHostPor _requestRegistrations.clear(); } -- (void)bundleURLSettingsChanged +- (void)reconnect:(NSString *)packagerServerHostPort { std::lock_guard l(_mutex); if (_socket == nil) { return; // already stopped } - NSString *const serverHostPort = [[RCTBundleURLProvider sharedSettings] packagerServerHostPort]; NSString *const serverScheme = [[RCTBundleURLProvider sharedSettings] packagerScheme]; - if ([serverHostPort isEqual:_serverHostPortForSocket] && [serverScheme isEqual:_serverSchemeForSocket]) { + if ([packagerServerHostPort isEqual:_serverHostPortForSocket] && [serverScheme isEqual:_serverSchemeForSocket]) { return; // unchanged } _socket.delegate = nil; [_socket stop]; - _serverHostPortForSocket = serverHostPort; + _serverHostPortForSocket = packagerServerHostPort; _serverSchemeForSocket = serverScheme; - _socket = socketForLocation(serverHostPort, serverScheme); + _socket = socketForLocation(packagerServerHostPort, serverScheme); _socket.delegate = self; [_socket start]; } +- (void)bundleURLSettingsChanged +{ + [self reconnect:[[RCTBundleURLProvider sharedSettings] packagerServerHostPort]]; +} + - (RCTHandlerToken)addNotificationHandler:(RCTNotificationHandler)handler queue:(dispatch_queue_t)queue forMethod:(NSString *)method