@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.
- package/CHANGELOG.md +5 -0
- package/FONTS_SETUP_GUIDE.md +521 -0
- package/Gemfile +1 -0
- package/Gemfile.lock +11 -0
- package/LICENSE +21 -0
- package/README.md +148 -0
- package/RNLuciq.podspec +21 -0
- package/android/build.gradle +88 -0
- package/android/gradle.properties +4 -0
- package/android/jacoco.gradle +52 -0
- package/android/native.gradle +7 -0
- package/android/proguard-rules.txt +1 -0
- package/android/sourcemaps.gradle +255 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/ai/luciq/reactlibrary/ArgsRegistry.java +278 -0
- package/android/src/main/java/ai/luciq/reactlibrary/Constants.java +20 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciq.java +328 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqAPMModule.java +392 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqBugReportingModule.java +444 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqCrashReportingModule.java +169 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqFeatureRequestsModule.java +98 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqNetworkLoggerModule.java +195 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativeModule.java +1611 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqReactnativePackage.java +41 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqRepliesModule.java +298 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSessionReplayModule.java +213 -0
- package/android/src/main/java/ai/luciq/reactlibrary/RNLuciqSurveysModule.java +237 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/ArrayUtil.java +167 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/EventEmitterModule.java +35 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/LuciqUtil.java +58 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/MainThreadHandler.java +13 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/MapUtil.java +171 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/RNTouchedViewExtractor.java +167 -0
- package/android/src/main/java/ai/luciq/reactlibrary/utils/ReportUtil.java +67 -0
- package/app.plugin.js +1 -0
- package/babel.config.js +3 -0
- package/bin/commands/MigrateCommand.d.ts +6 -0
- package/bin/commands/UploadEasUpdatesSourcemaps.d.ts +2 -0
- package/bin/commands/UploadSoFiles.d.ts +6 -0
- package/bin/commands/UploadSourcemaps.d.ts +2 -0
- package/bin/config/migration-config.json +125 -0
- package/bin/index.d.ts +2 -0
- package/bin/index.js +19179 -0
- package/bin/upload/index.d.ts +4 -0
- package/bin/upload/migrate.d.ts +14 -0
- package/bin/upload/uploadEasUpdatesSourcemaps.d.ts +21 -0
- package/bin/upload/uploadSoFiles.d.ts +21 -0
- package/bin/upload/uploadSourcemaps.d.ts +21 -0
- package/cli/commands/MigrateCommand.ts +32 -0
- package/cli/commands/UploadEasUpdatesSourcemaps.ts +34 -0
- package/cli/commands/UploadSoFiles.ts +38 -0
- package/cli/commands/UploadSourcemaps.ts +40 -0
- package/cli/config/migration-config.json +125 -0
- package/cli/index.ts +21 -0
- package/cli/upload/index.ts +4 -0
- package/cli/upload/migrate.ts +271 -0
- package/cli/upload/uploadEasUpdatesSourcemaps.ts +74 -0
- package/cli/upload/uploadSoFiles.ts +112 -0
- package/cli/upload/uploadSourcemaps.ts +73 -0
- package/dangerfile.ts +44 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +14 -0
- package/dist/models/FeatureFlag.d.ts +11 -0
- package/dist/models/FeatureFlag.js +1 -0
- package/dist/models/LuciqConfig.d.ts +42 -0
- package/dist/models/LuciqConfig.js +1 -0
- package/dist/models/NonFatalOptions.d.ts +15 -0
- package/dist/models/NonFatalOptions.js +1 -0
- package/dist/models/OverAirUpdate.d.ts +12 -0
- package/dist/models/OverAirUpdate.js +1 -0
- package/dist/models/Report.d.ts +70 -0
- package/dist/models/Report.js +109 -0
- package/dist/models/ReproConfig.d.ts +27 -0
- package/dist/models/ReproConfig.js +1 -0
- package/dist/models/SessionMetadata.d.ts +55 -0
- package/dist/models/SessionMetadata.js +1 -0
- package/dist/models/ThemeConfig.d.ts +27 -0
- package/dist/models/ThemeConfig.js +1 -0
- package/dist/models/W3cExternalTraceAttributes.d.ts +22 -0
- package/dist/models/W3cExternalTraceAttributes.js +1 -0
- package/dist/modules/APM.d.ts +77 -0
- package/dist/modules/APM.js +104 -0
- package/dist/modules/BugReporting.d.ts +138 -0
- package/dist/modules/BugReporting.js +202 -0
- package/dist/modules/CrashReporting.d.ts +19 -0
- package/dist/modules/CrashReporting.js +40 -0
- package/dist/modules/FeatureRequests.d.ts +20 -0
- package/dist/modules/FeatureRequests.js +28 -0
- package/dist/modules/Luciq.d.ts +362 -0
- package/dist/modules/Luciq.js +797 -0
- package/dist/modules/NetworkLogger.d.ts +52 -0
- package/dist/modules/NetworkLogger.js +208 -0
- package/dist/modules/Replies.d.ts +78 -0
- package/dist/modules/Replies.js +121 -0
- package/dist/modules/SessionReplay.d.ts +78 -0
- package/dist/modules/SessionReplay.js +98 -0
- package/dist/modules/Surveys.d.ts +75 -0
- package/dist/modules/Surveys.js +101 -0
- package/dist/native/NativeAPM.d.ts +18 -0
- package/dist/native/NativeAPM.js +4 -0
- package/dist/native/NativeBugReporting.d.ts +32 -0
- package/dist/native/NativeBugReporting.js +10 -0
- package/dist/native/NativeConstants.d.ts +182 -0
- package/dist/native/NativeConstants.js +1 -0
- package/dist/native/NativeCrashReporting.d.ts +18 -0
- package/dist/native/NativeCrashReporting.js +2 -0
- package/dist/native/NativeFeatureRequests.d.ts +8 -0
- package/dist/native/NativeFeatureRequests.js +2 -0
- package/dist/native/NativeLuciq.d.ts +86 -0
- package/dist/native/NativeLuciq.js +10 -0
- package/dist/native/NativeNetworkLogger.d.ts +21 -0
- package/dist/native/NativeNetworkLogger.js +14 -0
- package/dist/native/NativePackage.d.ts +21 -0
- package/dist/native/NativePackage.js +2 -0
- package/dist/native/NativeReplies.d.ts +21 -0
- package/dist/native/NativeReplies.js +8 -0
- package/dist/native/NativeSessionReplay.d.ts +16 -0
- package/dist/native/NativeSessionReplay.js +8 -0
- package/dist/native/NativeSurveys.d.ts +22 -0
- package/dist/native/NativeSurveys.js +9 -0
- package/dist/utils/AppStatesHandler.d.ts +3 -0
- package/dist/utils/AppStatesHandler.js +16 -0
- package/dist/utils/Enums.d.ts +244 -0
- package/dist/utils/Enums.js +266 -0
- package/dist/utils/FeatureFlags.d.ts +7 -0
- package/dist/utils/FeatureFlags.js +24 -0
- package/dist/utils/LuciqConstants.d.ts +14 -0
- package/dist/utils/LuciqConstants.js +15 -0
- package/dist/utils/LuciqUtils.d.ts +97 -0
- package/dist/utils/LuciqUtils.js +301 -0
- package/dist/utils/UnhandledRejectionTracking.d.ts +9 -0
- package/dist/utils/UnhandledRejectionTracking.js +99 -0
- package/dist/utils/XhrNetworkInterceptor.d.ts +39 -0
- package/dist/utils/XhrNetworkInterceptor.js +253 -0
- package/dist/utils/config.d.ts +5 -0
- package/dist/utils/config.js +6 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +39 -0
- package/expo.d.ts +1 -0
- package/expo.js +1 -0
- package/ios/RNLuciq/ArgsRegistry.h +32 -0
- package/ios/RNLuciq/ArgsRegistry.m +276 -0
- package/ios/RNLuciq/LuciqAPMBridge.h +26 -0
- package/ios/RNLuciq/LuciqAPMBridge.m +99 -0
- package/ios/RNLuciq/LuciqBugReportingBridge.h +60 -0
- package/ios/RNLuciq/LuciqBugReportingBridge.m +241 -0
- package/ios/RNLuciq/LuciqCrashReportingBridge.h +18 -0
- package/ios/RNLuciq/LuciqCrashReportingBridge.m +68 -0
- package/ios/RNLuciq/LuciqFeatureRequestsBridge.h +30 -0
- package/ios/RNLuciq/LuciqFeatureRequestsBridge.m +61 -0
- package/ios/RNLuciq/LuciqNetworkLoggerBridge.h +44 -0
- package/ios/RNLuciq/LuciqNetworkLoggerBridge.m +206 -0
- package/ios/RNLuciq/LuciqReactBridge.h +151 -0
- package/ios/RNLuciq/LuciqReactBridge.m +548 -0
- package/ios/RNLuciq/LuciqRepliesBridge.h +40 -0
- package/ios/RNLuciq/LuciqRepliesBridge.m +80 -0
- package/ios/RNLuciq/LuciqSessionReplayBridge.h +32 -0
- package/ios/RNLuciq/LuciqSessionReplayBridge.m +107 -0
- package/ios/RNLuciq/LuciqSurveysBridge.h +46 -0
- package/ios/RNLuciq/LuciqSurveysBridge.m +107 -0
- package/ios/RNLuciq/RCTConvert+LuciqEnums.h +18 -0
- package/ios/RNLuciq/RCTConvert+LuciqEnums.m +127 -0
- package/ios/RNLuciq/RNLuciq.h +35 -0
- package/ios/RNLuciq/RNLuciq.m +107 -0
- package/ios/RNLuciq/Util/LCQAPM+PrivateAPIs.h +15 -0
- package/ios/RNLuciq/Util/LCQCrashReporting+CP.h +13 -0
- package/ios/RNLuciq/Util/LCQNetworkLogger+CP.h +68 -0
- package/ios/RNLuciq/Util/Luciq+CP.h +12 -0
- package/ios/RNLuciq.xcodeproj/project.pbxproj +352 -0
- package/ios/native.rb +12 -0
- package/ios/sourcemaps.sh +120 -0
- package/migrate.js +569 -0
- package/package.json +92 -0
- package/plugin/build/index.js +42078 -0
- package/plugin/src/index.ts +5 -0
- package/plugin/src/pluginProps.ts +6 -0
- package/plugin/src/withLuciq.ts +51 -0
- package/plugin/src/withLuciqAndroid.ts +99 -0
- package/plugin/src/withLuciqIOS.ts +109 -0
- package/plugin/tsconfig.json +7 -0
- package/react-native.config.js +16 -0
- package/scripts/customize-ios-endpoints.sh +28 -0
- package/scripts/dream-11-delete-unused-features.sh +62 -0
- package/scripts/find-token.js +58 -0
- package/scripts/find-token.sh +70 -0
- package/scripts/notify-github.sh +15 -0
- package/scripts/replace.js +58 -0
- package/scripts/snapshot-comment.md +15 -0
- package/scripts/snapshot-version.sh +11 -0
- package/src/index.ts +40 -0
- package/src/models/FeatureFlag.ts +12 -0
- package/src/models/LuciqConfig.ts +48 -0
- package/src/models/NonFatalOptions.ts +16 -0
- package/src/models/OverAirUpdate.ts +14 -0
- package/src/models/Report.ts +124 -0
- package/src/models/ReproConfig.ts +31 -0
- package/src/models/SessionMetadata.ts +57 -0
- package/src/models/ThemeConfig.ts +34 -0
- package/src/models/W3cExternalTraceAttributes.ts +22 -0
- package/src/modules/APM.ts +117 -0
- package/src/modules/BugReporting.ts +254 -0
- package/src/modules/CrashReporting.ts +54 -0
- package/src/modules/FeatureRequests.ts +32 -0
- package/src/modules/Luciq.ts +934 -0
- package/src/modules/NetworkLogger.ts +270 -0
- package/src/modules/Replies.ts +137 -0
- package/src/modules/SessionReplay.ts +111 -0
- package/src/modules/Surveys.ts +118 -0
- package/src/native/NativeAPM.ts +51 -0
- package/src/native/NativeBugReporting.ts +70 -0
- package/src/native/NativeConstants.ts +215 -0
- package/src/native/NativeCrashReporting.ts +29 -0
- package/src/native/NativeFeatureRequests.ts +12 -0
- package/src/native/NativeLuciq.ts +179 -0
- package/src/native/NativeNetworkLogger.ts +42 -0
- package/src/native/NativePackage.ts +25 -0
- package/src/native/NativeReplies.ts +34 -0
- package/src/native/NativeSessionReplay.ts +21 -0
- package/src/native/NativeSurveys.ts +34 -0
- package/src/promise.d.ts +11 -0
- package/src/utils/AppStatesHandler.ts +19 -0
- package/src/utils/Enums.ts +266 -0
- package/src/utils/FeatureFlags.ts +33 -0
- package/src/utils/LuciqConstants.ts +24 -0
- package/src/utils/LuciqUtils.ts +417 -0
- package/src/utils/UnhandledRejectionTracking.ts +118 -0
- package/src/utils/XhrNetworkInterceptor.ts +333 -0
- package/src/utils/config.ts +7 -0
- package/src/utils/logger.ts +54 -0
- package/tsconfig.json +32 -0
- package/tsconfig.test.json +4 -0
- package/tsconfig.upload.json +10 -0
- package/upload/index.d.ts +4 -0
- package/upload/index.js +17314 -0
- package/upload/migrate.d.ts +14 -0
- package/upload/package.json +5 -0
- package/upload/uploadEasUpdatesSourcemaps.d.ts +21 -0
- package/upload/uploadSoFiles.d.ts +21 -0
- 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,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
|
+
}
|