Skip to content

Commit 52ef0ba

Browse files
AndrewAminInstabugkholood-ea
authored andcommitted
Revert "chore: [revert] network spans (#1394)
* Revert "chore: [revert] network spans and screenshot auto masking (#1374)" This reverts commit dc3cc97. Delete auto masking changes * chore: update CHANGELOG.md * chore: fix lint for CHANGELOG.md * chore: update ios pods * fix(ios): instabug import * fix(ios): remove duplicate API * chore(CI):revert old Podfile.lock * chore: update podfile.lock * chore: fix CI --------- Co-authored-by: kholood <[email protected]>
1 parent 593baa7 commit 52ef0ba

35 files changed

+2147
-118
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
- Add support for xCode 16. ([#1370](https://github.com/Instabug/Instabug-React-Native/pull/1370))
1212

13+
- Add support for network spans. ([#1394](https://github.com/Instabug/Instabug-React-Native/pull/1394))
14+
1315
### Fixed
1416

1517
- Not sending the inComplete xhrRequest. ([#1365](https://github.com/Instabug/Instabug-React-Native/pull/1365))

RNInstabug.podspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Pod::Spec.new do |s|
1616
s.source_files = "ios/**/*.{h,m,mm}"
1717

1818
s.dependency 'React-Core'
19-
use_instabug!(s)
19+
# use_instabug!(s)
20+
s.dependency 'Instabug'
2021

2122
end

android/src/main/java/com/instabug/reactlibrary/Constants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ final class Constants {
1010
final static String IBG_ON_NEW_MESSAGE_HANDLER = "IBGonNewMessageHandler";
1111
final static String IBG_ON_NEW_REPLY_RECEIVED_CALLBACK = "IBGOnNewReplyReceivedCallback";
1212

13+
final static String IBG_ON_FEATURES_UPDATED_CALLBACK = "IBGOnFeatureUpdatedCallback";
14+
final static String IBG_NETWORK_LOGGER_HANDLER = "IBGNetworkLoggerHandler";
15+
1316
final static String IBG_ON_NEW_W3C_FLAGS_UPDATE_RECEIVED_CALLBACK = "IBGOnNewW3CFlagsUpdateReceivedCallback";
1417

1518
final static String IBG_SESSION_REPLAY_ON_SYNC_CALLBACK_INVOCATION = "IBGSessionReplayOnSyncCallback";
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package com.instabug.reactlibrary;
2+
3+
4+
import static com.instabug.apm.configuration.cp.APMFeature.APM_NETWORK_PLUGIN_INSTALLED;
5+
import static com.instabug.apm.configuration.cp.APMFeature.CP_NATIVE_INTERCEPTION_ENABLED;
6+
7+
import android.util.Log;
8+
9+
import androidx.annotation.NonNull;
10+
11+
import com.facebook.react.bridge.Arguments;
12+
import com.facebook.react.bridge.Promise;
13+
import com.facebook.react.bridge.ReactApplicationContext;
14+
import com.facebook.react.bridge.ReactMethod;
15+
import com.facebook.react.bridge.ReadableMap;
16+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
17+
import com.facebook.react.bridge.WritableMap;
18+
import com.facebook.react.bridge.WritableNativeMap;
19+
import com.instabug.apm.InternalAPM;
20+
import com.instabug.apm.sanitization.OnCompleteCallback;
21+
import com.instabug.library.logging.listeners.networklogs.NetworkLogSnapshot;
22+
import com.instabug.reactlibrary.utils.EventEmitterModule;
23+
import com.instabug.reactlibrary.utils.MainThreadHandler;
24+
25+
import org.json.JSONException;
26+
import org.json.JSONObject;
27+
28+
import java.util.HashMap;
29+
import java.util.Map;
30+
import java.util.concurrent.ConcurrentHashMap;
31+
32+
33+
public class RNInstabugNetworkLoggerModule extends EventEmitterModule {
34+
35+
public final ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>> callbackMap = new ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>>();
36+
37+
public RNInstabugNetworkLoggerModule(ReactApplicationContext reactContext) {
38+
super(reactContext);
39+
}
40+
41+
42+
@NonNull
43+
@Override
44+
public String getName() {
45+
return "IBGNetworkLogger";
46+
}
47+
48+
49+
@ReactMethod
50+
public void addListener(String event) {
51+
super.addListener(event);
52+
}
53+
54+
@ReactMethod
55+
public void removeListeners(Integer count) {
56+
super.removeListeners(count);
57+
}
58+
59+
private boolean getFlagValue(String key) {
60+
return InternalAPM._isFeatureEnabledCP(key, "");
61+
}
62+
63+
private WritableMap convertFromMapToWritableMap(Map<String, Object> map) {
64+
WritableMap writableMap = new WritableNativeMap();
65+
for (String key : map.keySet()) {
66+
Object value = map.get(key);
67+
writableMap.putString(key, (String) value);
68+
}
69+
return writableMap;
70+
}
71+
72+
private Map<String, Object> convertReadableMapToMap(ReadableMap readableMap) {
73+
Map<String, Object> map = new HashMap<>();
74+
if (readableMap != null) {
75+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
76+
while (iterator.hasNextKey()) {
77+
String key = iterator.nextKey();
78+
map.put(key, readableMap.getString(key));
79+
}
80+
}
81+
return map;
82+
}
83+
84+
/**
85+
* Get first time Value of [cp_native_interception_enabled] flag
86+
*/
87+
@ReactMethod
88+
public void isNativeInterceptionEnabled(Promise promise) {
89+
MainThreadHandler.runOnMainThread(new Runnable() {
90+
@Override
91+
public void run() {
92+
try {
93+
promise.resolve(getFlagValue(CP_NATIVE_INTERCEPTION_ENABLED));
94+
} catch (Exception e) {
95+
e.printStackTrace();
96+
promise.resolve(false); // Will rollback to JS interceptor
97+
}
98+
99+
}
100+
});
101+
}
102+
103+
/**
104+
* Indicate if user added APM Network plugin or not
105+
* [true] means user added the APM plugin
106+
* [false] means not
107+
*/
108+
@ReactMethod
109+
public void hasAPMNetworkPlugin(Promise promise) {
110+
MainThreadHandler.runOnMainThread(new Runnable() {
111+
@Override
112+
public void run() {
113+
try {
114+
promise.resolve(getFlagValue(APM_NETWORK_PLUGIN_INSTALLED));
115+
} catch (Exception e) {
116+
e.printStackTrace();
117+
promise.resolve(false); // Will rollback to JS interceptor
118+
}
119+
120+
}
121+
});
122+
}
123+
124+
125+
@ReactMethod
126+
public void registerNetworkLogsListener() {
127+
MainThreadHandler.runOnMainThread(new Runnable() {
128+
@Override
129+
public void run() {
130+
InternalAPM._registerNetworkLogSanitizer((networkLogSnapshot, onCompleteCallback) -> {
131+
final String id = String.valueOf(onCompleteCallback.hashCode());
132+
callbackMap.put(id, onCompleteCallback);
133+
134+
WritableMap networkSnapshotParams = Arguments.createMap();
135+
networkSnapshotParams.putString("id", id);
136+
networkSnapshotParams.putString("url", networkLogSnapshot.getUrl());
137+
networkSnapshotParams.putInt("responseCode", networkLogSnapshot.getResponseCode());
138+
networkSnapshotParams.putString("requestBody", networkLogSnapshot.getRequestBody());
139+
networkSnapshotParams.putString("response", networkLogSnapshot.getResponse());
140+
final Map<String, Object> requestHeaders = networkLogSnapshot.getRequestHeaders();
141+
if (requestHeaders != null) {
142+
networkSnapshotParams.putMap("requestHeader", convertFromMapToWritableMap(requestHeaders));
143+
}
144+
final Map<String, Object> responseHeaders = networkLogSnapshot.getResponseHeaders();
145+
if (responseHeaders != null) {
146+
networkSnapshotParams.putMap("responseHeader", convertFromMapToWritableMap(responseHeaders));
147+
}
148+
149+
sendEvent(Constants.IBG_NETWORK_LOGGER_HANDLER, networkSnapshotParams);
150+
});
151+
}
152+
});
153+
}
154+
155+
@ReactMethod
156+
public void resetNetworkLogsListener() {
157+
MainThreadHandler.runOnMainThread(new Runnable() {
158+
@Override
159+
public void run() {
160+
InternalAPM._registerNetworkLogSanitizer(null);
161+
}
162+
});
163+
}
164+
165+
@ReactMethod
166+
public void updateNetworkLogSnapshot(
167+
String url,
168+
String callbackID,
169+
String requestBody,
170+
String responseBody,
171+
int responseCode,
172+
ReadableMap requestHeaders,
173+
ReadableMap responseHeaders
174+
) {
175+
try {
176+
// Convert ReadableMap to a Java Map for easier handling
177+
Map<String, Object> requestHeadersMap = convertReadableMapToMap(requestHeaders);
178+
Map<String, Object> responseHeadersMap = convertReadableMapToMap(responseHeaders);
179+
180+
NetworkLogSnapshot modifiedSnapshot = null;
181+
if (!url.isEmpty()) {
182+
modifiedSnapshot = new NetworkLogSnapshot(url, requestHeadersMap, requestBody, responseHeadersMap, responseBody, responseCode);
183+
}
184+
185+
final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(callbackID);
186+
if (callback != null) {
187+
callback.onComplete(modifiedSnapshot);
188+
callbackMap.remove(callbackID);
189+
}
190+
} catch (Exception e) {
191+
// Reject the promise to indicate an error occurred
192+
Log.e("IB-CP-Bridge", "InstabugNetworkLogger.updateNetworkLogSnapshot failed to parse the network snapshot object.");
193+
}
194+
}
195+
}

android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.instabug.reactlibrary;
22

3+
import static com.instabug.apm.configuration.cp.APMFeature.APM_NETWORK_PLUGIN_INSTALLED;
4+
import static com.instabug.apm.configuration.cp.APMFeature.CP_NATIVE_INTERCEPTION_ENABLED;
35
import static com.instabug.reactlibrary.utils.InstabugUtil.getMethod;
46

57
import android.app.Application;
@@ -38,7 +40,8 @@
3840
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
3941
import com.instabug.library.internal.crossplatform.InternalCore;
4042
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
41-
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
43+
import com.instabug.library.internal.crossplatform.InternalCore;
44+
import com.instabug.library.internal.crossplatform.OnFeaturesUpdatedListener;
4245
import com.instabug.library.internal.module.InstabugLocale;
4346
import com.instabug.library.invocation.InstabugInvocationEvent;
4447
import com.instabug.library.logging.InstabugLog;
@@ -1270,7 +1273,23 @@ public Map<String, Object> getConstants() {
12701273
return constants;
12711274
}
12721275

1273-
/**
1276+
1277+
@ReactMethod
1278+
public void setOnFeaturesUpdatedListener() {
1279+
InternalCore.INSTANCE._setOnFeaturesUpdatedListener(new OnFeaturesUpdatedListener() {
1280+
@Override
1281+
public void invoke() {
1282+
final boolean cpNativeInterceptionEnabled = InternalAPM._isFeatureEnabledCP(CP_NATIVE_INTERCEPTION_ENABLED, "");
1283+
final boolean hasAPMPlugin = InternalAPM._isFeatureEnabledCP(APM_NETWORK_PLUGIN_INSTALLED, "");
1284+
1285+
WritableMap params = Arguments.createMap();
1286+
params.putBoolean("cpNativeInterceptionEnabled", cpNativeInterceptionEnabled);
1287+
params.putBoolean("hasAPMPlugin", hasAPMPlugin);
1288+
sendEvent(Constants.IBG_ON_FEATURES_UPDATED_CALLBACK, params);
1289+
}
1290+
});
1291+
}
1292+
/**
12741293
* Enables or disables capturing network body.
12751294
* @param isEnabled A boolean to enable/disable capturing network body.
12761295
*/

android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativePackage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext r
2929
modules.add(new RNInstabugRepliesModule(reactContext));
3030
modules.add(new RNInstabugAPMModule(reactContext));
3131
modules.add(new RNInstabugSessionReplayModule(reactContext));
32+
modules.add(new RNInstabugNetworkLoggerModule(reactContext));
3233
return modules;
3334
}
3435

0 commit comments

Comments
 (0)