@luciq/react-native 18.0.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.
Files changed (239) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/FONTS_SETUP_GUIDE.md +521 -0
  3. package/Gemfile +1 -0
  4. package/Gemfile.lock +11 -0
  5. package/LICENSE +21 -0
  6. package/README.md +148 -0
  7. package/RNLuciq.podspec +21 -0
  8. package/android/build.gradle +88 -0
  9. package/android/gradle.properties +4 -0
  10. package/android/jacoco.gradle +52 -0
  11. package/android/native.gradle +7 -0
  12. package/android/proguard-rules.txt +1 -0
  13. package/android/sourcemaps.gradle +255 -0
  14. package/android/src/main/AndroidManifest.xml +4 -0
  15. package/android/src/main/java/ai/luciq/reactlibrary/ArgsRegistry.java +278 -0
  16. package/android/src/main/java/ai/luciq/reactlibrary/Constants.java +20 -0
  17. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciq.java +328 -0
  18. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +392 -0
  19. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqBugReportingModule.java +444 -0
  20. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqCrashReportingModule.java +169 -0
  21. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsModule.java +98 -0
  22. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +195 -0
  23. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +1611 -0
  24. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativePackage.java +41 -0
  25. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqRepliesModule.java +298 -0
  26. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSessionReplayModule.java +213 -0
  27. package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSurveysModule.java +237 -0
  28. package/android/src/main/java/ai/luciq/reactlibrary/utils/ArrayUtil.java +167 -0
  29. package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +35 -0
  30. package/android/src/main/java/ai/luciq/reactlibrary/utils/LuciqUtil.java +58 -0
  31. package/android/src/main/java/ai/luciq/reactlibrary/utils/MainThreadHandler.java +13 -0
  32. package/android/src/main/java/ai/luciq/reactlibrary/utils/MapUtil.java +171 -0
  33. package/android/src/main/java/ai/luciq/reactlibrary/utils/RNTouchedViewExtractor.java +167 -0
  34. package/android/src/main/java/ai/luciq/reactlibrary/utils/ReportUtil.java +67 -0
  35. package/app.plugin.js +1 -0
  36. package/babel.config.js +3 -0
  37. package/bin/commands/MigrateCommand.d.ts +6 -0
  38. package/bin/commands/UploadEasUpdatesSourcemaps.d.ts +2 -0
  39. package/bin/commands/UploadSoFiles.d.ts +6 -0
  40. package/bin/commands/UploadSourcemaps.d.ts +2 -0
  41. package/bin/config/migration-config.json +125 -0
  42. package/bin/index.d.ts +2 -0
  43. package/bin/index.js +19179 -0
  44. package/bin/upload/index.d.ts +4 -0
  45. package/bin/upload/migrate.d.ts +14 -0
  46. package/bin/upload/uploadEasUpdatesSourcemaps.d.ts +21 -0
  47. package/bin/upload/uploadSoFiles.d.ts +21 -0
  48. package/bin/upload/uploadSourcemaps.d.ts +21 -0
  49. package/cli/commands/MigrateCommand.ts +32 -0
  50. package/cli/commands/UploadEasUpdatesSourcemaps.ts +34 -0
  51. package/cli/commands/UploadSoFiles.ts +38 -0
  52. package/cli/commands/UploadSourcemaps.ts +40 -0
  53. package/cli/config/migration-config.json +125 -0
  54. package/cli/index.ts +21 -0
  55. package/cli/upload/index.ts +4 -0
  56. package/cli/upload/migrate.ts +271 -0
  57. package/cli/upload/uploadEasUpdatesSourcemaps.ts +74 -0
  58. package/cli/upload/uploadSoFiles.ts +112 -0
  59. package/cli/upload/uploadSourcemaps.ts +73 -0
  60. package/dangerfile.ts +44 -0
  61. package/dist/index.d.ts +19 -0
  62. package/dist/index.js +14 -0
  63. package/dist/models/FeatureFlag.d.ts +11 -0
  64. package/dist/models/FeatureFlag.js +1 -0
  65. package/dist/models/LuciqConfig.d.ts +42 -0
  66. package/dist/models/LuciqConfig.js +1 -0
  67. package/dist/models/NonFatalOptions.d.ts +15 -0
  68. package/dist/models/NonFatalOptions.js +1 -0
  69. package/dist/models/OverAirUpdate.d.ts +12 -0
  70. package/dist/models/OverAirUpdate.js +1 -0
  71. package/dist/models/Report.d.ts +70 -0
  72. package/dist/models/Report.js +109 -0
  73. package/dist/models/ReproConfig.d.ts +27 -0
  74. package/dist/models/ReproConfig.js +1 -0
  75. package/dist/models/SessionMetadata.d.ts +55 -0
  76. package/dist/models/SessionMetadata.js +1 -0
  77. package/dist/models/ThemeConfig.d.ts +27 -0
  78. package/dist/models/ThemeConfig.js +1 -0
  79. package/dist/models/W3cExternalTraceAttributes.d.ts +22 -0
  80. package/dist/models/W3cExternalTraceAttributes.js +1 -0
  81. package/dist/modules/APM.d.ts +77 -0
  82. package/dist/modules/APM.js +104 -0
  83. package/dist/modules/BugReporting.d.ts +138 -0
  84. package/dist/modules/BugReporting.js +202 -0
  85. package/dist/modules/CrashReporting.d.ts +19 -0
  86. package/dist/modules/CrashReporting.js +40 -0
  87. package/dist/modules/FeatureRequests.d.ts +20 -0
  88. package/dist/modules/FeatureRequests.js +28 -0
  89. package/dist/modules/Luciq.d.ts +362 -0
  90. package/dist/modules/Luciq.js +797 -0
  91. package/dist/modules/NetworkLogger.d.ts +52 -0
  92. package/dist/modules/NetworkLogger.js +208 -0
  93. package/dist/modules/Replies.d.ts +78 -0
  94. package/dist/modules/Replies.js +121 -0
  95. package/dist/modules/SessionReplay.d.ts +78 -0
  96. package/dist/modules/SessionReplay.js +98 -0
  97. package/dist/modules/Surveys.d.ts +75 -0
  98. package/dist/modules/Surveys.js +101 -0
  99. package/dist/native/NativeAPM.d.ts +18 -0
  100. package/dist/native/NativeAPM.js +4 -0
  101. package/dist/native/NativeBugReporting.d.ts +32 -0
  102. package/dist/native/NativeBugReporting.js +10 -0
  103. package/dist/native/NativeConstants.d.ts +182 -0
  104. package/dist/native/NativeConstants.js +1 -0
  105. package/dist/native/NativeCrashReporting.d.ts +18 -0
  106. package/dist/native/NativeCrashReporting.js +2 -0
  107. package/dist/native/NativeFeatureRequests.d.ts +8 -0
  108. package/dist/native/NativeFeatureRequests.js +2 -0
  109. package/dist/native/NativeLuciq.d.ts +86 -0
  110. package/dist/native/NativeLuciq.js +10 -0
  111. package/dist/native/NativeNetworkLogger.d.ts +21 -0
  112. package/dist/native/NativeNetworkLogger.js +14 -0
  113. package/dist/native/NativePackage.d.ts +21 -0
  114. package/dist/native/NativePackage.js +2 -0
  115. package/dist/native/NativeReplies.d.ts +21 -0
  116. package/dist/native/NativeReplies.js +8 -0
  117. package/dist/native/NativeSessionReplay.d.ts +16 -0
  118. package/dist/native/NativeSessionReplay.js +8 -0
  119. package/dist/native/NativeSurveys.d.ts +22 -0
  120. package/dist/native/NativeSurveys.js +9 -0
  121. package/dist/utils/AppStatesHandler.d.ts +3 -0
  122. package/dist/utils/AppStatesHandler.js +16 -0
  123. package/dist/utils/Enums.d.ts +244 -0
  124. package/dist/utils/Enums.js +266 -0
  125. package/dist/utils/FeatureFlags.d.ts +7 -0
  126. package/dist/utils/FeatureFlags.js +24 -0
  127. package/dist/utils/LuciqConstants.d.ts +14 -0
  128. package/dist/utils/LuciqConstants.js +15 -0
  129. package/dist/utils/LuciqUtils.d.ts +97 -0
  130. package/dist/utils/LuciqUtils.js +301 -0
  131. package/dist/utils/UnhandledRejectionTracking.d.ts +9 -0
  132. package/dist/utils/UnhandledRejectionTracking.js +99 -0
  133. package/dist/utils/XhrNetworkInterceptor.d.ts +39 -0
  134. package/dist/utils/XhrNetworkInterceptor.js +253 -0
  135. package/dist/utils/config.d.ts +5 -0
  136. package/dist/utils/config.js +6 -0
  137. package/dist/utils/logger.d.ts +10 -0
  138. package/dist/utils/logger.js +39 -0
  139. package/expo.d.ts +1 -0
  140. package/expo.js +1 -0
  141. package/ios/RNLuciq/ArgsRegistry.h +32 -0
  142. package/ios/RNLuciq/ArgsRegistry.m +276 -0
  143. package/ios/RNLuciq/LuciqAPMBridge.h +26 -0
  144. package/ios/RNLuciq/LuciqAPMBridge.m +99 -0
  145. package/ios/RNLuciq/LuciqBugReportingBridge.h +60 -0
  146. package/ios/RNLuciq/LuciqBugReportingBridge.m +241 -0
  147. package/ios/RNLuciq/LuciqCrashReportingBridge.h +18 -0
  148. package/ios/RNLuciq/LuciqCrashReportingBridge.m +68 -0
  149. package/ios/RNLuciq/LuciqFeatureRequestsBridge.h +30 -0
  150. package/ios/RNLuciq/LuciqFeatureRequestsBridge.m +61 -0
  151. package/ios/RNLuciq/LuciqNetworkLoggerBridge.h +44 -0
  152. package/ios/RNLuciq/LuciqNetworkLoggerBridge.m +206 -0
  153. package/ios/RNLuciq/LuciqReactBridge.h +151 -0
  154. package/ios/RNLuciq/LuciqReactBridge.m +548 -0
  155. package/ios/RNLuciq/LuciqRepliesBridge.h +40 -0
  156. package/ios/RNLuciq/LuciqRepliesBridge.m +80 -0
  157. package/ios/RNLuciq/LuciqSessionReplayBridge.h +32 -0
  158. package/ios/RNLuciq/LuciqSessionReplayBridge.m +107 -0
  159. package/ios/RNLuciq/LuciqSurveysBridge.h +46 -0
  160. package/ios/RNLuciq/LuciqSurveysBridge.m +107 -0
  161. package/ios/RNLuciq/RCTConvert+LuciqEnums.h +18 -0
  162. package/ios/RNLuciq/RCTConvert+LuciqEnums.m +127 -0
  163. package/ios/RNLuciq/RNLuciq.h +35 -0
  164. package/ios/RNLuciq/RNLuciq.m +107 -0
  165. package/ios/RNLuciq/Util/LCQAPM+PrivateAPIs.h +15 -0
  166. package/ios/RNLuciq/Util/LCQCrashReporting+CP.h +13 -0
  167. package/ios/RNLuciq/Util/LCQNetworkLogger+CP.h +68 -0
  168. package/ios/RNLuciq/Util/Luciq+CP.h +12 -0
  169. package/ios/RNLuciq.xcodeproj/project.pbxproj +352 -0
  170. package/ios/native.rb +12 -0
  171. package/ios/sourcemaps.sh +120 -0
  172. package/migrate.js +569 -0
  173. package/package.json +92 -0
  174. package/plugin/build/index.js +42078 -0
  175. package/plugin/src/index.ts +5 -0
  176. package/plugin/src/pluginProps.ts +6 -0
  177. package/plugin/src/withLuciq.ts +51 -0
  178. package/plugin/src/withLuciqAndroid.ts +99 -0
  179. package/plugin/src/withLuciqIOS.ts +109 -0
  180. package/plugin/tsconfig.json +7 -0
  181. package/react-native.config.js +16 -0
  182. package/scripts/customize-ios-endpoints.sh +28 -0
  183. package/scripts/dream-11-delete-unused-features.sh +62 -0
  184. package/scripts/find-token.js +58 -0
  185. package/scripts/find-token.sh +70 -0
  186. package/scripts/notify-github.sh +15 -0
  187. package/scripts/replace.js +58 -0
  188. package/scripts/snapshot-comment.md +15 -0
  189. package/scripts/snapshot-version.sh +11 -0
  190. package/src/index.ts +40 -0
  191. package/src/models/FeatureFlag.ts +12 -0
  192. package/src/models/LuciqConfig.ts +48 -0
  193. package/src/models/NonFatalOptions.ts +16 -0
  194. package/src/models/OverAirUpdate.ts +14 -0
  195. package/src/models/Report.ts +124 -0
  196. package/src/models/ReproConfig.ts +31 -0
  197. package/src/models/SessionMetadata.ts +57 -0
  198. package/src/models/ThemeConfig.ts +34 -0
  199. package/src/models/W3cExternalTraceAttributes.ts +22 -0
  200. package/src/modules/APM.ts +117 -0
  201. package/src/modules/BugReporting.ts +254 -0
  202. package/src/modules/CrashReporting.ts +54 -0
  203. package/src/modules/FeatureRequests.ts +32 -0
  204. package/src/modules/Luciq.ts +934 -0
  205. package/src/modules/NetworkLogger.ts +270 -0
  206. package/src/modules/Replies.ts +137 -0
  207. package/src/modules/SessionReplay.ts +111 -0
  208. package/src/modules/Surveys.ts +118 -0
  209. package/src/native/NativeAPM.ts +51 -0
  210. package/src/native/NativeBugReporting.ts +70 -0
  211. package/src/native/NativeConstants.ts +215 -0
  212. package/src/native/NativeCrashReporting.ts +29 -0
  213. package/src/native/NativeFeatureRequests.ts +12 -0
  214. package/src/native/NativeLuciq.ts +179 -0
  215. package/src/native/NativeNetworkLogger.ts +42 -0
  216. package/src/native/NativePackage.ts +25 -0
  217. package/src/native/NativeReplies.ts +34 -0
  218. package/src/native/NativeSessionReplay.ts +21 -0
  219. package/src/native/NativeSurveys.ts +34 -0
  220. package/src/promise.d.ts +11 -0
  221. package/src/utils/AppStatesHandler.ts +19 -0
  222. package/src/utils/Enums.ts +266 -0
  223. package/src/utils/FeatureFlags.ts +33 -0
  224. package/src/utils/LuciqConstants.ts +24 -0
  225. package/src/utils/LuciqUtils.ts +417 -0
  226. package/src/utils/UnhandledRejectionTracking.ts +118 -0
  227. package/src/utils/XhrNetworkInterceptor.ts +333 -0
  228. package/src/utils/config.ts +7 -0
  229. package/src/utils/logger.ts +54 -0
  230. package/tsconfig.json +32 -0
  231. package/tsconfig.test.json +4 -0
  232. package/tsconfig.upload.json +10 -0
  233. package/upload/index.d.ts +4 -0
  234. package/upload/index.js +17314 -0
  235. package/upload/migrate.d.ts +14 -0
  236. package/upload/package.json +5 -0
  237. package/upload/uploadEasUpdatesSourcemaps.d.ts +21 -0
  238. package/upload/uploadSoFiles.d.ts +21 -0
  239. package/upload/uploadSourcemaps.d.ts +21 -0
@@ -0,0 +1,333 @@
1
+ import LuciqConstants from './LuciqConstants';
2
+ import { stringifyIfNotString, generateW3CHeader } from './LuciqUtils';
3
+
4
+ import { FeatureFlags } from '../utils/FeatureFlags';
5
+
6
+ export type ProgressCallback = (totalBytesSent: number, totalBytesExpectedToSend: number) => void;
7
+ export type NetworkDataCallback = (data: NetworkData) => void;
8
+
9
+ export interface NetworkData {
10
+ readonly id: string;
11
+ url: string;
12
+ method: string;
13
+ requestBody: string;
14
+ requestBodySize: number;
15
+ responseBody: string | null;
16
+ responseBodySize: number;
17
+ responseCode: number;
18
+ requestHeaders: Record<string, string>;
19
+ responseHeaders: Record<string, string>;
20
+ contentType: string;
21
+ errorDomain: string;
22
+ errorCode: number;
23
+ startTime: number;
24
+ duration: number;
25
+ gqlQueryName?: string;
26
+ serverErrorMessage: string;
27
+ requestContentType: string;
28
+ isW3cHeaderFound: boolean | null;
29
+ partialId: number | null;
30
+ networkStartTimeInSeconds: number | null;
31
+ w3cGeneratedHeader: string | null;
32
+ w3cCaughtHeader: string | null;
33
+ }
34
+
35
+ const XMLHttpRequest = global.XMLHttpRequest;
36
+ let originalXHROpen = XMLHttpRequest.prototype.open;
37
+ let originalXHRSend = XMLHttpRequest.prototype.send;
38
+ let originalXHRSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
39
+
40
+ let onProgressCallback: ProgressCallback | null;
41
+ let onDoneCallback: NetworkDataCallback | null;
42
+ let isInterceptorEnabled = false;
43
+ let network: NetworkData;
44
+
45
+ const _reset = () => {
46
+ network = {
47
+ id: '',
48
+ url: '',
49
+ method: '',
50
+ requestBody: '',
51
+ requestBodySize: 0,
52
+ responseBody: '',
53
+ responseBodySize: 0,
54
+ responseCode: 0,
55
+ requestHeaders: {},
56
+ responseHeaders: {},
57
+ contentType: '',
58
+ errorDomain: '',
59
+ errorCode: 0,
60
+ startTime: 0,
61
+ duration: 0,
62
+ gqlQueryName: '',
63
+ serverErrorMessage: '',
64
+ requestContentType: '',
65
+ isW3cHeaderFound: null,
66
+ partialId: null,
67
+ networkStartTimeInSeconds: null,
68
+ w3cGeneratedHeader: null,
69
+ w3cCaughtHeader: null,
70
+ };
71
+ };
72
+ const getTraceparentHeader = async (networkData: NetworkData) => {
73
+ const [
74
+ isW3cExternalTraceIDEnabled,
75
+ isW3cExternalGeneratedHeaderEnabled,
76
+ isW3cCaughtHeaderEnabled,
77
+ ] = await Promise.all([
78
+ FeatureFlags.isW3ExternalTraceID(),
79
+ FeatureFlags.isW3ExternalGeneratedHeader(),
80
+ FeatureFlags.isW3CaughtHeader(),
81
+ ]);
82
+
83
+ return injectHeaders(networkData, {
84
+ isW3cExternalTraceIDEnabled,
85
+ isW3cExternalGeneratedHeaderEnabled,
86
+ isW3cCaughtHeaderEnabled,
87
+ });
88
+ };
89
+
90
+ export const injectHeaders = (
91
+ networkData: NetworkData,
92
+ featureFlags: {
93
+ isW3cExternalTraceIDEnabled: boolean;
94
+ isW3cExternalGeneratedHeaderEnabled: boolean;
95
+ isW3cCaughtHeaderEnabled: boolean;
96
+ },
97
+ ) => {
98
+ const {
99
+ isW3cExternalTraceIDEnabled,
100
+ isW3cExternalGeneratedHeaderEnabled,
101
+ isW3cCaughtHeaderEnabled,
102
+ } = featureFlags;
103
+
104
+ if (!isW3cExternalTraceIDEnabled) {
105
+ return;
106
+ }
107
+
108
+ const isHeaderFound = networkData.requestHeaders.traceparent != null;
109
+
110
+ networkData.isW3cHeaderFound = isHeaderFound;
111
+
112
+ const injectionMethodology = isHeaderFound
113
+ ? identifyCaughtHeader(networkData, isW3cCaughtHeaderEnabled)
114
+ : injectGeneratedData(networkData, isW3cExternalGeneratedHeaderEnabled);
115
+ return injectionMethodology;
116
+ };
117
+
118
+ const identifyCaughtHeader = (networkData: NetworkData, isW3cCaughtHeaderEnabled: boolean) => {
119
+ if (isW3cCaughtHeaderEnabled) {
120
+ networkData.w3cCaughtHeader = networkData.requestHeaders.traceparent;
121
+ return networkData.requestHeaders.traceparent;
122
+ }
123
+ return;
124
+ };
125
+
126
+ const injectGeneratedData = (
127
+ networkData: NetworkData,
128
+ isW3cExternalGeneratedHeaderEnabled: boolean,
129
+ ) => {
130
+ const { timestampInSeconds, partialId, w3cHeader } = generateW3CHeader(networkData.startTime);
131
+ networkData.partialId = partialId;
132
+ networkData.networkStartTimeInSeconds = timestampInSeconds;
133
+
134
+ if (isW3cExternalGeneratedHeaderEnabled) {
135
+ networkData.w3cGeneratedHeader = w3cHeader;
136
+ return w3cHeader;
137
+ }
138
+
139
+ return;
140
+ };
141
+
142
+ export default {
143
+ setOnDoneCallback(callback: NetworkDataCallback) {
144
+ onDoneCallback = callback;
145
+ },
146
+ setOnProgressCallback(callback: ProgressCallback) {
147
+ onProgressCallback = callback;
148
+ },
149
+ enableInterception() {
150
+ // Prevents infinite calls to XMLHttpRequest.open when enabling interception multiple times
151
+ if (isInterceptorEnabled) {
152
+ return;
153
+ }
154
+
155
+ originalXHROpen = XMLHttpRequest.prototype.open;
156
+ originalXHRSend = XMLHttpRequest.prototype.send;
157
+ originalXHRSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
158
+ // An error code that signifies an issue with the RN client.
159
+ const clientErrorCode = 9876;
160
+ XMLHttpRequest.prototype.open = function (method, url, ...args) {
161
+ _reset();
162
+ network.url = url;
163
+ network.method = method;
164
+ originalXHROpen.apply(this, [method, url, ...args]);
165
+ };
166
+
167
+ XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
168
+ // According to the HTTP RFC, headers are case-insensitive, so we convert
169
+ // them to lower-case to make accessing headers predictable.
170
+ // This avoid issues like failing to get the Content-Type header for a request
171
+ // because the header is set as 'Content-Type' instead of 'content-type'.
172
+ const key = header.toLowerCase();
173
+ network.requestHeaders[key] = stringifyIfNotString(value);
174
+ originalXHRSetRequestHeader.apply(this, [header, value]);
175
+ };
176
+
177
+ XMLHttpRequest.prototype.send = async function (data) {
178
+ const cloneNetwork = JSON.parse(JSON.stringify(network));
179
+ cloneNetwork.requestBody = data ? data : '';
180
+
181
+ if (typeof cloneNetwork.requestBody !== 'string') {
182
+ cloneNetwork.requestBody = JSON.stringify(cloneNetwork.requestBody);
183
+ }
184
+
185
+ if (this.addEventListener) {
186
+ this.addEventListener('readystatechange', async () => {
187
+ if (!isInterceptorEnabled) {
188
+ return;
189
+ }
190
+ if (this.readyState === this.HEADERS_RECEIVED) {
191
+ const contentTypeString = this.getResponseHeader('Content-Type');
192
+ if (contentTypeString) {
193
+ cloneNetwork.contentType = contentTypeString.split(';')[0];
194
+ }
195
+ const responseBodySizeString = this.getResponseHeader('Content-Length');
196
+ if (responseBodySizeString) {
197
+ const responseBodySizeNumber = Number(responseBodySizeString);
198
+
199
+ if (!isNaN(responseBodySizeNumber)) {
200
+ cloneNetwork.responseBodySize = responseBodySizeNumber;
201
+ }
202
+ }
203
+
204
+ if (this.getAllResponseHeaders()) {
205
+ const responseHeaders = this.getAllResponseHeaders().split('\r\n');
206
+ const responseHeadersDictionary: Record<string, string> = {};
207
+ responseHeaders.forEach((element) => {
208
+ const key = element.split(/:(.+)/)[0];
209
+ const value = element.split(/:(.+)/)[1];
210
+ responseHeadersDictionary[key] = value;
211
+ });
212
+
213
+ cloneNetwork.responseHeaders = responseHeadersDictionary;
214
+ }
215
+
216
+ if (cloneNetwork.requestHeaders['content-type']) {
217
+ cloneNetwork.requestContentType =
218
+ cloneNetwork.requestHeaders['content-type'].split(';')[0];
219
+ }
220
+ }
221
+
222
+ if (this.readyState === this.DONE) {
223
+ cloneNetwork.duration = Date.now() - cloneNetwork.startTime;
224
+ if (this.status == null) {
225
+ cloneNetwork.responseCode = 0;
226
+ } else {
227
+ cloneNetwork.responseCode = this.status;
228
+ }
229
+
230
+ // @ts-ignore
231
+ if (this._hasError) {
232
+ cloneNetwork.errorCode = clientErrorCode;
233
+ cloneNetwork.errorDomain = 'ClientError';
234
+
235
+ // @ts-ignore
236
+ const _response = this._response;
237
+ cloneNetwork.requestBody =
238
+ typeof _response === 'string' ? _response : JSON.stringify(_response);
239
+ cloneNetwork.responseBody = '';
240
+
241
+ // Detect a more descriptive error message.
242
+ if (typeof _response === 'string' && _response.length > 0) {
243
+ cloneNetwork.errorDomain = _response;
244
+ }
245
+
246
+ // @ts-ignore
247
+ } else if (this._timedOut) {
248
+ cloneNetwork.errorCode = clientErrorCode;
249
+ cloneNetwork.errorDomain = 'TimeOutError';
250
+ }
251
+
252
+ if (this.response) {
253
+ if (this.responseType === 'blob') {
254
+ const responseText = await new Response(this.response).text();
255
+ cloneNetwork.responseBody = responseText;
256
+ } else if (['text', '', 'json'].includes(this.responseType)) {
257
+ cloneNetwork.responseBody = JSON.stringify(this.response);
258
+ }
259
+ } else {
260
+ cloneNetwork.responseBody = '';
261
+ cloneNetwork.contentType = 'text/plain';
262
+ }
263
+
264
+ cloneNetwork.requestBodySize = cloneNetwork.requestBody.length;
265
+
266
+ if (cloneNetwork.responseBodySize === 0 && cloneNetwork.responseBody) {
267
+ cloneNetwork.responseBodySize = cloneNetwork.responseBody.length;
268
+ }
269
+
270
+ if (cloneNetwork.requestHeaders[LuciqConstants.GRAPHQL_HEADER]) {
271
+ cloneNetwork.gqlQueryName =
272
+ cloneNetwork.requestHeaders[LuciqConstants.GRAPHQL_HEADER];
273
+ delete cloneNetwork.requestHeaders[LuciqConstants.GRAPHQL_HEADER];
274
+ if (cloneNetwork.gqlQueryName === 'null') {
275
+ cloneNetwork.gqlQueryName = '';
276
+ }
277
+ if (cloneNetwork.responseBody) {
278
+ const responseObj = JSON.parse(cloneNetwork.responseBody);
279
+
280
+ if (responseObj.errors) {
281
+ cloneNetwork.serverErrorMessage = 'GraphQLError';
282
+ } else {
283
+ cloneNetwork.serverErrorMessage = '';
284
+ }
285
+ }
286
+ } else {
287
+ delete cloneNetwork.gqlQueryName;
288
+ }
289
+
290
+ if (onDoneCallback) {
291
+ onDoneCallback(cloneNetwork);
292
+ }
293
+ }
294
+ });
295
+
296
+ const downloadUploadProgressCallback = (event: ProgressEvent) => {
297
+ if (!isInterceptorEnabled) {
298
+ return;
299
+ }
300
+ // check if will be able to compute progress
301
+ if (event.lengthComputable && onProgressCallback) {
302
+ const totalBytesSent = event.loaded;
303
+ const totalBytesExpectedToSend = event.total - event.loaded;
304
+ onProgressCallback(totalBytesSent, totalBytesExpectedToSend);
305
+ }
306
+ };
307
+ this.addEventListener('progress', downloadUploadProgressCallback);
308
+ this.upload.addEventListener('progress', downloadUploadProgressCallback);
309
+ }
310
+
311
+ cloneNetwork.startTime = Date.now();
312
+ const traceparent = await getTraceparentHeader(cloneNetwork);
313
+ if (traceparent) {
314
+ this.setRequestHeader('Traceparent', traceparent);
315
+ }
316
+ if (this.readyState === this.UNSENT) {
317
+ return; // Prevent sending the request if not opened
318
+ }
319
+
320
+ originalXHRSend.apply(this, [data]);
321
+ };
322
+ isInterceptorEnabled = true;
323
+ },
324
+
325
+ disableInterception() {
326
+ isInterceptorEnabled = false;
327
+ XMLHttpRequest.prototype.send = originalXHRSend;
328
+ XMLHttpRequest.prototype.open = originalXHROpen;
329
+ XMLHttpRequest.prototype.setRequestHeader = originalXHRSetRequestHeader;
330
+ onDoneCallback = null;
331
+ onProgressCallback = null;
332
+ },
333
+ };
@@ -0,0 +1,7 @@
1
+ import LuciqConstants from './LuciqConstants';
2
+ import { LogLevel } from './Enums';
3
+
4
+ export const LuciqRNConfig = {
5
+ metroDevServerPort: LuciqConstants.DEFAULT_METRO_PORT,
6
+ debugLogsLevel: LogLevel.error,
7
+ };
@@ -0,0 +1,54 @@
1
+ import { LuciqRNConfig } from './config';
2
+ import { LogLevel } from './Enums';
3
+
4
+ export class Logger {
5
+ private static shouldLog(level: LogLevel): boolean {
6
+ const currentLevel = LuciqRNConfig.debugLogsLevel;
7
+
8
+ // Return true if the current log level is equal to or more verbose than the requested level
9
+ const logLevelHierarchy: Record<LogLevel, number> = {
10
+ [LogLevel.verbose]: 3,
11
+ [LogLevel.debug]: 2,
12
+ [LogLevel.error]: 1,
13
+ [LogLevel.none]: 0,
14
+ };
15
+
16
+ return logLevelHierarchy[currentLevel] >= logLevelHierarchy[level];
17
+ }
18
+
19
+ // General logging method that takes a logging function as an argument
20
+ private static logMessage(
21
+ level: LogLevel,
22
+ logMethod: (...args: any[]) => void,
23
+ message?: any,
24
+ ...optionalParams: any[]
25
+ ): void {
26
+ if (this.shouldLog(level)) {
27
+ logMethod(message, ...optionalParams);
28
+ }
29
+ }
30
+
31
+ static error(message?: any, ...optionalParams: any[]) {
32
+ this.logMessage(LogLevel.error, console.error, message, ...optionalParams); // Pass console.error for errors
33
+ }
34
+
35
+ static info(message?: any, ...optionalParams: any[]) {
36
+ this.logMessage(LogLevel.verbose, console.info, message, ...optionalParams); // Pass console.info for info
37
+ }
38
+
39
+ static log(message?: any, ...optionalParams: any[]) {
40
+ this.logMessage(LogLevel.verbose, console.log, message, ...optionalParams); // Default log method
41
+ }
42
+
43
+ static warn(message?: any, ...optionalParams: any[]) {
44
+ this.logMessage(LogLevel.debug, console.warn, message, ...optionalParams); // Use console.warn for debug
45
+ }
46
+
47
+ static trace(message?: any, ...optionalParams: any[]) {
48
+ this.logMessage(LogLevel.debug, console.trace, message, ...optionalParams); // Use console.trace for debugging
49
+ }
50
+
51
+ static debug(message?: any, ...optionalParams: any[]) {
52
+ this.logMessage(LogLevel.debug, console.debug, message, ...optionalParams); // Use console.debug for debug logs
53
+ }
54
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "include": ["src/**/*"],
3
+ "compilerOptions": {
4
+ "module": "esnext",
5
+ "target": "esnext",
6
+ "lib": ["esnext"],
7
+ "jsx": "react-native",
8
+ "moduleResolution": "node",
9
+ "skipLibCheck": true,
10
+ "outDir": "dist",
11
+
12
+ // Interop
13
+ "esModuleInterop": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+
16
+ // Emit
17
+ "declaration": true,
18
+ "importsNotUsedAsValues": "error",
19
+
20
+ // Code Style
21
+ "allowUnreachableCode": false,
22
+ "allowUnusedLabels": false,
23
+ "noFallthroughCasesInSwitch": true,
24
+ "noImplicitReturns": true,
25
+ "noImplicitUseStrict": false,
26
+ "noStrictGenericChecks": false,
27
+ "noUnusedLocals": true,
28
+ "noUnusedParameters": true,
29
+ "noImplicitAny": true,
30
+ "strict": true
31
+ }
32
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": ["test/**/*", "src/**/*"]
4
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": ["cli/upload/**/*"],
4
+ "exclude": [],
5
+ "compilerOptions": {
6
+ "lib": ["dom"],
7
+ "outDir": "upload",
8
+ "module": "esnext"
9
+ }
10
+ }
@@ -0,0 +1,4 @@
1
+ export * from './uploadSourcemaps';
2
+ export * from './uploadSoFiles';
3
+ export * from './uploadEasUpdatesSourcemaps';
4
+ export * from './migrate';