@salve-software/salvetron-react-native 1.0.1
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/LICENSE +21 -0
- package/NitroRnTuiSdk.podspec +31 -0
- package/README.md +90 -0
- package/android/CMakeLists.txt +32 -0
- package/android/build.gradle +148 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/margelo/nitro/rntuisdk/HybridRnTuiSdk.kt +235 -0
- package/android/src/main/java/com/margelo/nitro/rntuisdk/PerformanceMonitor.kt +260 -0
- package/android/src/main/java/com/margelo/nitro/rntuisdk/RnTuiSdkPackage.kt +18 -0
- package/ios/Bridge.h +8 -0
- package/ios/HybridRnTuiSdk.swift +245 -0
- package/ios/PerformanceMonitor.swift +223 -0
- package/lib/commonjs/index.js +17 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/library/client/constants.js +33 -0
- package/lib/commonjs/library/client/constants.js.map +1 -0
- package/lib/commonjs/library/client/index.js +28 -0
- package/lib/commonjs/library/client/index.js.map +1 -0
- package/lib/commonjs/library/client/salvetron-client.js +363 -0
- package/lib/commonjs/library/client/salvetron-client.js.map +1 -0
- package/lib/commonjs/library/device/device-handler.js +80 -0
- package/lib/commonjs/library/device/device-handler.js.map +1 -0
- package/lib/commonjs/library/device/index.js +9 -0
- package/lib/commonjs/library/device/index.js.map +1 -0
- package/lib/commonjs/library/device/types.js +2 -0
- package/lib/commonjs/library/device/types.js.map +1 -0
- package/lib/commonjs/library/device/utils/generate-uuid.js +14 -0
- package/lib/commonjs/library/device/utils/generate-uuid.js.map +1 -0
- package/lib/commonjs/library/index.js +136 -0
- package/lib/commonjs/library/index.js.map +1 -0
- package/lib/commonjs/library/interceptors/index.js +11 -0
- package/lib/commonjs/library/interceptors/index.js.map +1 -0
- package/lib/commonjs/library/interceptors/js-console.js +88 -0
- package/lib/commonjs/library/interceptors/js-console.js.map +1 -0
- package/lib/commonjs/library/interceptors/xhr.js +74 -0
- package/lib/commonjs/library/interceptors/xhr.js.map +1 -0
- package/lib/commonjs/library/network-handler/index.js +17 -0
- package/lib/commonjs/library/network-handler/index.js.map +1 -0
- package/lib/commonjs/library/network-handler/network-handler.js +103 -0
- package/lib/commonjs/library/network-handler/network-handler.js.map +1 -0
- package/lib/commonjs/library/network-handler/types.js +6 -0
- package/lib/commonjs/library/network-handler/types.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/generate-request-id.js +13 -0
- package/lib/commonjs/library/network-handler/utils/generate-request-id.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/index.js +41 -0
- package/lib/commonjs/library/network-handler/utils/index.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/parse-response-headers.js +26 -0
- package/lib/commonjs/library/network-handler/utils/parse-response-headers.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js +18 -0
- package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/response-to-string.js +35 -0
- package/lib/commonjs/library/network-handler/utils/response-to-string.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/should-ignore-url.js +13 -0
- package/lib/commonjs/library/network-handler/utils/should-ignore-url.js.map +1 -0
- package/lib/commonjs/library/performance-handler/index.js +13 -0
- package/lib/commonjs/library/performance-handler/index.js.map +1 -0
- package/lib/commonjs/library/performance-handler/performance-handler.js +94 -0
- package/lib/commonjs/library/performance-handler/performance-handler.js.map +1 -0
- package/lib/commonjs/library/performance-handler/types.js +6 -0
- package/lib/commonjs/library/performance-handler/types.js.map +1 -0
- package/lib/commonjs/library/project/index.js +15 -0
- package/lib/commonjs/library/project/index.js.map +1 -0
- package/lib/commonjs/library/project/project-handler.js +31 -0
- package/lib/commonjs/library/project/project-handler.js.map +1 -0
- package/lib/commonjs/library/types.js +2 -0
- package/lib/commonjs/library/types.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/rn-tui-sdk.nitro.js +6 -0
- package/lib/commonjs/specs/rn-tui-sdk.nitro.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/library/client/constants.js +29 -0
- package/lib/module/library/client/constants.js.map +1 -0
- package/lib/module/library/client/index.js +6 -0
- package/lib/module/library/client/index.js.map +1 -0
- package/lib/module/library/client/salvetron-client.js +359 -0
- package/lib/module/library/client/salvetron-client.js.map +1 -0
- package/lib/module/library/device/device-handler.js +75 -0
- package/lib/module/library/device/device-handler.js.map +1 -0
- package/lib/module/library/device/index.js +5 -0
- package/lib/module/library/device/index.js.map +1 -0
- package/lib/module/library/device/types.js +2 -0
- package/lib/module/library/device/types.js.map +1 -0
- package/lib/module/library/device/utils/generate-uuid.js +10 -0
- package/lib/module/library/device/utils/generate-uuid.js.map +1 -0
- package/lib/module/library/index.js +135 -0
- package/lib/module/library/index.js.map +1 -0
- package/lib/module/library/interceptors/index.js +7 -0
- package/lib/module/library/interceptors/index.js.map +1 -0
- package/lib/module/library/interceptors/js-console.js +83 -0
- package/lib/module/library/interceptors/js-console.js.map +1 -0
- package/lib/module/library/interceptors/xhr.js +69 -0
- package/lib/module/library/interceptors/xhr.js.map +1 -0
- package/lib/module/library/network-handler/index.js +4 -0
- package/lib/module/library/network-handler/index.js.map +1 -0
- package/lib/module/library/network-handler/network-handler.js +98 -0
- package/lib/module/library/network-handler/network-handler.js.map +1 -0
- package/lib/module/library/network-handler/types.js +4 -0
- package/lib/module/library/network-handler/types.js.map +1 -0
- package/lib/module/library/network-handler/utils/generate-request-id.js +9 -0
- package/lib/module/library/network-handler/utils/generate-request-id.js.map +1 -0
- package/lib/module/library/network-handler/utils/index.js +8 -0
- package/lib/module/library/network-handler/utils/index.js.map +1 -0
- package/lib/module/library/network-handler/utils/parse-response-headers.js +22 -0
- package/lib/module/library/network-handler/utils/parse-response-headers.js.map +1 -0
- package/lib/module/library/network-handler/utils/read-blob-as-text.js +14 -0
- package/lib/module/library/network-handler/utils/read-blob-as-text.js.map +1 -0
- package/lib/module/library/network-handler/utils/response-to-string.js +31 -0
- package/lib/module/library/network-handler/utils/response-to-string.js.map +1 -0
- package/lib/module/library/network-handler/utils/should-ignore-url.js +9 -0
- package/lib/module/library/network-handler/utils/should-ignore-url.js.map +1 -0
- package/lib/module/library/performance-handler/index.js +4 -0
- package/lib/module/library/performance-handler/index.js.map +1 -0
- package/lib/module/library/performance-handler/performance-handler.js +89 -0
- package/lib/module/library/performance-handler/performance-handler.js.map +1 -0
- package/lib/module/library/performance-handler/types.js +4 -0
- package/lib/module/library/performance-handler/types.js.map +1 -0
- package/lib/module/library/project/index.js +6 -0
- package/lib/module/library/project/index.js.map +1 -0
- package/lib/module/library/project/project-handler.js +26 -0
- package/lib/module/library/project/project-handler.js.map +1 -0
- package/lib/module/library/types.js +2 -0
- package/lib/module/library/types.js.map +1 -0
- package/lib/module/specs/rn-tui-sdk.nitro.js +4 -0
- package/lib/module/specs/rn-tui-sdk.nitro.js.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/library/client/constants.d.ts +23 -0
- package/lib/typescript/src/library/client/constants.d.ts.map +1 -0
- package/lib/typescript/src/library/client/index.d.ts +4 -0
- package/lib/typescript/src/library/client/index.d.ts.map +1 -0
- package/lib/typescript/src/library/client/salvetron-client.d.ts +73 -0
- package/lib/typescript/src/library/client/salvetron-client.d.ts.map +1 -0
- package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts +2 -0
- package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts.map +1 -0
- package/lib/typescript/src/library/device/device-handler.d.ts +11 -0
- package/lib/typescript/src/library/device/device-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/device/index.d.ts +3 -0
- package/lib/typescript/src/library/device/index.d.ts.map +1 -0
- package/lib/typescript/src/library/device/types.d.ts +8 -0
- package/lib/typescript/src/library/device/types.d.ts.map +1 -0
- package/lib/typescript/src/library/device/utils/generate-uuid.d.ts +2 -0
- package/lib/typescript/src/library/device/utils/generate-uuid.d.ts.map +1 -0
- package/lib/typescript/src/library/index.d.ts +106 -0
- package/lib/typescript/src/library/index.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts +2 -0
- package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts +2 -0
- package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/index.d.ts +5 -0
- package/lib/typescript/src/library/interceptors/index.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/js-console.d.ts +17 -0
- package/lib/typescript/src/library/interceptors/js-console.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/xhr.d.ts +14 -0
- package/lib/typescript/src/library/interceptors/xhr.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/index.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/index.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/network-handler.d.ts +19 -0
- package/lib/typescript/src/library/network-handler/network-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/types.d.ts +6 -0
- package/lib/typescript/src/library/network-handler/types.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/index.d.ts +6 -0
- package/lib/typescript/src/library/network-handler/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/index.d.ts +3 -0
- package/lib/typescript/src/library/performance-handler/index.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/performance-handler.d.ts +27 -0
- package/lib/typescript/src/library/performance-handler/performance-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/types.d.ts +20 -0
- package/lib/typescript/src/library/performance-handler/types.d.ts.map +1 -0
- package/lib/typescript/src/library/project/index.d.ts +4 -0
- package/lib/typescript/src/library/project/index.d.ts.map +1 -0
- package/lib/typescript/src/library/project/project-handler.d.ts +7 -0
- package/lib/typescript/src/library/project/project-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/types.d.ts +39 -0
- package/lib/typescript/src/library/types.d.ts.map +1 -0
- package/lib/typescript/src/specs/rn-tui-sdk.nitro.d.ts +100 -0
- package/lib/typescript/src/specs/rn-tui-sdk.nitro.d.ts.map +1 -0
- package/nitro.json +24 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroRnTuiSdk+autolinking.cmake +81 -0
- package/nitrogen/generated/android/NitroRnTuiSdk+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroRnTuiSdkOnLoad.cpp +58 -0
- package/nitrogen/generated/android/NitroRnTuiSdkOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JDeviceInfoResult.hpp +69 -0
- package/nitrogen/generated/android/c++/JFunc_void_NativeLogEntry.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_PerformanceMetrics.hpp +77 -0
- package/nitrogen/generated/android/c++/JHybridNitroRnTuiSdkSpec.cpp +124 -0
- package/nitrogen/generated/android/c++/JHybridNitroRnTuiSdkSpec.hpp +74 -0
- package/nitrogen/generated/android/c++/JNativeLogEntry.hpp +71 -0
- package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +64 -0
- package/nitrogen/generated/android/c++/JPerformanceMetrics.hpp +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/DeviceInfoResult.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/Func_void_NativeLogEntry.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/Func_void_PerformanceMetrics.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/HybridNitroRnTuiSdkSpec.kt +108 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NativeLogEntry.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NativeLogLevel.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NitroRnTuiSdkOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/PerformanceMetrics.kt +47 -0
- package/nitrogen/generated/ios/NitroRnTuiSdk+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Bridge.cpp +49 -0
- package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Bridge.hpp +185 -0
- package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Umbrella.hpp +58 -0
- package/nitrogen/generated/ios/NitroRnTuiSdkAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroRnTuiSdkAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridNitroRnTuiSdkSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroRnTuiSdkSpecSwift.hpp +175 -0
- package/nitrogen/generated/ios/swift/DeviceInfoResult.swift +44 -0
- package/nitrogen/generated/ios/swift/Func_void_NativeLogEntry.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PerformanceMetrics.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridNitroRnTuiSdkSpec.swift +66 -0
- package/nitrogen/generated/ios/swift/HybridNitroRnTuiSdkSpec_cxx.swift +289 -0
- package/nitrogen/generated/ios/swift/NativeLogEntry.swift +44 -0
- package/nitrogen/generated/ios/swift/NativeLogLevel.swift +48 -0
- package/nitrogen/generated/ios/swift/PerformanceMetrics.swift +44 -0
- package/nitrogen/generated/shared/c++/DeviceInfoResult.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridNitroRnTuiSdkSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridNitroRnTuiSdkSpec.hpp +83 -0
- package/nitrogen/generated/shared/c++/NativeLogEntry.hpp +97 -0
- package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +84 -0
- package/nitrogen/generated/shared/c++/PerformanceMetrics.hpp +95 -0
- package/package.json +128 -0
- package/react-native.config.js +16 -0
- package/src/index.ts +7 -0
- package/src/library/client/constants.ts +35 -0
- package/src/library/client/index.ts +9 -0
- package/src/library/client/salvetron-client.ts +433 -0
- package/src/library/device/__tests__/device-handler.test.ts +86 -0
- package/src/library/device/device-handler.ts +85 -0
- package/src/library/device/index.ts +3 -0
- package/src/library/device/types.ts +7 -0
- package/src/library/device/utils/generate-uuid.ts +7 -0
- package/src/library/index.ts +158 -0
- package/src/library/interceptors/__tests__/js-console.test.ts +186 -0
- package/src/library/interceptors/__tests__/xhr.test.ts +313 -0
- package/src/library/interceptors/index.ts +5 -0
- package/src/library/interceptors/js-console.ts +93 -0
- package/src/library/interceptors/xhr.ts +123 -0
- package/src/library/network-handler/__tests__/network-handler.test.ts +265 -0
- package/src/library/network-handler/index.ts +1 -0
- package/src/library/network-handler/network-handler.ts +141 -0
- package/src/library/network-handler/types.ts +6 -0
- package/src/library/network-handler/utils/__tests__/generate-request-id.test.ts +22 -0
- package/src/library/network-handler/utils/__tests__/parse-response-headers.test.ts +71 -0
- package/src/library/network-handler/utils/__tests__/read-blob-as-text.test.ts +79 -0
- package/src/library/network-handler/utils/__tests__/response-to-string.test.ts +85 -0
- package/src/library/network-handler/utils/__tests__/should-ignore-url.test.ts +45 -0
- package/src/library/network-handler/utils/generate-request-id.ts +6 -0
- package/src/library/network-handler/utils/index.ts +5 -0
- package/src/library/network-handler/utils/parse-response-headers.ts +20 -0
- package/src/library/network-handler/utils/read-blob-as-text.ts +11 -0
- package/src/library/network-handler/utils/response-to-string.ts +32 -0
- package/src/library/network-handler/utils/should-ignore-url.ts +6 -0
- package/src/library/performance-handler/index.ts +2 -0
- package/src/library/performance-handler/performance-handler.ts +104 -0
- package/src/library/performance-handler/types.ts +22 -0
- package/src/library/project/index.ts +4 -0
- package/src/library/project/project-handler.ts +28 -0
- package/src/library/types.ts +78 -0
- package/src/specs/rn-tui-sdk.nitro.ts +114 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
jest.mock('react-native', () => ({
|
|
2
|
+
Platform: {
|
|
3
|
+
OS: 'ios',
|
|
4
|
+
},
|
|
5
|
+
}));
|
|
6
|
+
|
|
7
|
+
import { Platform } from 'react-native';
|
|
8
|
+
|
|
9
|
+
import { DeviceHandler } from '../device-handler';
|
|
10
|
+
|
|
11
|
+
import { NitroRnTuiSdk } from '../../../index';
|
|
12
|
+
|
|
13
|
+
import { generateUUID } from '../utils/generate-uuid';
|
|
14
|
+
|
|
15
|
+
jest.mock('../../../index', () => ({
|
|
16
|
+
NitroRnTuiSdk: {
|
|
17
|
+
getDeviceInfo: jest.fn(),
|
|
18
|
+
getStoredDeviceId: jest.fn(),
|
|
19
|
+
storeDeviceId: jest.fn(),
|
|
20
|
+
},
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
jest.mock('../utils/generate-uuid', () => ({
|
|
24
|
+
generateUUID: jest.fn(),
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
describe('DeviceHandler', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
jest.clearAllMocks();
|
|
30
|
+
|
|
31
|
+
(
|
|
32
|
+
generateUUID as jest.Mock
|
|
33
|
+
).mockReturnValue('generated-uuid');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should fallback to iOS device name', () => {
|
|
37
|
+
Platform.OS = 'ios';
|
|
38
|
+
|
|
39
|
+
(
|
|
40
|
+
NitroRnTuiSdk.getDeviceInfo as jest.Mock
|
|
41
|
+
).mockReturnValue({});
|
|
42
|
+
|
|
43
|
+
const handler = new DeviceHandler();
|
|
44
|
+
|
|
45
|
+
expect(
|
|
46
|
+
handler.getDeviceName(),
|
|
47
|
+
).toBe('iOS Device');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should fallback to Android device name', () => {
|
|
51
|
+
Platform.OS = 'android';
|
|
52
|
+
|
|
53
|
+
(
|
|
54
|
+
NitroRnTuiSdk.getDeviceInfo as jest.Mock
|
|
55
|
+
).mockReturnValue({});
|
|
56
|
+
|
|
57
|
+
const handler = new DeviceHandler();
|
|
58
|
+
|
|
59
|
+
expect(
|
|
60
|
+
handler.getDeviceName(),
|
|
61
|
+
).toBe('Android Device');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should return platform in device info', () => {
|
|
65
|
+
Platform.OS = 'android';
|
|
66
|
+
|
|
67
|
+
(
|
|
68
|
+
NitroRnTuiSdk.getDeviceInfo as jest.Mock
|
|
69
|
+
).mockReturnValue({
|
|
70
|
+
deviceId: 'id',
|
|
71
|
+
deviceName: 'Pixel',
|
|
72
|
+
appName: 'App',
|
|
73
|
+
bundleId: 'com.test',
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const handler = new DeviceHandler();
|
|
77
|
+
|
|
78
|
+
expect(handler.getDeviceInfo()).toEqual({
|
|
79
|
+
deviceId: 'id',
|
|
80
|
+
deviceName: 'Pixel',
|
|
81
|
+
platform: 'android',
|
|
82
|
+
appName: 'App',
|
|
83
|
+
bundleId: 'com.test',
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Platform } from 'react-native'
|
|
2
|
+
import { NitroRnTuiSdk } from '../../index'
|
|
3
|
+
import { generateUUID } from './utils/generate-uuid'
|
|
4
|
+
import type { DeviceInfoData } from './types'
|
|
5
|
+
|
|
6
|
+
export class DeviceHandler {
|
|
7
|
+
private cachedDeviceId: string | null = null
|
|
8
|
+
private cachedDeviceName: string | null = null
|
|
9
|
+
|
|
10
|
+
private getOrCreateDeviceId(): string {
|
|
11
|
+
if (this.cachedDeviceId) {
|
|
12
|
+
return this.cachedDeviceId
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const nativeInfo = NitroRnTuiSdk.getDeviceInfo()
|
|
17
|
+
if (nativeInfo.deviceId) {
|
|
18
|
+
this.cachedDeviceId = nativeInfo.deviceId
|
|
19
|
+
return nativeInfo.deviceId
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const storedId = NitroRnTuiSdk.getStoredDeviceId()
|
|
23
|
+
if (storedId) {
|
|
24
|
+
this.cachedDeviceId = storedId
|
|
25
|
+
return storedId
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const newId = generateUUID()
|
|
29
|
+
NitroRnTuiSdk.storeDeviceId(newId)
|
|
30
|
+
this.cachedDeviceId = newId
|
|
31
|
+
return newId
|
|
32
|
+
} catch (err) {
|
|
33
|
+
this.cachedDeviceId = generateUUID()
|
|
34
|
+
return this.cachedDeviceId
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
getDeviceName(): string {
|
|
39
|
+
if (this.cachedDeviceName) {
|
|
40
|
+
return this.cachedDeviceName
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const nativeInfo = NitroRnTuiSdk.getDeviceInfo()
|
|
44
|
+
if (nativeInfo.deviceName) {
|
|
45
|
+
this.cachedDeviceName = nativeInfo.deviceName
|
|
46
|
+
return nativeInfo.deviceName
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const model = Platform.OS === 'ios' ? 'iOS Device' : 'Android Device'
|
|
50
|
+
this.cachedDeviceName = model
|
|
51
|
+
return model
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getAppName(): string {
|
|
55
|
+
try {
|
|
56
|
+
const nativeInfo = NitroRnTuiSdk.getDeviceInfo()
|
|
57
|
+
return nativeInfo.appName || 'React Native App'
|
|
58
|
+
} catch {
|
|
59
|
+
return 'React Native App'
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getBundleId(): string {
|
|
64
|
+
try {
|
|
65
|
+
const nativeInfo = NitroRnTuiSdk.getDeviceInfo()
|
|
66
|
+
return nativeInfo.bundleId || ''
|
|
67
|
+
} catch {
|
|
68
|
+
return ''
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getDeviceInfo(): DeviceInfoData {
|
|
73
|
+
const deviceId = this.getOrCreateDeviceId()
|
|
74
|
+
const deviceName = this.getDeviceName()
|
|
75
|
+
const appName = this.getAppName()
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
deviceId,
|
|
79
|
+
deviceName,
|
|
80
|
+
platform: Platform.OS as 'ios' | 'android',
|
|
81
|
+
appName,
|
|
82
|
+
bundleId: this.getBundleId(),
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Salvetron SDK for React Native
|
|
3
|
+
*
|
|
4
|
+
* Captures network requests and sends them to the Salvetron CLI
|
|
5
|
+
* for debugging and inspection.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import Salvetron from '@salve-software/salvetron-react-native';
|
|
10
|
+
*
|
|
11
|
+
* if (__DEV__) {
|
|
12
|
+
* Salvetron.connect({
|
|
13
|
+
* host: 'localhost',
|
|
14
|
+
* port: 8765,
|
|
15
|
+
* });
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { client } from './client'
|
|
21
|
+
import type { SalvetronConfig } from './types'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Salvetron SDK main interface
|
|
25
|
+
*/
|
|
26
|
+
export default {
|
|
27
|
+
/**
|
|
28
|
+
* Connect to Salvetron CLI
|
|
29
|
+
*
|
|
30
|
+
* @param config - Configuration options
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* Salvetron.connect({
|
|
34
|
+
* host: '192.168.1.100', // Mac IP address
|
|
35
|
+
* port: 8765,
|
|
36
|
+
* enableNetworkCapture: true,
|
|
37
|
+
* ignoredUrls: [/my-internal-api/],
|
|
38
|
+
* onConnect: () => console.log('Connected to Salvetron'),
|
|
39
|
+
* onDisconnect: () => console.log('Disconnected from Salvetron'),
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
connect(config?: SalvetronConfig): void {
|
|
44
|
+
client.connect(config)
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Disconnect from Salvetron CLI
|
|
49
|
+
*/
|
|
50
|
+
disconnect(): void {
|
|
51
|
+
client.disconnect()
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if currently connected to Salvetron
|
|
56
|
+
*/
|
|
57
|
+
isConnected(): boolean {
|
|
58
|
+
return client.isConnected()
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Send a log message (info level)
|
|
63
|
+
* @param message - The log message
|
|
64
|
+
* @param metadata - Optional metadata object
|
|
65
|
+
*/
|
|
66
|
+
log(message: string, metadata?: Record<string, unknown>): void {
|
|
67
|
+
client.sendLog('info', message, metadata)
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Send a debug log message
|
|
72
|
+
* @param message - The log message
|
|
73
|
+
* @param metadata - Optional metadata object
|
|
74
|
+
*/
|
|
75
|
+
debug(message: string, metadata?: Record<string, unknown>): void {
|
|
76
|
+
client.sendLog('debug', message, metadata)
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Send an info log message
|
|
81
|
+
* @param message - The log message
|
|
82
|
+
* @param metadata - Optional metadata object
|
|
83
|
+
*/
|
|
84
|
+
info(message: string, metadata?: Record<string, unknown>): void {
|
|
85
|
+
client.sendLog('info', message, metadata)
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Send a warning log message
|
|
90
|
+
* @param message - The log message
|
|
91
|
+
* @param metadata - Optional metadata object
|
|
92
|
+
*/
|
|
93
|
+
warn(message: string, metadata?: Record<string, unknown>): void {
|
|
94
|
+
client.sendLog('warn', message, metadata)
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Send an error log message
|
|
99
|
+
* @param message - The log message
|
|
100
|
+
* @param metadata - Optional metadata object
|
|
101
|
+
*/
|
|
102
|
+
error(message: string, metadata?: Record<string, unknown>): void {
|
|
103
|
+
client.sendLog('error', message, metadata)
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Stop capturing native platform logs (NSLog/print on iOS, Logcat on Android)
|
|
108
|
+
* Native log capture starts automatically on connect()
|
|
109
|
+
*/
|
|
110
|
+
stopNativeLogCapture(): void {
|
|
111
|
+
client.stopNativeLogCapture()
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Check if native log capture is currently active
|
|
116
|
+
* @returns true if native log capture is enabled
|
|
117
|
+
*/
|
|
118
|
+
isNativeLogCaptureEnabled(): boolean {
|
|
119
|
+
return client.isNativeLogCaptureEnabled()
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Start performance monitoring to track FPS, memory, and CPU
|
|
124
|
+
* @returns true if successfully enabled
|
|
125
|
+
*/
|
|
126
|
+
startPerformanceMonitoring(): boolean {
|
|
127
|
+
return client.startPerformanceMonitoring()
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Stop performance monitoring
|
|
132
|
+
*/
|
|
133
|
+
stopPerformanceMonitoring(): void {
|
|
134
|
+
client.stopPerformanceMonitoring()
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Check if performance monitoring is currently active
|
|
139
|
+
* @returns true if performance monitoring is enabled
|
|
140
|
+
*/
|
|
141
|
+
isPerformanceMonitoringEnabled(): boolean {
|
|
142
|
+
return client.isPerformanceMonitoringEnabled()
|
|
143
|
+
},
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Export types for consumers
|
|
147
|
+
export type {
|
|
148
|
+
SalvetronConfig,
|
|
149
|
+
NetworkRequestEvent,
|
|
150
|
+
NetworkResponseEvent,
|
|
151
|
+
NetworkEvent,
|
|
152
|
+
LogEvent,
|
|
153
|
+
NativeLogEvent,
|
|
154
|
+
LogLevel,
|
|
155
|
+
LogSource,
|
|
156
|
+
NativeLogSource,
|
|
157
|
+
PerformanceMetricsEvent,
|
|
158
|
+
} from './types'
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { JSConsoleInterceptor } from '../js-console'
|
|
2
|
+
import type { JSConsoleCallbacks } from '../js-console'
|
|
3
|
+
|
|
4
|
+
describe('JSConsoleInterceptor', () => {
|
|
5
|
+
let interceptor: JSConsoleInterceptor
|
|
6
|
+
|
|
7
|
+
// Capture real originals before any patching
|
|
8
|
+
const realLog = console.log
|
|
9
|
+
const realWarn = console.warn
|
|
10
|
+
const realError = console.error
|
|
11
|
+
|
|
12
|
+
const createCallbacks = (): { callbacks: JSConsoleCallbacks; onLog: jest.Mock } => {
|
|
13
|
+
const onLog = jest.fn()
|
|
14
|
+
return { callbacks: { onLog }, onLog }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
jest.clearAllMocks()
|
|
19
|
+
|
|
20
|
+
// Reset singleton so each test gets a fresh instance
|
|
21
|
+
;(JSConsoleInterceptor as any).instance = null
|
|
22
|
+
interceptor = JSConsoleInterceptor.getInstance()
|
|
23
|
+
|
|
24
|
+
// Ensure stopped before each test
|
|
25
|
+
interceptor.stop()
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
// Always restore console methods after each test
|
|
30
|
+
interceptor.stop()
|
|
31
|
+
jest.restoreAllMocks()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
afterAll(() => {
|
|
35
|
+
// Guarantee originals are back after the suite
|
|
36
|
+
console.log = realLog
|
|
37
|
+
console.warn = realWarn
|
|
38
|
+
console.error = realError
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// ── start / stop basics ──────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
it('should return true on first start', () => {
|
|
44
|
+
const { callbacks } = createCallbacks()
|
|
45
|
+
expect(interceptor.start(callbacks)).toBe(true)
|
|
46
|
+
expect(interceptor.isEnabled()).toBe(true)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('should no-op (return false) on double start', () => {
|
|
50
|
+
const { callbacks } = createCallbacks()
|
|
51
|
+
interceptor.start(callbacks)
|
|
52
|
+
expect(interceptor.start(callbacks)).toBe(false)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should no-op stop when not enabled', () => {
|
|
56
|
+
expect(() => interceptor.stop()).not.toThrow()
|
|
57
|
+
expect(interceptor.isEnabled()).toBe(false)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// ── console.log forwarding ───────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
it('console.log("hello") → onLog("log", "hello", undefined)', () => {
|
|
63
|
+
const { callbacks, onLog } = createCallbacks()
|
|
64
|
+
interceptor.start(callbacks)
|
|
65
|
+
|
|
66
|
+
console.log('hello')
|
|
67
|
+
|
|
68
|
+
expect(onLog).toHaveBeenCalledTimes(1)
|
|
69
|
+
expect(onLog).toHaveBeenCalledWith('log', 'hello', undefined)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('console.warn("bad", { x: 1 }) → onLog("warn", "bad", { args: [{ x: 1 }] })', () => {
|
|
73
|
+
const { callbacks, onLog } = createCallbacks()
|
|
74
|
+
interceptor.start(callbacks)
|
|
75
|
+
|
|
76
|
+
console.warn('bad', { x: 1 })
|
|
77
|
+
|
|
78
|
+
expect(onLog).toHaveBeenCalledTimes(1)
|
|
79
|
+
expect(onLog).toHaveBeenCalledWith('warn', 'bad', { args: [{ x: 1 }] })
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('console.error("boom") → onLog("error", "boom", undefined)', () => {
|
|
83
|
+
const { callbacks, onLog } = createCallbacks()
|
|
84
|
+
interceptor.start(callbacks)
|
|
85
|
+
|
|
86
|
+
console.error('boom')
|
|
87
|
+
|
|
88
|
+
expect(onLog).toHaveBeenCalledTimes(1)
|
|
89
|
+
expect(onLog).toHaveBeenCalledWith('error', 'boom', undefined)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
// ── multi-arg metadata ────────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
it('multi-arg: console.log("a", "b", "c") → metadata: { args: ["b", "c"] }', () => {
|
|
95
|
+
const { callbacks, onLog } = createCallbacks()
|
|
96
|
+
interceptor.start(callbacks)
|
|
97
|
+
|
|
98
|
+
console.log('a', 'b', 'c')
|
|
99
|
+
|
|
100
|
+
expect(onLog).toHaveBeenCalledWith('log', 'a', { args: ['b', 'c'] })
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
// ── [Salvetron] guard ─────────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
it('console.log("[Salvetron] internal") is not forwarded; original still called', () => {
|
|
106
|
+
const { callbacks, onLog } = createCallbacks()
|
|
107
|
+
|
|
108
|
+
// Replace the stored original BEFORE start() so the patched closure captures our spy
|
|
109
|
+
const originalSpy = jest.fn()
|
|
110
|
+
;(interceptor as any).originalLog = originalSpy
|
|
111
|
+
|
|
112
|
+
interceptor.start(callbacks)
|
|
113
|
+
|
|
114
|
+
console.log('[Salvetron] internal')
|
|
115
|
+
|
|
116
|
+
// Restore properly: stop() will restore console.log to originalSpy,
|
|
117
|
+
// then we put realLog back so subsequent tests are unaffected.
|
|
118
|
+
interceptor.stop()
|
|
119
|
+
console.log = realLog
|
|
120
|
+
|
|
121
|
+
expect(onLog).not.toHaveBeenCalled()
|
|
122
|
+
expect(originalSpy).toHaveBeenCalledWith('[Salvetron] internal')
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
it('non-string first arg with [Salvetron] prefix check does not throw', () => {
|
|
126
|
+
const { callbacks, onLog } = createCallbacks()
|
|
127
|
+
interceptor.start(callbacks)
|
|
128
|
+
|
|
129
|
+
// Non-string first arg: should not match [Salvetron] guard, should forward
|
|
130
|
+
expect(() => console.log({ y: 2 })).not.toThrow()
|
|
131
|
+
expect(onLog).toHaveBeenCalledWith('log', '[object Object]', undefined)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
// ── console.debug / console.info not intercepted ─────────────────────────
|
|
135
|
+
|
|
136
|
+
it('console.debug and console.info are not patched after start', () => {
|
|
137
|
+
const originalDebug = console.debug
|
|
138
|
+
const originalInfo = console.info
|
|
139
|
+
const { callbacks } = createCallbacks()
|
|
140
|
+
|
|
141
|
+
interceptor.start(callbacks)
|
|
142
|
+
|
|
143
|
+
expect(console.debug).toBe(originalDebug)
|
|
144
|
+
expect(console.info).toBe(originalInfo)
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
// ── restore after stop ────────────────────────────────────────────────────
|
|
148
|
+
|
|
149
|
+
it('console.log/warn/error are restored after stop()', () => {
|
|
150
|
+
const { callbacks } = createCallbacks()
|
|
151
|
+
interceptor.start(callbacks)
|
|
152
|
+
|
|
153
|
+
// Methods should be patched
|
|
154
|
+
expect(console.log).not.toBe(realLog)
|
|
155
|
+
expect(console.warn).not.toBe(realWarn)
|
|
156
|
+
expect(console.error).not.toBe(realError)
|
|
157
|
+
|
|
158
|
+
interceptor.stop()
|
|
159
|
+
|
|
160
|
+
expect(console.log).toBe(realLog)
|
|
161
|
+
expect(console.warn).toBe(realWarn)
|
|
162
|
+
expect(console.error).toBe(realError)
|
|
163
|
+
expect(interceptor.isEnabled()).toBe(false)
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
// ── error swallow ─────────────────────────────────────────────────────────
|
|
167
|
+
|
|
168
|
+
it('if onLog throws, original is still called and error is swallowed', () => {
|
|
169
|
+
const throwingCallbacks: JSConsoleCallbacks = {
|
|
170
|
+
onLog: () => { throw new Error('forwarding failed') },
|
|
171
|
+
}
|
|
172
|
+
const originalSpy = jest.fn()
|
|
173
|
+
interceptor.start(throwingCallbacks)
|
|
174
|
+
|
|
175
|
+
// Replace stored original to spy on it
|
|
176
|
+
;(interceptor as any).originalLog = originalSpy
|
|
177
|
+
|
|
178
|
+
expect(() => console.log('test')).not.toThrow()
|
|
179
|
+
expect(originalSpy).toHaveBeenCalledWith('test')
|
|
180
|
+
|
|
181
|
+
// stop() restores console.log to originalSpy (not realLog), so explicitly
|
|
182
|
+
// put realLog back to avoid corrupting subsequent tests.
|
|
183
|
+
interceptor.stop()
|
|
184
|
+
console.log = realLog
|
|
185
|
+
})
|
|
186
|
+
})
|