@luciq/react-native 19.6.0-51917-SNAPSHOT → 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/src/main/java/ai/luciq/reactlibrary/Constants.java +3 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +13 -14
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +19 -21
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +131 -132
- package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +3 -5
- package/android/src/main/java/ai/luciq/reactlibrary/utils/LuciqRNLogger.java +53 -0
- package/dist/utils/LuciqUtils.js +1 -0
- 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 +2 -1
- package/src/utils/LuciqUtils.ts +5 -0
package/dist/utils/LuciqUtils.js
CHANGED
|
@@ -201,6 +201,7 @@ export const reportNetworkLog = (network) => {
|
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
else {
|
|
204
|
+
Logger.debug('LCQ-RN-NET:', `[reportNetworkLog] Sending to NativeLuciq.networkLogIOS: ${network.method} ${network.url}, status=${network.responseCode}, duration=${network.duration}ms, error=${network.errorDomain || 'none'}`);
|
|
204
205
|
NativeLuciq.networkLogIOS(network.url, network.method, network.requestBody, network.requestBodySize, network.responseBody, network.responseBodySize, network.responseCode, network.requestHeaders, network.responseHeaders, network.contentType, network.errorDomain, network.errorCode, network.startTime, network.duration, network.gqlQueryName, network.serverErrorMessage, {
|
|
205
206
|
isW3cHeaderFound: network.isW3cHeaderFound,
|
|
206
207
|
partialId: network.partialId,
|
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
//
|
|
7
7
|
#import "LuciqNetworkLoggerBridge.h"
|
|
8
8
|
#import "Util/LCQNetworkLogger+CP.h"
|
|
9
|
+
#import "Util/LuciqRNLogger.h"
|
|
9
10
|
|
|
10
11
|
#import <React/RCTLog.h>
|
|
11
12
|
#import <React/RCTConvert.h>
|
|
12
13
|
|
|
14
|
+
static NSString *const LCQRNNetTag = @"LCQ-RN-NET";
|
|
15
|
+
|
|
13
16
|
// Extend RCTConvert to handle NetworkListenerType enum conversion
|
|
14
17
|
@implementation RCTConvert (NetworkListenerType)
|
|
15
18
|
|
|
@@ -60,22 +63,27 @@ bool lcq_hasListeners = NO;
|
|
|
60
63
|
// Will be called when this module's first listener is added.
|
|
61
64
|
-(void)startObserving {
|
|
62
65
|
lcq_hasListeners = YES;
|
|
66
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[EventEmitter] startObserving - LCQNetworkLogger listeners ON"];
|
|
63
67
|
// Set up any upstream listeners or background tasks as necessary
|
|
64
68
|
}
|
|
65
69
|
|
|
66
70
|
// Will be called when this module's last listener is removed, or on dealloc.
|
|
67
71
|
-(void)stopObserving {
|
|
68
72
|
lcq_hasListeners = NO;
|
|
73
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[EventEmitter] stopObserving - LCQNetworkLogger listeners OFF"];
|
|
69
74
|
// Remove upstream listeners, stop unnecessary background tasks
|
|
70
75
|
}
|
|
71
76
|
|
|
72
77
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isNativeInterceptionEnabled) {
|
|
73
|
-
|
|
78
|
+
BOOL enabled = LCQNetworkLogger.isNativeNetworkInterceptionFeatureEnabled;
|
|
79
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[isNativeInterceptionEnabled] Result=%d", enabled];
|
|
80
|
+
return @(enabled);
|
|
74
81
|
}
|
|
75
82
|
|
|
76
83
|
|
|
77
84
|
|
|
78
85
|
RCT_EXPORT_METHOD(registerNetworkLogsListener: (NetworkListenerType) listenerType) {
|
|
86
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[registerNetworkLogsListener] listenerType=%ld", (long)listenerType];
|
|
79
87
|
switch (listenerType) {
|
|
80
88
|
case NetworkListenerTypeFiltering:
|
|
81
89
|
[self setupRequestFilteringHandler];
|
|
@@ -91,7 +99,7 @@ RCT_EXPORT_METHOD(registerNetworkLogsListener: (NetworkListenerType) listenerTyp
|
|
|
91
99
|
break;
|
|
92
100
|
|
|
93
101
|
default:
|
|
94
|
-
|
|
102
|
+
[LuciqRNLogger e:LCQRNNetTag format:@"[registerNetworkLogsListener] Unknown NetworkListenerType=%ld", (long)listenerType];
|
|
95
103
|
break;
|
|
96
104
|
}
|
|
97
105
|
}
|
|
@@ -105,10 +113,12 @@ RCT_EXPORT_METHOD(updateNetworkLogSnapshot:(NSString * _Nonnull)url
|
|
|
105
113
|
requestHeaders:(NSDictionary * _Nullable)requestHeaders
|
|
106
114
|
responseHeaders:(NSDictionary * _Nullable)responseHeaders)
|
|
107
115
|
{
|
|
116
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[updateNetworkLogSnapshot] callbackID=%@, url=%@, responseCode=%d, obfuscationMapSize=%lu", callbackID, url, (int)responseCode, (unsigned long)self.requestObfuscationCompletionDictionary.count];
|
|
117
|
+
|
|
108
118
|
// Validate and construct the URL
|
|
109
119
|
NSURL *requestURL = [NSURL URLWithString:url];
|
|
110
120
|
if (!requestURL) {
|
|
111
|
-
|
|
121
|
+
[LuciqRNLogger e:LCQRNNetTag format:@"[updateNetworkLogSnapshot] Invalid URL: %@", url];
|
|
112
122
|
return;
|
|
113
123
|
}
|
|
114
124
|
|
|
@@ -124,7 +134,7 @@ RCT_EXPORT_METHOD(updateNetworkLogSnapshot:(NSString * _Nonnull)url
|
|
|
124
134
|
if (requestHeaders && [requestHeaders isKindOfClass:[NSDictionary class]]) {
|
|
125
135
|
request.allHTTPHeaderFields = requestHeaders;
|
|
126
136
|
} else {
|
|
127
|
-
|
|
137
|
+
[LuciqRNLogger e:LCQRNNetTag format:@"[updateNetworkLogSnapshot] Invalid requestHeaders format, expected NSDictionary - url=%@", url];
|
|
128
138
|
}
|
|
129
139
|
|
|
130
140
|
// Ensure callbackID is valid and the completion handler exists
|
|
@@ -132,18 +142,20 @@ RCT_EXPORT_METHOD(updateNetworkLogSnapshot:(NSString * _Nonnull)url
|
|
|
132
142
|
if (callbackID && [callbackID isKindOfClass:[NSString class]] && completionHandler) {
|
|
133
143
|
// Call the completion handler with the constructed request
|
|
134
144
|
completionHandler(request);
|
|
145
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[updateNetworkLogSnapshot] Obfuscation completion invoked for callbackID=%@", callbackID];
|
|
135
146
|
} else {
|
|
136
|
-
|
|
147
|
+
[LuciqRNLogger e:LCQRNNetTag format:@"[updateNetworkLogSnapshot] CallbackID not found or completion handler unavailable for callbackID=%@, mapSize=%lu", callbackID, (unsigned long)self.requestObfuscationCompletionDictionary.count];
|
|
137
148
|
}
|
|
138
149
|
}
|
|
139
150
|
|
|
140
151
|
RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (NSString * _Nonnull) callbackID : (BOOL)value ){
|
|
152
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[setNetworkLoggingRequestFilterPredicateIOS] callbackID=%@, save=%d, filteringMapSize=%lu", callbackID, value, (unsigned long)self.requestFilteringCompletionDictionary.count];
|
|
141
153
|
|
|
142
154
|
if (self.requestFilteringCompletionDictionary[callbackID] != nil) {
|
|
143
155
|
// ⬇️ YES == Request will be saved, NO == will be ignored
|
|
144
156
|
((LCQURLRequestResponseAsyncFilteringCompletedHandler)self.requestFilteringCompletionDictionary[callbackID])(value);
|
|
145
157
|
} else {
|
|
146
|
-
|
|
158
|
+
[LuciqRNLogger e:LCQRNNetTag format:@"[setNetworkLoggingRequestFilterPredicateIOS] Filtering completion not found for callbackID=%@", callbackID];
|
|
147
159
|
}
|
|
148
160
|
}
|
|
149
161
|
|
|
@@ -152,13 +164,18 @@ RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (NSString * _Nonnu
|
|
|
152
164
|
|
|
153
165
|
// Set up the filtering handler
|
|
154
166
|
- (void)setupRequestFilteringHandler {
|
|
167
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[setupRequestFilteringHandler] Registering filtering handler with LCQNetworkLogger"];
|
|
155
168
|
[LCQNetworkLogger setCPRequestFilteringHandler:^(NSURLRequest * _Nonnull request, void (^ _Nonnull completion)(BOOL)) {
|
|
156
169
|
NSString *callbackID = [[[NSUUID alloc] init] UUIDString];
|
|
157
170
|
self.requestFilteringCompletionDictionary[callbackID] = completion;
|
|
171
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[FilteringHandler] Received request - callbackID=%@, url=%@, mapSize=%lu", callbackID, request.URL.absoluteString, (unsigned long)self.requestFilteringCompletionDictionary.count];
|
|
158
172
|
|
|
159
173
|
NSDictionary *dict = [self createNetworkRequestDictForRequest:request callbackID:callbackID];
|
|
160
174
|
if(lcq_hasListeners){
|
|
161
175
|
[self sendEventWithName:@"LCQNetworkLoggerHandler" body:dict];
|
|
176
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[FilteringHandler] Sent event to JS for url=%@", request.URL.absoluteString];
|
|
177
|
+
} else {
|
|
178
|
+
[LuciqRNLogger w:LCQRNNetTag format:@"[FilteringHandler] Event DROPPED (no JS listeners) for url=%@", request.URL.absoluteString];
|
|
162
179
|
}
|
|
163
180
|
|
|
164
181
|
}];
|
|
@@ -166,14 +183,19 @@ RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (NSString * _Nonnu
|
|
|
166
183
|
|
|
167
184
|
// Set up the obfuscation handler
|
|
168
185
|
- (void)setupRequestObfuscationHandler {
|
|
186
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[setupRequestObfuscationHandler] Registering obfuscation handler with LCQNetworkLogger"];
|
|
169
187
|
[LCQNetworkLogger setCPRequestAsyncObfuscationHandler:^(NSURLRequest * _Nonnull request, void (^ _Nonnull completion)(NSURLRequest * _Nonnull)) {
|
|
170
188
|
NSString *callbackID = [[[NSUUID alloc] init] UUIDString];
|
|
171
189
|
self.requestObfuscationCompletionDictionary[callbackID] = completion;
|
|
190
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[ObfuscationHandler] Received request - callbackID=%@, url=%@, mapSize=%lu", callbackID, request.URL.absoluteString, (unsigned long)self.requestObfuscationCompletionDictionary.count];
|
|
172
191
|
|
|
173
192
|
|
|
174
193
|
NSDictionary *dict = [self createNetworkRequestDictForRequest:request callbackID:callbackID];
|
|
175
194
|
if (lcq_hasListeners) {
|
|
176
195
|
[self sendEventWithName:@"LCQNetworkLoggerHandler" body:dict];
|
|
196
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[ObfuscationHandler] Sent event to JS for url=%@", request.URL.absoluteString];
|
|
197
|
+
} else {
|
|
198
|
+
[LuciqRNLogger w:LCQRNNetTag format:@"[ObfuscationHandler] Event DROPPED (no JS listeners) for url=%@", request.URL.absoluteString];
|
|
177
199
|
}
|
|
178
200
|
|
|
179
201
|
}];
|
|
@@ -194,10 +216,12 @@ RCT_EXPORT_METHOD(setNetworkLoggingRequestFilterPredicateIOS: (NSString * _Nonnu
|
|
|
194
216
|
}
|
|
195
217
|
|
|
196
218
|
RCT_EXPORT_METHOD(forceStartNetworkLoggingIOS) {
|
|
219
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[forceStartNetworkLoggingIOS] Starting native network logging"];
|
|
197
220
|
[LCQNetworkLogger forceStartNetworkLogging];
|
|
198
221
|
}
|
|
199
222
|
|
|
200
223
|
RCT_EXPORT_METHOD(forceStopNetworkLoggingIOS) {
|
|
224
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[forceStopNetworkLoggingIOS] Stopping native network logging"];
|
|
201
225
|
[LCQNetworkLogger forceStopNetworkLogging];
|
|
202
226
|
}
|
|
203
227
|
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
#import <React/RCTUIManager.h>
|
|
16
16
|
#import "RNLuciq.h"
|
|
17
17
|
#import "Util/LCQNetworkLogger+CP.h"
|
|
18
|
+
#import "Util/LuciqRNLogger.h"
|
|
19
|
+
|
|
20
|
+
static NSString *const LCQRNNetTag = @"LCQ-RN-NET";
|
|
18
21
|
|
|
19
22
|
@interface Luciq (PrivateWillSendAPI)
|
|
20
23
|
+ (void)setWillSendReportHandler_private:(void(^)(LCQReport *report, void(^reportCompletionHandler)(LCQReport *)))willSendReportHandler_private;
|
|
@@ -46,6 +49,8 @@ RCT_EXPORT_METHOD(init:(NSString *)token
|
|
|
46
49
|
options:(nullable NSDictionary *)options
|
|
47
50
|
overAirVersion :(NSDictionary *)overAirVersion
|
|
48
51
|
) {
|
|
52
|
+
[LuciqRNLogger setLevel:sdkDebugLogsLevel];
|
|
53
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[init] Called - logLevel=%ld, useNativeNetworkInterception=%d, codePushVersion=%@, appVariant=%@", (long)sdkDebugLogsLevel, useNativeNetworkInterception, codePushVersion, appVariant];
|
|
49
54
|
|
|
50
55
|
if(appVariant != nil){
|
|
51
56
|
Luciq.appVariant = appVariant;
|
|
@@ -65,6 +70,7 @@ RCT_EXPORT_METHOD(init:(NSString *)token
|
|
|
65
70
|
invocationEvents:invocationEvents
|
|
66
71
|
debugLogsLevel:sdkDebugLogsLevel
|
|
67
72
|
useNativeNetworkInterception:useNativeNetworkInterception];
|
|
73
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[init] SDK build complete"];
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
RCT_EXPORT_METHOD(setCodePushVersion:(NSString *)version) {
|
|
@@ -409,11 +415,13 @@ RCT_EXPORT_METHOD(networkLogIOS:(NSString * _Nonnull)url
|
|
|
409
415
|
gqlQueryName:(NSString * _Nullable)gqlQueryName
|
|
410
416
|
serverErrorMessage:(NSString * _Nullable)serverErrorMessage
|
|
411
417
|
w3cExternalTraceAttributes:(NSDictionary * _Nullable)w3cExternalTraceAttributes){
|
|
418
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[networkLogIOS] Received from JS: %@ %@, status=%d, duration=%.0fms, startTime=%.0f, error=%@, gqlQuery=%@, reqBodyLen=%lu, resBodyLen=%lu", method, url, (int)responseCode, duration * 1000, startTime, errorDomain, gqlQueryName, (unsigned long)requestBody.length, (unsigned long)responseBody.length];
|
|
412
419
|
NSNumber *isW3cCaught = (w3cExternalTraceAttributes[@"isW3cHeaderFound"] != [NSNull null]) ? w3cExternalTraceAttributes[@"isW3cHeaderFound"] : nil;
|
|
413
420
|
NSNumber * partialID = (w3cExternalTraceAttributes[@"partialId"] != [NSNull null]) ? w3cExternalTraceAttributes[@"partialId"] : nil;
|
|
414
421
|
NSNumber * timestamp = (w3cExternalTraceAttributes[@"networkStartTimeInSeconds"] != [NSNull null]) ? w3cExternalTraceAttributes[@"networkStartTimeInSeconds"] : nil;
|
|
415
422
|
NSString * generatedW3CTraceparent = (w3cExternalTraceAttributes[@"w3cGeneratedHeader"] != [NSNull null]) ? w3cExternalTraceAttributes[@"w3cGeneratedHeader"] : nil;
|
|
416
423
|
NSString * caughtW3CTraceparent = (w3cExternalTraceAttributes[@"w3cCaughtHeader"] != [NSNull null]) ? w3cExternalTraceAttributes[@"w3cCaughtHeader"] : nil;
|
|
424
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[networkLogIOS] W3C attrs - isW3cCaughted=%@, partialID=%@, timestamp=%@, generatedHeader=%@, caughtHeader=%@", isW3cCaught, partialID, timestamp, generatedW3CTraceparent, caughtW3CTraceparent];
|
|
417
425
|
|
|
418
426
|
[LCQNetworkLogger addNetworkLogWithUrl:url
|
|
419
427
|
method:method
|
|
@@ -437,6 +445,7 @@ RCT_EXPORT_METHOD(networkLogIOS:(NSString * _Nonnull)url
|
|
|
437
445
|
generatedW3CTraceparent:generatedW3CTraceparent
|
|
438
446
|
caughtedW3CTraceparent:caughtW3CTraceparent
|
|
439
447
|
];
|
|
448
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[networkLogIOS] Forwarded to LCQNetworkLogger: %@ %@", method, url];
|
|
440
449
|
}
|
|
441
450
|
|
|
442
451
|
RCT_EXPORT_METHOD(addPrivateView: (nonnull NSNumber *)reactTag) {
|
|
@@ -501,13 +510,19 @@ RCT_EXPORT_METHOD(willRedirectToStore){
|
|
|
501
510
|
}
|
|
502
511
|
|
|
503
512
|
RCT_EXPORT_METHOD(isW3ExternalTraceIDEnabled:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
|
|
504
|
-
|
|
513
|
+
BOOL enabled = LCQNetworkLogger.w3ExternalTraceIDEnabled;
|
|
514
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[isW3ExternalTraceIDEnabled] Result=%d", enabled];
|
|
515
|
+
resolve(@(enabled));
|
|
505
516
|
}
|
|
506
517
|
RCT_EXPORT_METHOD(isW3ExternalGeneratedHeaderEnabled:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
|
|
507
|
-
|
|
518
|
+
BOOL enabled = LCQNetworkLogger.w3ExternalGeneratedHeaderEnabled;
|
|
519
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[isW3ExternalGeneratedHeaderEnabled] Result=%d", enabled];
|
|
520
|
+
resolve(@(enabled));
|
|
508
521
|
}
|
|
509
522
|
RCT_EXPORT_METHOD(isW3CaughtHeaderEnabled:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
|
|
510
|
-
|
|
523
|
+
BOOL enabled = LCQNetworkLogger.w3CaughtHeaderEnabled;
|
|
524
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[isW3CaughtHeaderEnabled] Result=%d", enabled];
|
|
525
|
+
resolve(@(enabled));
|
|
511
526
|
}
|
|
512
527
|
|
|
513
528
|
|
|
@@ -550,7 +565,9 @@ RCT_EXPORT_METHOD(enableAutoMasking:(NSArray *)autoMaskingTypes) {
|
|
|
550
565
|
};
|
|
551
566
|
|
|
552
567
|
RCT_EXPORT_METHOD(getNetworkBodyMaxSize:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
|
|
553
|
-
|
|
568
|
+
NSUInteger limit = LCQNetworkLogger.getNetworkBodyMaxSize;
|
|
569
|
+
[LuciqRNLogger d:LCQRNNetTag format:@"[getNetworkBodyMaxSize] Result=%lu", (unsigned long)limit];
|
|
570
|
+
resolve(@(limit));
|
|
554
571
|
}
|
|
555
572
|
|
|
556
573
|
RCT_EXPORT_METHOD(setNetworkLogBodyEnabled:(BOOL)isEnabled) {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// LuciqRNLogger.h
|
|
3
|
+
// RNLuciq
|
|
4
|
+
//
|
|
5
|
+
// Bridge-side logger that gates NSLog output on the same debugLogsLevel
|
|
6
|
+
// the host app passes to Luciq.init(), so the native RN bridge diagnostic
|
|
7
|
+
// logs do not leak in production builds when the JS-side Logger is silent.
|
|
8
|
+
//
|
|
9
|
+
// Mirrors the level hierarchy in src/utils/logger.ts:
|
|
10
|
+
// Verbose > Debug > Error > None
|
|
11
|
+
//
|
|
12
|
+
// Note: LCQSDKDebugLogsLevel uses smaller-is-more-verbose ordering
|
|
13
|
+
// (Verbose=1, Debug=2, Error=3, None=4), which is inverted vs Android.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
#import <Foundation/Foundation.h>
|
|
17
|
+
#import <LuciqSDK/LCQTypes.h>
|
|
18
|
+
|
|
19
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
20
|
+
|
|
21
|
+
@interface LuciqRNLogger : NSObject
|
|
22
|
+
|
|
23
|
+
+ (void)setLevel:(LCQSDKDebugLogsLevel)level;
|
|
24
|
+
+ (LCQSDKDebugLogsLevel)level;
|
|
25
|
+
|
|
26
|
+
+ (void)d:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3);
|
|
27
|
+
+ (void)w:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3);
|
|
28
|
+
+ (void)e:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3);
|
|
29
|
+
|
|
30
|
+
@end
|
|
31
|
+
|
|
32
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//
|
|
2
|
+
// LuciqRNLogger.m
|
|
3
|
+
// RNLuciq
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
#import "LuciqRNLogger.h"
|
|
7
|
+
|
|
8
|
+
@implementation LuciqRNLogger
|
|
9
|
+
|
|
10
|
+
static LCQSDKDebugLogsLevel _currentLevel = LCQSDKDebugLogsLevelError;
|
|
11
|
+
|
|
12
|
+
+ (void)setLevel:(LCQSDKDebugLogsLevel)level {
|
|
13
|
+
_currentLevel = level;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
+ (LCQSDKDebugLogsLevel)level {
|
|
17
|
+
return _currentLevel;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// LCQSDKDebugLogsLevel: Verbose=1, Debug=2, Error=3, None=4 — smaller = more verbose.
|
|
21
|
+
// A method emits when its required level is >= currentLevel.
|
|
22
|
+
+ (BOOL)allowsDebug {
|
|
23
|
+
return _currentLevel <= LCQSDKDebugLogsLevelDebug;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
+ (BOOL)allowsError {
|
|
27
|
+
return _currentLevel <= LCQSDKDebugLogsLevelError;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
+ (void)d:(NSString *)tag format:(NSString *)format, ... {
|
|
31
|
+
if (![self allowsDebug]) { return; }
|
|
32
|
+
va_list args;
|
|
33
|
+
va_start(args, format);
|
|
34
|
+
NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
|
|
35
|
+
va_end(args);
|
|
36
|
+
NSLog(@"[%@] %@", tag, message);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
+ (void)w:(NSString *)tag format:(NSString *)format, ... {
|
|
40
|
+
if (![self allowsDebug]) { return; }
|
|
41
|
+
va_list args;
|
|
42
|
+
va_start(args, format);
|
|
43
|
+
NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
|
|
44
|
+
va_end(args);
|
|
45
|
+
NSLog(@"[%@] WARN: %@", tag, message);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
+ (void)e:(NSString *)tag format:(NSString *)format, ... {
|
|
49
|
+
if (![self allowsError]) { return; }
|
|
50
|
+
va_list args;
|
|
51
|
+
va_start(args, format);
|
|
52
|
+
NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
|
|
53
|
+
va_end(args);
|
|
54
|
+
NSLog(@"[%@] ERROR: %@", tag, message);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@end
|
package/ios/native.rb
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luciq/react-native",
|
|
3
3
|
"description": "Luciq is the Agentic Observability Platform built for Mobile.",
|
|
4
|
-
"version": "19.
|
|
4
|
+
"version": "19.7.0",
|
|
5
5
|
"author": "Luciq (https://luciq.ai)",
|
|
6
6
|
"repository": "github:luciqai/luciq-reactnative-sdk",
|
|
7
7
|
"homepage": "https://www.luciq.ai/platforms/react-native",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@apollo/client": "^3.7.0",
|
|
46
|
+
"@instabug/danger-plugin-coverage": "Instabug/danger-plugin-coverage",
|
|
46
47
|
"@react-native-community/eslint-config": "^3.1.0",
|
|
47
48
|
"@react-navigation/native": "^6.1.7",
|
|
48
49
|
"@rollup/plugin-commonjs": "^25.0.3",
|
package/src/utils/LuciqUtils.ts
CHANGED
|
@@ -288,6 +288,11 @@ export const reportNetworkLog = (network: NetworkData) => {
|
|
|
288
288
|
);
|
|
289
289
|
}
|
|
290
290
|
} else {
|
|
291
|
+
Logger.debug(
|
|
292
|
+
'LCQ-RN-NET:',
|
|
293
|
+
`[reportNetworkLog] Sending to NativeLuciq.networkLogIOS: ${network.method} ${network.url}, status=${network.responseCode}, duration=${network.duration}ms, error=${network.errorDomain || 'none'}`,
|
|
294
|
+
);
|
|
295
|
+
|
|
291
296
|
NativeLuciq.networkLogIOS(
|
|
292
297
|
network.url,
|
|
293
298
|
network.method,
|