@luciq/react-native 19.6.0 → 19.7.0
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/CHANGELOG.md +12 -0
- package/README.md +174 -111
- package/android/native.gradle +1 -1
- package/android/proguard-rules.txt +1 -1
- package/android/src/main/java/ai/luciq/reactlibrary/Constants.java +3 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +13 -5
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +29 -9
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +139 -118
- package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +5 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/LuciqRNLogger.java +53 -0
- package/dist/modules/Luciq.js +10 -1
- package/dist/modules/NetworkLogger.d.ts +0 -5
- package/dist/modules/NetworkLogger.js +9 -1
- package/dist/utils/FeatureFlags.d.ts +6 -0
- package/dist/utils/FeatureFlags.js +35 -0
- package/dist/utils/LuciqUtils.js +7 -0
- package/dist/utils/XhrNetworkInterceptor.js +85 -53
- package/ios/RNLuciq/LuciqNetworkLoggerBridge.m +30 -6
- package/ios/RNLuciq/LuciqReactBridge.m +21 -4
- package/ios/RNLuciq/Util/LuciqRNLogger.h +32 -0
- package/ios/RNLuciq/Util/LuciqRNLogger.m +57 -0
- package/ios/native.rb +1 -1
- package/package.json +1 -1
- package/src/modules/Luciq.ts +13 -1
- package/src/modules/NetworkLogger.ts +26 -1
- package/src/utils/FeatureFlags.ts +44 -0
- package/src/utils/LuciqUtils.ts +20 -0
- package/src/utils/XhrNetworkInterceptor.ts +128 -55
|
@@ -4,7 +4,7 @@ package ai.luciq.reactlibrary;
|
|
|
4
4
|
import static ai.luciq.apm.configuration.cp.APMFeature.APM_NETWORK_PLUGIN_INSTALLED;
|
|
5
5
|
import static ai.luciq.apm.configuration.cp.APMFeature.CP_NATIVE_INTERCEPTION_ENABLED;
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import static ai.luciq.reactlibrary.Constants.NET_TAG;
|
|
8
8
|
|
|
9
9
|
import androidx.annotation.NonNull;
|
|
10
10
|
|
|
@@ -20,6 +20,7 @@ import ai.luciq.apm.InternalAPM;
|
|
|
20
20
|
import ai.luciq.apm.sanitization.OnCompleteCallback;
|
|
21
21
|
import ai.luciq.library.logging.listeners.networklogs.NetworkLogSnapshot;
|
|
22
22
|
import ai.luciq.reactlibrary.utils.EventEmitterModule;
|
|
23
|
+
import ai.luciq.reactlibrary.utils.LuciqRNLogger;
|
|
23
24
|
import ai.luciq.reactlibrary.utils.MainThreadHandler;
|
|
24
25
|
|
|
25
26
|
import org.json.JSONException;
|
|
@@ -57,7 +58,9 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
private boolean getFlagValue(String key) {
|
|
60
|
-
|
|
61
|
+
boolean value = InternalAPM._isFeatureEnabledCP(key, "");
|
|
62
|
+
LuciqRNLogger.d(NET_TAG, "[getFlagValue] key=" + key + ", value=" + value);
|
|
63
|
+
return value;
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
private WritableMap convertFromMapToWritableMap(Map<String, Object> map) {
|
|
@@ -86,14 +89,18 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
86
89
|
*/
|
|
87
90
|
@ReactMethod
|
|
88
91
|
public void isNativeInterceptionEnabled(Promise promise) {
|
|
92
|
+
LuciqRNLogger.d(NET_TAG, "[isNativeInterceptionEnabled] Querying CP_NATIVE_INTERCEPTION_ENABLED flag");
|
|
89
93
|
MainThreadHandler.runOnMainThread(new Runnable() {
|
|
90
94
|
@Override
|
|
91
95
|
public void run() {
|
|
92
96
|
try {
|
|
93
|
-
|
|
97
|
+
boolean enabled = getFlagValue(CP_NATIVE_INTERCEPTION_ENABLED);
|
|
98
|
+
LuciqRNLogger.d(NET_TAG, "[isNativeInterceptionEnabled] Result=" + enabled);
|
|
99
|
+
promise.resolve(enabled);
|
|
94
100
|
} catch (Exception e) {
|
|
101
|
+
LuciqRNLogger.e(NET_TAG, "[isNativeInterceptionEnabled] Error — falling back to false (JS interceptor)", e);
|
|
95
102
|
e.printStackTrace();
|
|
96
|
-
promise.resolve(false);
|
|
103
|
+
promise.resolve(false);
|
|
97
104
|
}
|
|
98
105
|
|
|
99
106
|
}
|
|
@@ -107,14 +114,18 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
107
114
|
*/
|
|
108
115
|
@ReactMethod
|
|
109
116
|
public void hasAPMNetworkPlugin(Promise promise) {
|
|
117
|
+
LuciqRNLogger.d(NET_TAG, "[hasAPMNetworkPlugin] Querying APM_NETWORK_PLUGIN_INSTALLED flag");
|
|
110
118
|
MainThreadHandler.runOnMainThread(new Runnable() {
|
|
111
119
|
@Override
|
|
112
120
|
public void run() {
|
|
113
121
|
try {
|
|
114
|
-
|
|
122
|
+
boolean hasPlugin = getFlagValue(APM_NETWORK_PLUGIN_INSTALLED);
|
|
123
|
+
LuciqRNLogger.d(NET_TAG, "[hasAPMNetworkPlugin] Result=" + hasPlugin);
|
|
124
|
+
promise.resolve(hasPlugin);
|
|
115
125
|
} catch (Exception e) {
|
|
126
|
+
LuciqRNLogger.e(NET_TAG, "[hasAPMNetworkPlugin] Error — falling back to false", e);
|
|
116
127
|
e.printStackTrace();
|
|
117
|
-
promise.resolve(false);
|
|
128
|
+
promise.resolve(false);
|
|
118
129
|
}
|
|
119
130
|
|
|
120
131
|
}
|
|
@@ -124,12 +135,14 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
124
135
|
|
|
125
136
|
@ReactMethod
|
|
126
137
|
public void registerNetworkLogsListener() {
|
|
138
|
+
LuciqRNLogger.d(NET_TAG, "[registerNetworkLogsListener] Registering network log sanitizer");
|
|
127
139
|
MainThreadHandler.runOnMainThread(new Runnable() {
|
|
128
140
|
@Override
|
|
129
141
|
public void run() {
|
|
130
142
|
InternalAPM._registerNetworkLogSanitizer((networkLogSnapshot, onCompleteCallback) -> {
|
|
131
143
|
final String id = String.valueOf(onCompleteCallback.hashCode());
|
|
132
144
|
callbackMap.put(id, onCompleteCallback);
|
|
145
|
+
LuciqRNLogger.d(NET_TAG, "[NetworkLogSanitizer] Received snapshot — id=" + id + ", url=" + networkLogSnapshot.getUrl() + ", responseCode=" + networkLogSnapshot.getResponseCode() + ", callbackMapSize=" + callbackMap.size());
|
|
133
146
|
|
|
134
147
|
WritableMap networkSnapshotParams = Arguments.createMap();
|
|
135
148
|
networkSnapshotParams.putString("id", id);
|
|
@@ -147,6 +160,7 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
147
160
|
}
|
|
148
161
|
|
|
149
162
|
sendEvent(Constants.LCQ_NETWORK_LOGGER_HANDLER, networkSnapshotParams);
|
|
163
|
+
LuciqRNLogger.d(NET_TAG, "[NetworkLogSanitizer] Sent event to JS: " + Constants.LCQ_NETWORK_LOGGER_HANDLER + " for " + networkLogSnapshot.getUrl());
|
|
150
164
|
});
|
|
151
165
|
}
|
|
152
166
|
});
|
|
@@ -154,10 +168,12 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
154
168
|
|
|
155
169
|
@ReactMethod
|
|
156
170
|
public void resetNetworkLogsListener() {
|
|
171
|
+
LuciqRNLogger.d(NET_TAG, "[resetNetworkLogsListener] Clearing network log sanitizer, callbackMapSize=" + callbackMap.size());
|
|
157
172
|
MainThreadHandler.runOnMainThread(new Runnable() {
|
|
158
173
|
@Override
|
|
159
174
|
public void run() {
|
|
160
175
|
InternalAPM._registerNetworkLogSanitizer(null);
|
|
176
|
+
LuciqRNLogger.d(NET_TAG, "[resetNetworkLogsListener] Sanitizer cleared");
|
|
161
177
|
}
|
|
162
178
|
});
|
|
163
179
|
}
|
|
@@ -172,24 +188,28 @@ public class RNLuciqNetworkLoggerModule extends EventEmitterModule {
|
|
|
172
188
|
ReadableMap requestHeaders,
|
|
173
189
|
ReadableMap responseHeaders
|
|
174
190
|
) {
|
|
191
|
+
LuciqRNLogger.d(NET_TAG, "[updateNetworkLogSnapshot] callbackID=" + callbackID + ", url=" + url + ", responseCode=" + responseCode + ", callbackMapSize=" + callbackMap.size());
|
|
175
192
|
try {
|
|
176
|
-
// Convert ReadableMap to a Java Map for easier handling
|
|
177
193
|
Map<String, Object> requestHeadersMap = convertReadableMapToMap(requestHeaders);
|
|
178
194
|
Map<String, Object> responseHeadersMap = convertReadableMapToMap(responseHeaders);
|
|
179
195
|
|
|
180
196
|
NetworkLogSnapshot modifiedSnapshot = null;
|
|
181
197
|
if (!url.isEmpty()) {
|
|
182
198
|
modifiedSnapshot = new NetworkLogSnapshot(url, requestHeadersMap, requestBody, responseHeadersMap, responseBody, responseCode);
|
|
199
|
+
} else {
|
|
200
|
+
LuciqRNLogger.d(NET_TAG, "[updateNetworkLogSnapshot] Empty URL — snapshot will be null (request filtered/removed)");
|
|
183
201
|
}
|
|
184
202
|
|
|
185
203
|
final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(callbackID);
|
|
186
204
|
if (callback != null) {
|
|
187
205
|
callback.onComplete(modifiedSnapshot);
|
|
188
206
|
callbackMap.remove(callbackID);
|
|
207
|
+
LuciqRNLogger.d(NET_TAG, "[updateNetworkLogSnapshot] Callback invoked and removed for " + callbackID + ", remaining=" + callbackMap.size());
|
|
208
|
+
} else {
|
|
209
|
+
LuciqRNLogger.e(NET_TAG, "[updateNetworkLogSnapshot] No callback found for callbackID=" + callbackID + " — possible leak or duplicate call, mapKeys=" + callbackMap.keySet());
|
|
189
210
|
}
|
|
190
211
|
} catch (Exception e) {
|
|
191
|
-
|
|
192
|
-
Log.e("IB-CP-Bridge", "LuciqNetworkLogger.updateNetworkLogSnapshot failed to parse the network snapshot object.");
|
|
212
|
+
LuciqRNLogger.e(NET_TAG, "[updateNetworkLogSnapshot] Exception processing snapshot: " + e.getMessage() + " for callbackID=" + callbackID, e);
|
|
193
213
|
}
|
|
194
214
|
}
|
|
195
215
|
}
|