react-native-debug-toolkit 3.2.7 → 3.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/DebugToolkitDevConnect.mm +135 -73
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#import <Foundation/Foundation.h>
|
|
2
|
+
#import <React/RCTBridge.h>
|
|
2
3
|
#import <React/RCTBundleManager.h>
|
|
3
4
|
#import <React/RCTBridgeModule.h>
|
|
4
5
|
#import <React/RCTBundleURLProvider.h>
|
|
@@ -17,6 +18,7 @@ static NSString *const DebugToolkitBundleRoot = @"index";
|
|
|
17
18
|
|
|
18
19
|
RCT_EXPORT_MODULE(DebugToolkitDevConnect)
|
|
19
20
|
|
|
21
|
+
@synthesize bridge = _bridge;
|
|
20
22
|
@synthesize bundleManager = _bundleManager;
|
|
21
23
|
|
|
22
24
|
+ (BOOL)requiresMainQueueSetup
|
|
@@ -29,84 +31,136 @@ RCT_EXPORT_MODULE(DebugToolkitDevConnect)
|
|
|
29
31
|
return dispatch_get_main_queue();
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
#pragma mark - Bundle Manager Resolution
|
|
35
|
+
|
|
36
|
+
- (RCTBundleManager *)resolveBundleManager
|
|
37
|
+
{
|
|
38
|
+
if (_bundleManager) {
|
|
39
|
+
return _bundleManager;
|
|
40
|
+
}
|
|
41
|
+
if (_bridge) {
|
|
42
|
+
return [_bridge moduleForClass:[RCTBundleManager class]];
|
|
43
|
+
}
|
|
44
|
+
return nil;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#pragma mark - Apply Bundle URL (multi-strategy)
|
|
48
|
+
|
|
49
|
+
- (BOOL)applyBundleURL:(NSURL *)bundleURL
|
|
50
|
+
{
|
|
51
|
+
RCTBundleManager *bm = [self resolveBundleManager];
|
|
52
|
+
if (bm) {
|
|
53
|
+
if (bundleURL) {
|
|
54
|
+
bm.bundleURL = bundleURL;
|
|
55
|
+
} else {
|
|
56
|
+
[bm resetBundleURL];
|
|
57
|
+
}
|
|
58
|
+
return YES;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (bundleURL) {
|
|
62
|
+
RCTReloadCommandSetBundleURL(bundleURL);
|
|
63
|
+
return YES;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return NO;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
#pragma mark - Exported Methods
|
|
70
|
+
|
|
32
71
|
RCT_EXPORT_METHOD(getMetroHost:(RCTPromiseResolveBlock)resolve
|
|
33
72
|
rejecter:(__unused RCTPromiseRejectBlock)reject)
|
|
34
73
|
{
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
@try {
|
|
75
|
+
NSString *host = [RCTBundleURLProvider sharedSettings].jsLocation;
|
|
76
|
+
resolve(host ?: [NSNull null]);
|
|
77
|
+
} @catch (NSException *exception) {
|
|
78
|
+
reject(@"native_error", exception.reason, nil);
|
|
79
|
+
}
|
|
37
80
|
}
|
|
38
81
|
|
|
39
82
|
RCT_EXPORT_METHOD(applyMetroHost:(NSString *)hostPort
|
|
40
83
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
41
84
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
42
85
|
{
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
86
|
+
@try {
|
|
87
|
+
if (hostPort.length == 0) {
|
|
88
|
+
reject(@"invalid_host", @"Metro host cannot be empty.", nil);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
47
91
|
|
|
48
|
-
|
|
49
|
-
NSRange separator = [hostPort rangeOfString:@":" options:NSBackwardsSearch];
|
|
50
|
-
NSString *host = separator.location == NSNotFound ? hostPort : [hostPort substringToIndex:separator.location];
|
|
51
|
-
NSString *port = separator.location == NSNotFound ? @"" : [hostPort substringFromIndex:separator.location + 1];
|
|
92
|
+
RCTBundleURLProvider *settings = [RCTBundleURLProvider sharedSettings];
|
|
52
93
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
94
|
+
NSRange separator = [hostPort rangeOfString:@":" options:NSBackwardsSearch];
|
|
95
|
+
NSString *host = separator.location == NSNotFound
|
|
96
|
+
? hostPort
|
|
97
|
+
: [hostPort substringToIndex:separator.location];
|
|
98
|
+
NSString *port = separator.location == NSNotFound
|
|
99
|
+
? @""
|
|
100
|
+
: [hostPort substringFromIndex:separator.location + 1];
|
|
57
101
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
portNumber = [NSNumber numberWithInt:RCT_METRO_PORT];
|
|
63
|
-
}
|
|
102
|
+
if (host.length == 0 && port.length == 0) {
|
|
103
|
+
[self resetMetroHost:resolve rejecter:reject];
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
64
106
|
|
|
65
|
-
|
|
66
|
-
|
|
107
|
+
NSNumberFormatter *formatter = [NSNumberFormatter new];
|
|
108
|
+
formatter.numberStyle = NSNumberFormatterDecimalStyle;
|
|
109
|
+
NSNumber *portNumber = [formatter numberFromString:port];
|
|
110
|
+
if (portNumber == nil) {
|
|
111
|
+
portNumber = [NSNumber numberWithInt:RCT_METRO_PORT];
|
|
112
|
+
}
|
|
67
113
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
114
|
+
NSString *normalizedHostPort = [NSString stringWithFormat:@"%@:%d", host, portNumber.intValue];
|
|
115
|
+
|
|
116
|
+
settings.jsLocation = normalizedHostPort;
|
|
117
|
+
|
|
118
|
+
NSURL *bundleURL = nil;
|
|
119
|
+
if (DebugToolkitBundleRoot.length > 0) {
|
|
120
|
+
bundleURL = [settings jsBundleURLForBundleRoot:DebugToolkitBundleRoot];
|
|
71
121
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
122
|
+
|
|
123
|
+
[self applyBundleURL:bundleURL];
|
|
124
|
+
|
|
125
|
+
NSMutableDictionary *result = [@{@"hostPort" : normalizedHostPort} mutableCopy];
|
|
126
|
+
RCTBundleManager *bm = [self resolveBundleManager];
|
|
127
|
+
if (bm && bm.bundleURL.absoluteString) {
|
|
128
|
+
result[@"bundleURL"] = bm.bundleURL.absoluteString;
|
|
78
129
|
}
|
|
79
|
-
}
|
|
80
130
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
131
|
+
RCTTriggerReloadCommandListeners(@"Dev menu - apply changes");
|
|
132
|
+
resolve(result);
|
|
133
|
+
} @catch (NSException *exception) {
|
|
134
|
+
reject(@"native_error", exception.reason, nil);
|
|
84
135
|
}
|
|
85
|
-
|
|
86
|
-
RCTTriggerReloadCommandListeners(@"DevConnect - apply changes");
|
|
87
|
-
resolve(result);
|
|
88
136
|
}
|
|
89
137
|
|
|
90
138
|
RCT_EXPORT_METHOD(resetMetroHost:(RCTPromiseResolveBlock)resolve
|
|
91
139
|
rejecter:(__unused RCTPromiseRejectBlock)reject)
|
|
92
140
|
{
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
141
|
+
@try {
|
|
142
|
+
RCTBundleURLProvider *settings = [RCTBundleURLProvider sharedSettings];
|
|
143
|
+
[settings resetToDefaults];
|
|
144
|
+
NSURL *bundleURL = [settings jsBundleURLForFallbackExtension:nil];
|
|
145
|
+
|
|
146
|
+
[self applyBundleURL:bundleURL];
|
|
147
|
+
RCTTriggerReloadCommandListeners(@"Dev menu - reset to default");
|
|
148
|
+
resolve([NSNull null]);
|
|
149
|
+
} @catch (NSException *exception) {
|
|
150
|
+
reject(@"native_error", exception.reason, nil);
|
|
99
151
|
}
|
|
100
|
-
RCTTriggerReloadCommandListeners(@"DevConnect - reset to default");
|
|
101
|
-
resolve([NSNull null]);
|
|
102
152
|
}
|
|
103
153
|
|
|
104
154
|
RCT_EXPORT_METHOD(getPreference:(NSString *)key
|
|
105
155
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
106
156
|
rejecter:(__unused RCTPromiseRejectBlock)reject)
|
|
107
157
|
{
|
|
108
|
-
|
|
109
|
-
|
|
158
|
+
@try {
|
|
159
|
+
NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:key];
|
|
160
|
+
resolve(value ?: [NSNull null]);
|
|
161
|
+
} @catch (NSException *exception) {
|
|
162
|
+
reject(@"native_error", exception.reason, nil);
|
|
163
|
+
}
|
|
110
164
|
}
|
|
111
165
|
|
|
112
166
|
RCT_EXPORT_METHOD(setPreference:(NSString *)key
|
|
@@ -114,9 +168,13 @@ RCT_EXPORT_METHOD(setPreference:(NSString *)key
|
|
|
114
168
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
115
169
|
rejecter:(__unused RCTPromiseRejectBlock)reject)
|
|
116
170
|
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
171
|
+
@try {
|
|
172
|
+
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
|
|
173
|
+
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
174
|
+
resolve([NSNull null]);
|
|
175
|
+
} @catch (NSException *exception) {
|
|
176
|
+
reject(@"native_error", exception.reason, nil);
|
|
177
|
+
}
|
|
120
178
|
}
|
|
121
179
|
|
|
122
180
|
RCT_EXPORT_METHOD(isDebugBuild:(RCTPromiseResolveBlock)resolve
|
|
@@ -132,12 +190,27 @@ RCT_EXPORT_METHOD(isDebugBuild:(RCTPromiseResolveBlock)resolve
|
|
|
132
190
|
RCT_EXPORT_METHOD(getLocalIp:(RCTPromiseResolveBlock)resolve
|
|
133
191
|
rejecter:(__unused RCTPromiseRejectBlock)reject)
|
|
134
192
|
{
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (
|
|
193
|
+
@try {
|
|
194
|
+
struct ifaddrs *interfaces = NULL;
|
|
195
|
+
if (getifaddrs(&interfaces) == 0) {
|
|
196
|
+
struct ifaddrs *iface = interfaces;
|
|
197
|
+
while (iface != NULL) {
|
|
198
|
+
if (iface->ifa_addr != NULL && iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
|
|
199
|
+
if (strcmp(iface->ifa_name, "en0") == 0) {
|
|
200
|
+
char addrStr[INET_ADDRSTRLEN];
|
|
201
|
+
struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
|
|
202
|
+
inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
|
|
203
|
+
NSString *ip = [NSString stringWithUTF8String:addrStr];
|
|
204
|
+
freeifaddrs(interfaces);
|
|
205
|
+
resolve(ip);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
iface = iface->ifa_next;
|
|
210
|
+
}
|
|
211
|
+
iface = interfaces;
|
|
212
|
+
while (iface != NULL) {
|
|
213
|
+
if (iface->ifa_addr != NULL && iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
|
|
141
214
|
char addrStr[INET_ADDRSTRLEN];
|
|
142
215
|
struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
|
|
143
216
|
inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
|
|
@@ -146,25 +219,14 @@ RCT_EXPORT_METHOD(getLocalIp:(RCTPromiseResolveBlock)resolve
|
|
|
146
219
|
resolve(ip);
|
|
147
220
|
return;
|
|
148
221
|
}
|
|
222
|
+
iface = iface->ifa_next;
|
|
149
223
|
}
|
|
150
|
-
iface = iface->ifa_next;
|
|
151
|
-
}
|
|
152
|
-
iface = interfaces;
|
|
153
|
-
while (iface != NULL) {
|
|
154
|
-
if (iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
|
|
155
|
-
char addrStr[INET_ADDRSTRLEN];
|
|
156
|
-
struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
|
|
157
|
-
inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
|
|
158
|
-
NSString *ip = [NSString stringWithUTF8String:addrStr];
|
|
159
|
-
freeifaddrs(interfaces);
|
|
160
|
-
resolve(ip);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
iface = iface->ifa_next;
|
|
164
224
|
}
|
|
225
|
+
freeifaddrs(interfaces);
|
|
226
|
+
resolve([NSNull null]);
|
|
227
|
+
} @catch (NSException *exception) {
|
|
228
|
+
reject(@"native_error", exception.reason, nil);
|
|
165
229
|
}
|
|
166
|
-
freeifaddrs(interfaces);
|
|
167
|
-
resolve([NSNull null]);
|
|
168
230
|
}
|
|
169
231
|
|
|
170
232
|
@end
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-debug-toolkit",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.8",
|
|
4
4
|
"description": "A local-first React Native debug toolkit with Web Console, HTTP API, and MCP support for AI-readable app logs",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|