@luciq/react-native 19.4.0-44237-SNAPSHOT → 19.4.0-47504-SNAPSHOT

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.
Files changed (116) hide show
  1. package/README.md +0 -118
  2. package/RNLuciq.podspec +2 -6
  3. package/android/build.gradle +0 -25
  4. package/android/proguard-rules.txt +1 -1
  5. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +12 -3
  6. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqBugReportingModule.java +24 -28
  7. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqCrashReportingModule.java +7 -18
  8. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsModule.java +2 -1
  9. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +56 -29
  10. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +47 -78
  11. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqRepliesModule.java +16 -4
  12. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSessionReplayModule.java +16 -5
  13. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSurveysModule.java +15 -7
  14. package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +7 -0
  15. package/dist/modules/BugReporting.js +3 -3
  16. package/dist/modules/Luciq.js +3 -2
  17. package/dist/modules/NetworkLogger.d.ts +0 -5
  18. package/dist/modules/NetworkLogger.js +9 -1
  19. package/dist/modules/Replies.js +1 -1
  20. package/dist/modules/Surveys.js +2 -2
  21. package/dist/native/NativeBugReporting.d.ts +4 -4
  22. package/dist/native/NativeCrashReporting.d.ts +2 -2
  23. package/dist/native/NativeLuciq.d.ts +3 -2
  24. package/dist/native/NativePackage.js +2 -25
  25. package/dist/native/NativeReplies.d.ts +1 -1
  26. package/dist/native/NativeSurveys.d.ts +2 -2
  27. package/dist/utils/Enums.js +1 -3
  28. package/dist/utils/FeatureFlags.d.ts +6 -0
  29. package/dist/utils/FeatureFlags.js +35 -0
  30. package/dist/utils/LuciqUtils.d.ts +1 -1
  31. package/dist/utils/LuciqUtils.js +9 -0
  32. package/dist/utils/XhrNetworkInterceptor.js +85 -53
  33. package/ios/RNLuciq/LuciqAPMBridge.h +5 -5
  34. package/ios/RNLuciq/{LuciqAPMBridge.mm → LuciqAPMBridge.m} +39 -48
  35. package/ios/RNLuciq/LuciqBugReportingBridge.h +6 -6
  36. package/ios/RNLuciq/LuciqBugReportingBridge.m +249 -0
  37. package/ios/RNLuciq/LuciqCrashReportingBridge.h +5 -16
  38. package/ios/RNLuciq/LuciqCrashReportingBridge.m +68 -0
  39. package/ios/RNLuciq/LuciqFeatureRequestsBridge.h +1 -1
  40. package/ios/RNLuciq/{LuciqFeatureRequestsBridge.mm → LuciqFeatureRequestsBridge.m} +16 -21
  41. package/ios/RNLuciq/LuciqNetworkLoggerBridge.h +30 -1
  42. package/ios/RNLuciq/{LuciqNetworkLoggerBridge.mm → LuciqNetworkLoggerBridge.m} +77 -46
  43. package/ios/RNLuciq/LuciqReactBridge.h +13 -13
  44. package/ios/RNLuciq/{LuciqReactBridge.mm → LuciqReactBridge.m} +34 -83
  45. package/ios/RNLuciq/LuciqRepliesBridge.h +3 -3
  46. package/ios/RNLuciq/LuciqRepliesBridge.m +80 -0
  47. package/ios/RNLuciq/LuciqSessionReplayBridge.h +5 -5
  48. package/ios/RNLuciq/{LuciqSessionReplayBridge.mm → LuciqSessionReplayBridge.m} +25 -35
  49. package/ios/RNLuciq/LuciqSurveysBridge.h +5 -5
  50. package/ios/RNLuciq/{LuciqSurveysBridge.mm → LuciqSurveysBridge.m} +35 -34
  51. package/package.json +1 -9
  52. package/scripts/get-github-app-token.sh +70 -0
  53. package/scripts/notify-github.sh +17 -8
  54. package/src/modules/BugReporting.ts +3 -3
  55. package/src/modules/Luciq.ts +4 -2
  56. package/src/modules/NetworkLogger.ts +26 -1
  57. package/src/modules/Replies.ts +1 -1
  58. package/src/modules/Surveys.ts +2 -2
  59. package/src/native/NativeBugReporting.ts +6 -3
  60. package/src/native/NativeCrashReporting.ts +2 -2
  61. package/src/native/NativeLuciq.ts +3 -2
  62. package/src/native/NativePackage.ts +2 -52
  63. package/src/native/NativeReplies.ts +1 -1
  64. package/src/native/NativeSurveys.ts +2 -2
  65. package/src/utils/Enums.ts +1 -4
  66. package/src/utils/FeatureFlags.ts +44 -0
  67. package/src/utils/LuciqUtils.ts +21 -1
  68. package/src/utils/XhrNetworkInterceptor.ts +128 -55
  69. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +0 -9
  70. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +0 -33
  71. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +0 -33
  72. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +0 -9
  73. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +0 -9
  74. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +0 -33
  75. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +0 -33
  76. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +0 -33
  77. package/android/src/newarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +0 -33
  78. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqAPMBaseSpec.java +0 -11
  79. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBaseSpec.java +0 -22
  80. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqBugReportingBaseSpec.java +0 -22
  81. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqCrashReportingBaseSpec.java +0 -10
  82. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsBaseSpec.java +0 -10
  83. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerBaseSpec.java +0 -22
  84. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqRepliesBaseSpec.java +0 -22
  85. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSessionReplayBaseSpec.java +0 -22
  86. package/android/src/oldarch/java/ai/luciq/reactlibrary/RNLuciqSurveysBaseSpec.java +0 -22
  87. package/dist/native/specs/NativeAPM.d.ts +0 -21
  88. package/dist/native/specs/NativeAPM.js +0 -2
  89. package/dist/native/specs/NativeBugReporting.d.ts +0 -29
  90. package/dist/native/specs/NativeBugReporting.js +0 -2
  91. package/dist/native/specs/NativeCrashReporting.d.ts +0 -12
  92. package/dist/native/specs/NativeCrashReporting.js +0 -2
  93. package/dist/native/specs/NativeFeatureRequests.d.ts +0 -8
  94. package/dist/native/specs/NativeFeatureRequests.js +0 -2
  95. package/dist/native/specs/NativeLuciq.d.ts +0 -80
  96. package/dist/native/specs/NativeLuciq.js +0 -2
  97. package/dist/native/specs/NativeNetworkLogger.d.ts +0 -16
  98. package/dist/native/specs/NativeNetworkLogger.js +0 -2
  99. package/dist/native/specs/NativeReplies.d.ts +0 -21
  100. package/dist/native/specs/NativeReplies.js +0 -2
  101. package/dist/native/specs/NativeSessionReplay.d.ts +0 -17
  102. package/dist/native/specs/NativeSessionReplay.js +0 -2
  103. package/dist/native/specs/NativeSurveys.d.ts +0 -18
  104. package/dist/native/specs/NativeSurveys.js +0 -2
  105. package/ios/RNLuciq/LuciqBugReportingBridge.mm +0 -234
  106. package/ios/RNLuciq/LuciqCrashReportingBridge.mm +0 -91
  107. package/ios/RNLuciq/LuciqRepliesBridge.mm +0 -86
  108. package/src/native/specs/NativeAPM.ts +0 -47
  109. package/src/native/specs/NativeBugReporting.ts +0 -53
  110. package/src/native/specs/NativeCrashReporting.ts +0 -23
  111. package/src/native/specs/NativeFeatureRequests.ts +0 -10
  112. package/src/native/specs/NativeLuciq.ts +0 -137
  113. package/src/native/specs/NativeNetworkLogger.ts +0 -31
  114. package/src/native/specs/NativeReplies.ts +0 -27
  115. package/src/native/specs/NativeSessionReplay.ts +0 -20
  116. package/src/native/specs/NativeSurveys.ts +0 -23
@@ -6,13 +6,6 @@
6
6
  #import <LuciqSDK/LCQSessionReplay.h>
7
7
  #import "LuciqSessionReplayBridge.h"
8
8
 
9
- #ifdef RCT_NEW_ARCH_ENABLED
10
- #import <RNLuciqSpec/RNLuciqSpec.h>
11
-
12
- @interface LuciqSessionReplayBridge () <NativeSessionReplaySpec>
13
- @end
14
- #endif
15
-
16
9
  @implementation LuciqSessionReplayBridge
17
10
 
18
11
  - (dispatch_queue_t)methodQueue {
@@ -48,14 +41,14 @@ RCT_EXPORT_METHOD(setUserStepsEnabled:(BOOL)isEnabled) {
48
41
  LCQSessionReplay.userStepsEnabled = isEnabled;
49
42
  }
50
43
 
51
- RCT_EXPORT_METHOD(getSessionReplayLink:(RCTPromiseResolveBlock)resolve
52
- reject:(RCTPromiseRejectBlock)reject) {
44
+ RCT_EXPORT_METHOD(getSessionReplayLink:
45
+ (RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock)reject) {
53
46
  NSString *link = LCQSessionReplay.sessionReplayLink;
54
47
  resolve(link);
55
48
  }
56
49
 
57
50
  - (NSArray<NSDictionary *> *)getNetworkLogsArray:
58
- (NSArray<LCQSessionMetadataNetworkLogs *>*)networkLogs {
51
+ (NSArray<LCQSessionMetadataNetworkLogs *>*) networkLogs {
59
52
  NSMutableArray<NSDictionary *> *networkLogsArray = [NSMutableArray array];
60
53
 
61
54
  for (LCQSessionMetadataNetworkLogs* log in networkLogs) {
@@ -77,52 +70,49 @@ RCT_EXPORT_METHOD(getSessionReplayLink:(RCTPromiseResolveBlock)resolve
77
70
  @"bugsCount": @(metadataObject.bugsCount),
78
71
  @"fatalCrashCount": @(metadataObject.fatalCrashCount),
79
72
  @"oomCrashCount": @(metadataObject.oomCrashCount),
80
- @"networkLogs": [self getNetworkLogsArray:metadataObject.networkLogs]
73
+ @"networkLogs":[self getNetworkLogsArray:metadataObject.networkLogs]
81
74
  };
82
75
  }
83
76
 
84
- RCT_EXPORT_METHOD(setSyncCallback:(RCTPromiseResolveBlock)resolve
85
- reject:(RCTPromiseRejectBlock)reject) {
86
- __weak LuciqSessionReplayBridge *weakSelf = self;
87
- [LCQSessionReplay setSyncCallbackWithHandler:^(LCQSessionMetadata * _Nonnull metadataObject, SessionEvaluationCompletion _Nonnull completion) {
88
- LuciqSessionReplayBridge *strongSelf = weakSelf;
89
- if (!strongSelf) { return; }
90
- [strongSelf sendEventWithName:@"LCQSessionReplayOnSyncCallback"
91
- body:[strongSelf getMetadataObjectMap:metadataObject]];
92
- strongSelf.sessionEvaluationCompletion = completion;
77
+ RCT_EXPORT_METHOD(setSyncCallback) {
78
+ [LCQSessionReplay setSyncCallbackWithHandler:^(LCQSessionMetadata * _Nonnull metadataObject, SessionEvaluationCompletion _Nonnull completion) {
79
+
80
+ [self sendEventWithName:@"LCQSessionReplayOnSyncCallback"
81
+ body:[self getMetadataObjectMap:metadataObject]];
82
+
83
+ self.sessionEvaluationCompletion = completion;
93
84
  }];
94
- resolve([NSNull null]);
95
85
  }
96
86
 
97
87
  RCT_EXPORT_METHOD(evaluateSync:(BOOL)result) {
88
+
98
89
  if (self.sessionEvaluationCompletion) {
90
+
99
91
  self.sessionEvaluationCompletion(result);
92
+
100
93
  self.sessionEvaluationCompletion = nil;
101
- }
102
- }
103
94
 
104
- RCT_EXPORT_METHOD(setCapturingMode:(NSString *)mode) {
105
- LCQSessionReplay.screenshotCapturingMode = (LCQScreenshotCapturingMode)[mode intValue];
95
+ }
106
96
  }
107
97
 
108
- RCT_EXPORT_METHOD(setScreenshotQuality:(NSString *)quality) {
109
- LCQSessionReplay.screenshotQualityMode = (LCQScreenshotQualityMode)[quality intValue];
98
+ RCT_EXPORT_METHOD(setCapturingMode:(LCQScreenshotCapturingMode)mode) {
99
+ LCQSessionReplay.screenshotCapturingMode = mode;
110
100
  }
111
101
 
112
- RCT_EXPORT_METHOD(setScreenshotCaptureInterval:(double)intervalMs) {
113
- LCQSessionReplay.screenshotCaptureInterval = (NSInteger)intervalMs;
102
+ RCT_EXPORT_METHOD(setScreenshotQuality:(LCQScreenshotQualityMode)quality) {
103
+ LCQSessionReplay.screenshotQualityMode = quality;
114
104
  }
115
105
 
116
- #ifdef RCT_NEW_ARCH_ENABLED
117
- - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
118
- (const facebook::react::ObjCTurboModule::InitParams &)params
119
- {
120
- return std::make_shared<facebook::react::NativeSessionReplaySpecJSI>(params);
106
+ RCT_EXPORT_METHOD(setScreenshotCaptureInterval:(NSInteger)intervalMs) {
107
+ LCQSessionReplay.screenshotCaptureInterval = intervalMs;
121
108
  }
122
- #endif
123
109
 
124
110
  @synthesize description;
111
+
125
112
  @synthesize hash;
113
+
126
114
  @synthesize superclass;
127
115
 
128
116
  @end
117
+
118
+
@@ -22,19 +22,19 @@
22
22
 
23
23
  - (void)showSurveysIfAvailable;
24
24
 
25
- - (void)setOnShowHandler;
25
+ - (void)setOnShowHandler:(RCTResponseSenderBlock)callBack;
26
26
 
27
- - (void)setOnDismissHandler;
27
+ - (void)setOnDismissHandler:(RCTResponseSenderBlock)callBack;
28
28
 
29
29
  - (void)setAutoShowingEnabled:(BOOL)autoShowingSurveysEnabled;
30
30
 
31
31
  - (void)setShouldShowWelcomeScreen:(BOOL)shouldShowWelcomeScreen;
32
32
 
33
33
  - (void)hasRespondedToSurvey:(NSString *)surveyToken
34
- resolve:(RCTPromiseResolveBlock)resolve
35
- reject:(RCTPromiseRejectBlock)reject;
34
+ :(RCTPromiseResolveBlock)resolve
35
+ :(RCTPromiseRejectBlock)reject;
36
36
 
37
- - (void)getAvailableSurveys:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
37
+ - (void)getAvailableSurveys:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject;
38
38
 
39
39
  - (void)setEnabled:(BOOL)surveysEnabled;
40
40
 
@@ -1,3 +1,11 @@
1
+ //
2
+ // LuciqSurveysBridge.m
3
+ // RNLuciq
4
+ //
5
+ // Created by Salma Ali on 7/30/19.
6
+ // Copyright © 2019 luciq. All rights reserved.
7
+ //
8
+
1
9
  #import "LuciqSurveysBridge.h"
2
10
  #import <LuciqSDK/LCQSurveys.h>
3
11
  #import <asl.h>
@@ -6,13 +14,6 @@
6
14
  #import <LuciqSDK/LCQTypes.h>
7
15
  #import <React/RCTUIManager.h>
8
16
 
9
- #ifdef RCT_NEW_ARCH_ENABLED
10
- #import <RNLuciqSpec/RNLuciqSpec.h>
11
-
12
- @interface LuciqSurveysBridge () <NativeSurveysSpec>
13
- @end
14
- #endif
15
-
16
17
  @implementation LuciqSurveysBridge
17
18
 
18
19
  - (dispatch_queue_t)methodQueue {
@@ -26,9 +27,9 @@
26
27
 
27
28
  - (NSArray<NSString *> *)supportedEvents {
28
29
  return @[
29
- @"LCQWillShowSurvey",
30
- @"LCQDidDismissSurvey"
31
- ];
30
+ @"LCQWillShowSurvey",
31
+ @"LCQDidDismissSurvey"
32
+ ];
32
33
  }
33
34
 
34
35
  RCT_EXPORT_MODULE(LCQSurveys)
@@ -37,21 +38,18 @@ RCT_EXPORT_METHOD(showSurvey:(NSString *)surveyToken) {
37
38
  [LCQSurveys showSurveyWithToken:surveyToken];
38
39
  }
39
40
 
40
- RCT_EXPORT_METHOD(hasRespondedToSurvey:(NSString *)surveyToken
41
- resolve:(RCTPromiseResolveBlock)resolve
42
- reject:(RCTPromiseRejectBlock)reject) {
41
+ RCT_EXPORT_METHOD(hasRespondedToSurvey:(NSString *)surveyToken :(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
43
42
  [LCQSurveys hasRespondedToSurveyWithToken:surveyToken
44
43
  completionHandler:^(BOOL hasResponded) {
45
44
  resolve(@(hasResponded));
46
45
  }];
47
46
  }
48
47
 
49
- RCT_EXPORT_METHOD(getAvailableSurveys:(RCTPromiseResolveBlock)resolve
50
- reject:(RCTPromiseRejectBlock)reject) {
48
+ RCT_EXPORT_METHOD(getAvailableSurveys:(RCTPromiseResolveBlock)resolve :(RCTPromiseRejectBlock)reject) {
51
49
  [LCQSurveys availableSurveysWithCompletionHandler:^(NSArray<LCQSurvey *> *availableSurveys) {
52
50
  NSMutableArray<NSDictionary*>* mappedSurveys = [[NSMutableArray alloc] init];
53
51
  for (LCQSurvey* survey in availableSurveys) {
54
- [mappedSurveys addObject:@{@"title": survey.title}];
52
+ [mappedSurveys addObject:@{@"title": survey.title }];
55
53
  }
56
54
  resolve(mappedSurveys);
57
55
  }];
@@ -65,18 +63,24 @@ RCT_EXPORT_METHOD(showSurveysIfAvailable) {
65
63
  [LCQSurveys showSurveyIfAvailable];
66
64
  }
67
65
 
68
- RCT_EXPORT_METHOD(setOnShowHandler) {
69
- __weak LuciqSurveysBridge *weakSelf = self;
70
- LCQSurveys.willShowSurveyHandler = ^{
71
- [weakSelf sendEventWithName:@"LCQWillShowSurvey" body:nil];
72
- };
66
+ RCT_EXPORT_METHOD(setOnShowHandler:(RCTResponseSenderBlock)callBack) {
67
+ if (callBack != nil) {
68
+ LCQSurveys.willShowSurveyHandler = ^{
69
+ [self sendEventWithName:@"LCQWillShowSurvey" body:nil];
70
+ };
71
+ } else {
72
+ LCQSurveys.willShowSurveyHandler = ^{};
73
+ }
73
74
  }
74
75
 
75
- RCT_EXPORT_METHOD(setOnDismissHandler) {
76
- __weak LuciqSurveysBridge *weakSelf = self;
77
- LCQSurveys.didDismissSurveyHandler = ^{
78
- [weakSelf sendEventWithName:@"LCQDidDismissSurvey" body:nil];
79
- };
76
+ RCT_EXPORT_METHOD(setOnDismissHandler:(RCTResponseSenderBlock)callBack) {
77
+ if (callBack != nil) {
78
+ LCQSurveys.didDismissSurveyHandler = ^{
79
+ [self sendEventWithName:@"LCQDidDismissSurvey" body:nil];
80
+ };
81
+ } else {
82
+ LCQSurveys.didDismissSurveyHandler = ^{};
83
+ }
80
84
  }
81
85
 
82
86
  RCT_EXPORT_METHOD(setAutoShowingEnabled:(BOOL)autoShowingSurveysEnabled) {
@@ -91,16 +95,13 @@ RCT_EXPORT_METHOD(setAppStoreURL:(NSString *)appStoreURL) {
91
95
  LCQSurveys.appStoreURL = appStoreURL;
92
96
  }
93
97
 
94
- #ifdef RCT_NEW_ARCH_ENABLED
95
- - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
96
- (const facebook::react::ObjCTurboModule::InitParams &)params
97
- {
98
- return std::make_shared<facebook::react::NativeSurveysSpecJSI>(params);
99
- }
100
- #endif
101
-
102
98
  @synthesize description;
99
+
103
100
  @synthesize hash;
101
+
104
102
  @synthesize superclass;
105
103
 
106
104
  @end
105
+
106
+
107
+
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.0-44237-SNAPSHOT",
4
+ "version": "19.4.0-47504-SNAPSHOT",
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",
@@ -87,13 +87,5 @@
87
87
  "expo": {
88
88
  "optional": true
89
89
  }
90
- },
91
- "codegenConfig": {
92
- "name": "RNLuciqSpec",
93
- "type": "modules",
94
- "jsSrcsDir": "src/native/specs",
95
- "android": {
96
- "javaPackageName": "ai.luciq.reactlibrary"
97
- }
98
90
  }
99
91
  }
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+
3
+ # Generates a GitHub App installation token using openssl + curl.
4
+ # No external dependencies required.
5
+ #
6
+ # Usage: bash get-github-app-token.sh <APP_ID_ENV> <PRIVATE_KEY_ENV> <INSTALLATION_ID_ENV>
7
+ # Example: bash get-github-app-token.sh AND_LUCIQ_APP_ID AND_LUCIQ_PRIVATE_KEY AND_LUCIQ_INSTALLATION_ID
8
+ # Example: bash get-github-app-token.sh AND_INSTABUG_APP_ID AND_INSTABUG_PRIVATE_KEY AND_INSTABUG_INSTALLATION_ID
9
+
10
+ set -euo pipefail
11
+
12
+ APP_ID_ENV="${1:?Usage: $0 <APP_ID_ENV> <PRIVATE_KEY_ENV> <INSTALLATION_ID_ENV>}"
13
+ PRIVATE_KEY_ENV="${2:?Usage: $0 <APP_ID_ENV> <PRIVATE_KEY_ENV> <INSTALLATION_ID_ENV>}"
14
+ INSTALL_ID_ENV="${3:?Usage: $0 <APP_ID_ENV> <PRIVATE_KEY_ENV> <INSTALLATION_ID_ENV>}"
15
+
16
+ APP_ID="${!APP_ID_ENV:?Error: $APP_ID_ENV is not set}"
17
+ PRIVATE_KEY="${!PRIVATE_KEY_ENV:?Error: $PRIVATE_KEY_ENV is not set}"
18
+ INSTALL_ID="${!INSTALL_ID_ENV:?Error: $INSTALL_ID_ENV is not set}"
19
+
20
+ # Reconstruct PEM file from flattened env var
21
+ # CircleCI flattens multiline env vars into a single line,
22
+ # so we extract header/footer and re-wrap the base64 body at 64 chars
23
+ PEM_FILE=$(mktemp)
24
+ chmod 600 "$PEM_FILE"
25
+ trap 'rm -f "$PEM_FILE"' EXIT
26
+
27
+ BODY=$(printf '%s' "$PRIVATE_KEY" | sed 's/-----BEGIN RSA PRIVATE KEY-----//;s/-----END RSA PRIVATE KEY-----//;s/ //g')
28
+ {
29
+ echo "-----BEGIN RSA PRIVATE KEY-----"
30
+ echo "$BODY" | fold -w 64
31
+ echo "-----END RSA PRIVATE KEY-----"
32
+ } > "$PEM_FILE"
33
+
34
+ # Base64url encode (RFC 4648): replace +/ with -_, strip =
35
+ b64url() {
36
+ openssl base64 -A | tr '+/' '-_' | tr -d '='
37
+ }
38
+
39
+ NOW=$(date +%s)
40
+ IAT=$((NOW - 60)) # 60s clock skew allowance per GitHub docs
41
+ EXP=$((NOW + 600)) # 10min max JWT lifetime per GitHub docs
42
+
43
+ # Create JWT header and payload
44
+ HEADER=$(printf '{"alg":"RS256","typ":"JWT"}' | b64url)
45
+ PAYLOAD=$(printf '{"iat":%d,"exp":%d,"iss":"%s"}' "$IAT" "$EXP" "$APP_ID" | b64url)
46
+
47
+ # Sign with RSA-SHA256
48
+ SIGNATURE=$(printf '%s.%s' "$HEADER" "$PAYLOAD" | openssl dgst -sha256 -sign "$PEM_FILE" -binary | b64url)
49
+
50
+ JWT_TOKEN="${HEADER}.${PAYLOAD}.${SIGNATURE}"
51
+
52
+ # Exchange JWT for installation token
53
+ RESPONSE=$(curl -sf -X POST \
54
+ -H "Authorization: Bearer $JWT_TOKEN" \
55
+ -H "Accept: application/vnd.github+json" \
56
+ -H "X-GitHub-Api-Version: 2022-11-28" \
57
+ "https://api.github.com/app/installations/${INSTALL_ID}/access_tokens") || {
58
+ echo "Error: GitHub API request failed (HTTP error)" >&2
59
+ exit 1
60
+ }
61
+
62
+ TOKEN=$(echo "$RESPONSE" | jq -r '.token // empty')
63
+
64
+ if [ -z "$TOKEN" ]; then
65
+ ERROR_MSG=$(echo "$RESPONSE" | jq -r '.message // "unknown error"')
66
+ echo "Error: Failed to get installation token: $ERROR_MSG" >&2
67
+ exit 1
68
+ fi
69
+
70
+ echo "$TOKEN"
@@ -1,15 +1,24 @@
1
1
  #!/bin/bash
2
2
 
3
+ set -euo pipefail
4
+
3
5
  pr_url="https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls?head=$CIRCLE_PROJECT_USERNAME:$CIRCLE_BRANCH&state=open"
4
6
  pr_response=$(curl --location --request GET "$pr_url" --header "Authorization: Bearer $RELEASE_GITHUB_TOKEN")
5
7
 
6
- if [ $(echo "$pr_response" | jq length) -eq 0 ]; then
7
- echo "No PR found to update"
8
- else
9
- pr_comment_url=$(echo "$pr_response" | jq -r ".[]._links.comments.href")
8
+ if ! echo "$pr_response" | jq -e 'type == "array"' >/dev/null; then
9
+ echo "Unexpected GitHub API response (not an array):"
10
+ echo "$pr_response"
11
+ exit 1
12
+ fi
10
13
 
11
- curl --location --request POST "$pr_comment_url" \
12
- --header 'Content-Type: application/json' \
13
- --header "Authorization: Bearer $RELEASE_GITHUB_TOKEN" \
14
- --data-raw "$1"
14
+ if [ "$(echo "$pr_response" | jq length)" -eq 0 ]; then
15
+ echo "No PR found to update"
16
+ exit 0
15
17
  fi
18
+
19
+ pr_comment_url=$(echo "$pr_response" | jq -r ".[]._links.comments.href")
20
+
21
+ curl --location --request POST "$pr_comment_url" \
22
+ --header 'Content-Type: application/json' \
23
+ --header "Authorization: Bearer $RELEASE_GITHUB_TOKEN" \
24
+ --data-raw "$1"
@@ -47,7 +47,7 @@ export const setOptions = (options: InvocationOption[]) => {
47
47
  */
48
48
  export const onInvokeHandler = (handler: () => void) => {
49
49
  emitter.addListener(NativeEvents.ON_INVOKE_HANDLER, handler);
50
- NativeBugReporting.setOnInvokeHandler();
50
+ NativeBugReporting.setOnInvokeHandler(handler);
51
51
  };
52
52
 
53
53
  /**
@@ -62,7 +62,7 @@ export const onSDKDismissedHandler = (
62
62
  emitter.addListener(NativeEvents.ON_DISMISS_HANDLER, (payload) => {
63
63
  handler(payload.dismissType, payload.reportType);
64
64
  });
65
- NativeBugReporting.setOnSDKDismissedHandler();
65
+ NativeBugReporting.setOnSDKDismissedHandler(handler);
66
66
  };
67
67
 
68
68
  /**
@@ -198,7 +198,7 @@ export const setDidSelectPromptOptionHandler = (handler: (promptOption: string)
198
198
  emitter.addListener(NativeEvents.DID_SELECT_PROMPT_OPTION_HANDLER, (payload) => {
199
199
  handler(payload.promptOption);
200
200
  });
201
- NativeBugReporting.setDidSelectPromptOptionHandler();
201
+ NativeBugReporting.setDidSelectPromptOptionHandler(handler);
202
202
  };
203
203
 
204
204
  /**
@@ -10,7 +10,7 @@ import type { NavigationAction, NavigationState as NavigationStateV4 } from 'rea
10
10
  import type { LuciqConfig } from '../models/LuciqConfig';
11
11
  import Report from '../models/Report';
12
12
  import { emitter, NativeEvents, NativeLuciq } from '../native/NativeLuciq';
13
- import { registerFeatureFlagsListener } from '../utils/FeatureFlags';
13
+ import { registerFeatureFlagsListener, initFeatureFlagsCache } from '../utils/FeatureFlags';
14
14
  import {
15
15
  AutoMaskingType,
16
16
  ColorTheme,
@@ -81,6 +81,8 @@ function reportCurrentViewForAndroid(screenName: string | null) {
81
81
  * @param config SDK configurations. See {@link LuciqConfig} for more info.
82
82
  */
83
83
  export const init = (config: LuciqConfig) => {
84
+ initFeatureFlagsCache();
85
+
84
86
  if (Platform.OS === 'android') {
85
87
  // Add android feature flags listener for android
86
88
  registerFeatureFlagsListener();
@@ -753,7 +755,7 @@ export const onReportSubmitHandler = (handler?: (report: Report) => void) => {
753
755
  handler && handler(reportObj);
754
756
  });
755
757
 
756
- NativeLuciq.setPreSendingHandler();
758
+ NativeLuciq.setPreSendingHandler(handler);
757
759
  };
758
760
 
759
761
  export const onNavigationStateChange = (
@@ -39,10 +39,17 @@ function getPortFromUrl(url: string) {
39
39
  * It is enabled by default.
40
40
  * @param isEnabled
41
41
  */
42
+ const NET_TAG = 'LCQ-RN-NET:';
43
+
42
44
  export const setEnabled = (isEnabled: boolean) => {
43
45
  if (isEnabled) {
44
46
  xhr.enableInterception();
45
47
  xhr.setOnDoneCallback(async (network) => {
48
+ Logger.debug(
49
+ NET_TAG,
50
+ `[NetworkLogger] onDoneCallback received: ${network.method} ${network.url}, status=${network.responseCode}`,
51
+ );
52
+
46
53
  // eslint-disable-next-line no-new-func
47
54
  const predicate = Function('network', 'return ' + _requestFilterExpression);
48
55
 
@@ -50,12 +57,17 @@ export const setEnabled = (isEnabled: boolean) => {
50
57
  const MAX_NETWORK_BODY_SIZE_IN_BYTES = await NativeLuciq.getNetworkBodyMaxSize();
51
58
  try {
52
59
  if (_networkDataObfuscationHandler) {
60
+ Logger.debug(NET_TAG, `[NetworkLogger] Running obfuscation handler for ${network.url}`);
53
61
  network = await _networkDataObfuscationHandler(network);
54
62
  }
55
63
 
56
64
  if (__DEV__) {
57
65
  const urlPort = getPortFromUrl(network.url);
58
66
  if (urlPort === LuciqRNConfig.metroDevServerPort) {
67
+ Logger.debug(
68
+ NET_TAG,
69
+ `[NetworkLogger] Skipping Metro dev server request: ${network.url}`,
70
+ );
59
71
  return;
60
72
  }
61
73
  }
@@ -97,10 +109,23 @@ export const setEnabled = (isEnabled: boolean) => {
97
109
  );
98
110
  }
99
111
 
112
+ Logger.debug(
113
+ NET_TAG,
114
+ `[NetworkLogger] Reporting network log to native: ${network.method} ${network.url}`,
115
+ );
100
116
  reportNetworkLog(network);
101
117
  } catch (e) {
102
- Logger.error(e);
118
+ Logger.error(
119
+ NET_TAG,
120
+ `[NetworkLogger] Error processing network log for ${network.url}:`,
121
+ e,
122
+ );
103
123
  }
124
+ } else {
125
+ Logger.debug(
126
+ NET_TAG,
127
+ `[NetworkLogger] Request filtered out by predicate: ${network.method} ${network.url}, expression="${_requestFilterExpression}"`,
128
+ );
104
129
  }
105
130
  });
106
131
  } else {
@@ -32,7 +32,7 @@ export const show = () => {
32
32
  */
33
33
  export const setOnNewReplyReceivedHandler = (handler: () => void) => {
34
34
  emitter.addListener(NativeEvents.ON_REPLY_RECEIVED_HANDLER, handler);
35
- NativeReplies.setOnNewReplyReceivedHandler();
35
+ NativeReplies.setOnNewReplyReceivedHandler(handler);
36
36
  };
37
37
 
38
38
  /**
@@ -55,7 +55,7 @@ export const setAutoShowingEnabled = (autoShowingSurveysEnabled: boolean) => {
55
55
  */
56
56
  export const setOnShowHandler = (onShowHandler: () => void) => {
57
57
  emitter.addListener(NativeEvents.WILL_SHOW_SURVEY_HANDLER, onShowHandler);
58
- NativeSurveys.setOnShowHandler();
58
+ NativeSurveys.setOnShowHandler(onShowHandler);
59
59
  };
60
60
 
61
61
  /**
@@ -67,7 +67,7 @@ export const setOnShowHandler = (onShowHandler: () => void) => {
67
67
  */
68
68
  export const setOnDismissHandler = (onDismissHandler: () => void) => {
69
69
  emitter.addListener(NativeEvents.DID_DISMISS_SURVEY_HANDLER, onDismissHandler);
70
- NativeSurveys.setOnDismissHandler();
70
+ NativeSurveys.setOnDismissHandler(onDismissHandler);
71
71
  };
72
72
 
73
73
  /**
@@ -1,6 +1,7 @@
1
1
  import { NativeEventEmitter, NativeModule } from 'react-native';
2
2
 
3
3
  import type {
4
+ DismissType,
4
5
  ExtendedBugReportMode,
5
6
  FloatingButtonPosition,
6
7
  InvocationEvent,
@@ -43,9 +44,11 @@ export interface BugReportingNativeModule extends NativeModule {
43
44
  setShakingThresholdForAndroid(threshold: number): void;
44
45
 
45
46
  // Callbacks //
46
- setOnInvokeHandler(): void;
47
- setDidSelectPromptOptionHandler(): void;
48
- setOnSDKDismissedHandler(): void;
47
+ setOnInvokeHandler(handler: () => void): void;
48
+ setDidSelectPromptOptionHandler(handler: (promptOption: string) => void): void;
49
+ setOnSDKDismissedHandler(
50
+ handler: (dismissType: DismissType, reportType: ReportType) => void,
51
+ ): void;
49
52
 
50
53
  addUserConsent(
51
54
  key: string,
@@ -23,10 +23,10 @@ export interface CauseCrashData {
23
23
  }
24
24
  export interface CrashReportingNativeModule extends NativeModule {
25
25
  setEnabled(isEnabled: boolean): void;
26
- sendJSCrash(data: CrashData): Promise<void>;
26
+ sendJSCrash(data: CrashData | string): Promise<void>;
27
27
 
28
28
  sendHandledJSCrash(
29
- data: CrashData,
29
+ data: CrashData | string,
30
30
  userAttributes?: Record<string, string> | null,
31
31
  fingerprint?: string | null,
32
32
  nonFatalExceptionLevel?: NonFatalErrorLevel | null,
@@ -1,5 +1,6 @@
1
1
  import { NativeEventEmitter, NativeModule, ProcessedColorValue } from 'react-native';
2
2
 
3
+ import type Report from '../models/Report';
3
4
  import type {
4
5
  AutoMaskingType,
5
6
  ColorTheme,
@@ -137,7 +138,7 @@ export interface LuciqNativeModule extends NativeModule {
137
138
  setFileAttachment(filePath: string, fileName?: string): void;
138
139
 
139
140
  // Report APIs //
140
- setPreSendingHandler(): void;
141
+ setPreSendingHandler(handler?: (report: Report) => void): void;
141
142
  appendTagToReport(tag: string): void;
142
143
  appendConsoleLogToReport(consoleLog: string): void;
143
144
  setUserAttributeToReport(key: string, value: string): void;
@@ -160,7 +161,7 @@ export interface LuciqNativeModule extends NativeModule {
160
161
  // Feature Flags Listener for Android
161
162
  registerFeatureFlagsChangeListener(): void;
162
163
 
163
- setOnFeaturesUpdatedListener(): void; // android only
164
+ setOnFeaturesUpdatedListener(handler?: (params: any) => void): void; // android only
164
165
  enableAutoMasking(autoMaskingTypes: AutoMaskingType[]): void;
165
166
  getNetworkBodyMaxSize(): Promise<number>;
166
167
 
@@ -1,4 +1,4 @@
1
- import { NativeModules as ReactNativeModules, TurboModuleRegistry } from 'react-native';
1
+ import { NativeModules as ReactNativeModules } from 'react-native';
2
2
 
3
3
  import type { ApmNativeModule } from './NativeAPM';
4
4
  import type { BugReportingNativeModule } from './NativeBugReporting';
@@ -9,15 +9,6 @@ import type { RepliesNativeModule } from './NativeReplies';
9
9
  import type { SurveysNativeModule } from './NativeSurveys';
10
10
  import type { SessionReplayNativeModule } from './NativeSessionReplay';
11
11
  import type { NetworkLoggerNativeModule } from './NativeNetworkLogger';
12
- import type { Spec as ApmSpec } from './specs/NativeAPM';
13
- import type { Spec as BugReportingSpec } from './specs/NativeBugReporting';
14
- import type { Spec as CrashReportingSpec } from './specs/NativeCrashReporting';
15
- import type { Spec as FeatureRequestsSpec } from './specs/NativeFeatureRequests';
16
- import type { Spec as LuciqSpec } from './specs/NativeLuciq';
17
- import type { Spec as NetworkLoggerSpec } from './specs/NativeNetworkLogger';
18
- import type { Spec as RepliesSpec } from './specs/NativeReplies';
19
- import type { Spec as SessionReplaySpec } from './specs/NativeSessionReplay';
20
- import type { Spec as SurveysSpec } from './specs/NativeSurveys';
21
12
 
22
13
  export interface LuciqNativePackage {
23
14
  LCQAPM: ApmNativeModule;
@@ -31,45 +22,4 @@ export interface LuciqNativePackage {
31
22
  LCQNetworkLogger: NetworkLoggerNativeModule;
32
23
  }
33
24
 
34
- const legacy = ReactNativeModules as LuciqNativePackage;
35
-
36
- function resolve<TSpec, TLegacy>(name: string, fallback: TLegacy): TLegacy {
37
- return (TurboModuleRegistry.get<TSpec & object>(name) as unknown as TLegacy | null) ?? fallback;
38
- }
39
-
40
- const LCQAPM = resolve<ApmSpec, ApmNativeModule>('LCQAPM', legacy.LCQAPM);
41
- const LCQBugReporting = resolve<BugReportingSpec, BugReportingNativeModule>(
42
- 'LCQBugReporting',
43
- legacy.LCQBugReporting,
44
- );
45
- const LCQCrashReporting = resolve<CrashReportingSpec, CrashReportingNativeModule>(
46
- 'LCQCrashReporting',
47
- legacy.LCQCrashReporting,
48
- );
49
- const LCQFeatureRequests = resolve<FeatureRequestsSpec, FeatureRequestsNativeModule>(
50
- 'LCQFeatureRequests',
51
- legacy.LCQFeatureRequests,
52
- );
53
- const Luciq = resolve<LuciqSpec, LuciqNativeModule>('Luciq', legacy.Luciq);
54
- const LCQReplies = resolve<RepliesSpec, RepliesNativeModule>('LCQReplies', legacy.LCQReplies);
55
- const LCQSurveys = resolve<SurveysSpec, SurveysNativeModule>('LCQSurveys', legacy.LCQSurveys);
56
- const LCQSessionReplay = resolve<SessionReplaySpec, SessionReplayNativeModule>(
57
- 'LCQSessionReplay',
58
- legacy.LCQSessionReplay,
59
- );
60
- const LCQNetworkLogger = resolve<NetworkLoggerSpec, NetworkLoggerNativeModule>(
61
- 'LCQNetworkLogger',
62
- legacy.LCQNetworkLogger,
63
- );
64
-
65
- export const NativeModules: LuciqNativePackage = {
66
- LCQAPM,
67
- LCQBugReporting,
68
- LCQCrashReporting,
69
- LCQFeatureRequests,
70
- Luciq,
71
- LCQReplies,
72
- LCQSurveys,
73
- LCQSessionReplay,
74
- LCQNetworkLogger,
75
- };
25
+ export const NativeModules = ReactNativeModules as LuciqNativePackage;
@@ -10,7 +10,7 @@ export interface RepliesNativeModule extends NativeModule {
10
10
  getUnreadRepliesCount(): Promise<number>;
11
11
 
12
12
  // Callbacks //
13
- setOnNewReplyReceivedHandler(): void;
13
+ setOnNewReplyReceivedHandler(handler: () => void): void;
14
14
 
15
15
  // Notifications APIs //
16
16
  setPushNotificationsEnabled(isEnabled: boolean): void;