react-native-nitro-amplitude 0.1.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/.watchmanconfig +6 -0
- package/LICENSE +21 -0
- package/README.md +139 -0
- package/android/CMakeLists.txt +34 -0
- package/android/build.gradle +85 -0
- package/android/consumer-rules.pro +35 -0
- package/android/gradle.properties +4 -0
- package/android/src/main/cpp/AndroidAmplitudeAdapterCpp.cpp +126 -0
- package/android/src/main/cpp/AndroidAmplitudeAdapterCpp.hpp +48 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/nitroamplitude/AndroidAmplitudeAdapter.kt +147 -0
- package/android/src/main/java/com/nitroamplitude/NitroAmplitudePackage.kt +24 -0
- package/app.plugin.js +36 -0
- package/cpp/bindings/HybridAmplitudeContext.cpp +83 -0
- package/cpp/bindings/HybridAmplitudeContext.hpp +29 -0
- package/cpp/bindings/HybridAmplitudeStorage.cpp +163 -0
- package/cpp/bindings/HybridAmplitudeStorage.hpp +38 -0
- package/cpp/bindings/HybridAmplitudeWorker.cpp +162 -0
- package/cpp/bindings/HybridAmplitudeWorker.hpp +74 -0
- package/cpp/core/NativeAmplitudeAdapter.hpp +44 -0
- package/ios/IOSAmplitudeAdapterCpp.hpp +37 -0
- package/ios/IOSAmplitudeAdapterCpp.mm +155 -0
- package/lib/commonjs/AmplitudeContext.nitro.js +6 -0
- package/lib/commonjs/AmplitudeContext.nitro.js.map +1 -0
- package/lib/commonjs/AmplitudeStorage.nitro.js +6 -0
- package/lib/commonjs/AmplitudeStorage.nitro.js.map +1 -0
- package/lib/commonjs/AmplitudeWorker.nitro.js +6 -0
- package/lib/commonjs/AmplitudeWorker.nitro.js.map +1 -0
- package/lib/commonjs/analytics/campaign/campaign-tracker.js +105 -0
- package/lib/commonjs/analytics/campaign/campaign-tracker.js.map +1 -0
- package/lib/commonjs/analytics/campaign/types.js +6 -0
- package/lib/commonjs/analytics/campaign/types.js.map +1 -0
- package/lib/commonjs/analytics/config.js +283 -0
- package/lib/commonjs/analytics/config.js.map +1 -0
- package/lib/commonjs/analytics/cookie-migration/index.js +59 -0
- package/lib/commonjs/analytics/cookie-migration/index.js.map +1 -0
- package/lib/commonjs/analytics/index.js +95 -0
- package/lib/commonjs/analytics/index.js.map +1 -0
- package/lib/commonjs/analytics/migration/remnant-data-migration.js +177 -0
- package/lib/commonjs/analytics/migration/remnant-data-migration.js.map +1 -0
- package/lib/commonjs/analytics/nitro-transport.js +31 -0
- package/lib/commonjs/analytics/nitro-transport.js.map +1 -0
- package/lib/commonjs/analytics/plugins/context.js +140 -0
- package/lib/commonjs/analytics/plugins/context.js.map +1 -0
- package/lib/commonjs/analytics/react-native-client.js +352 -0
- package/lib/commonjs/analytics/react-native-client.js.map +1 -0
- package/lib/commonjs/analytics/storage/local-storage.js +73 -0
- package/lib/commonjs/analytics/storage/local-storage.js.map +1 -0
- package/lib/commonjs/analytics/types.js +175 -0
- package/lib/commonjs/analytics/types.js.map +1 -0
- package/lib/commonjs/analytics/typings/browser-snippet.d.js +6 -0
- package/lib/commonjs/analytics/typings/browser-snippet.d.js.map +1 -0
- package/lib/commonjs/analytics/typings/ua-parser.d.js +2 -0
- package/lib/commonjs/analytics/typings/ua-parser.d.js.map +1 -0
- package/lib/commonjs/analytics/utils/platform.js +16 -0
- package/lib/commonjs/analytics/utils/platform.js.map +1 -0
- package/lib/commonjs/analytics/version.js +8 -0
- package/lib/commonjs/analytics/version.js.map +1 -0
- package/lib/commonjs/experiment/experimentClient.js +792 -0
- package/lib/commonjs/experiment/experimentClient.js.map +1 -0
- package/lib/commonjs/experiment/factory.js +77 -0
- package/lib/commonjs/experiment/factory.js.map +1 -0
- package/lib/commonjs/experiment/gen/version.js +9 -0
- package/lib/commonjs/experiment/gen/version.js.map +1 -0
- package/lib/commonjs/experiment/index.js +143 -0
- package/lib/commonjs/experiment/index.js.map +1 -0
- package/lib/commonjs/experiment/integration/NativeExperimentReactNativeClient.js +11 -0
- package/lib/commonjs/experiment/integration/NativeExperimentReactNativeClient.js.map +1 -0
- package/lib/commonjs/experiment/integration/connector.js +67 -0
- package/lib/commonjs/experiment/integration/connector.js.map +1 -0
- package/lib/commonjs/experiment/integration/default.js +92 -0
- package/lib/commonjs/experiment/integration/default.js.map +1 -0
- package/lib/commonjs/experiment/logger/ampLogger.js +80 -0
- package/lib/commonjs/experiment/logger/ampLogger.js.map +1 -0
- package/lib/commonjs/experiment/logger/consoleLogger.js +60 -0
- package/lib/commonjs/experiment/logger/consoleLogger.js.map +1 -0
- package/lib/commonjs/experiment/storage/cache.js +197 -0
- package/lib/commonjs/experiment/storage/cache.js.map +1 -0
- package/lib/commonjs/experiment/storage/local-storage.js +25 -0
- package/lib/commonjs/experiment/storage/local-storage.js.map +1 -0
- package/lib/commonjs/experiment/stubClient.js +46 -0
- package/lib/commonjs/experiment/stubClient.js.map +1 -0
- package/lib/commonjs/experiment/transport/http.js +72 -0
- package/lib/commonjs/experiment/transport/http.js.map +1 -0
- package/lib/commonjs/experiment/types/client.js +6 -0
- package/lib/commonjs/experiment/types/client.js.map +1 -0
- package/lib/commonjs/experiment/types/config.js +67 -0
- package/lib/commonjs/experiment/types/config.js.map +1 -0
- package/lib/commonjs/experiment/types/exposure.js +2 -0
- package/lib/commonjs/experiment/types/exposure.js.map +1 -0
- package/lib/commonjs/experiment/types/logger.js +42 -0
- package/lib/commonjs/experiment/types/logger.js.map +1 -0
- package/lib/commonjs/experiment/types/source.js +54 -0
- package/lib/commonjs/experiment/types/source.js.map +1 -0
- package/lib/commonjs/experiment/types/storage.js +2 -0
- package/lib/commonjs/experiment/types/storage.js.map +1 -0
- package/lib/commonjs/experiment/types/transport.js +2 -0
- package/lib/commonjs/experiment/types/transport.js.map +1 -0
- package/lib/commonjs/experiment/types/user.js +2 -0
- package/lib/commonjs/experiment/types/user.js.map +1 -0
- package/lib/commonjs/experiment/types/variant.js +2 -0
- package/lib/commonjs/experiment/types/variant.js.map +1 -0
- package/lib/commonjs/experiment/util/backoff.js +54 -0
- package/lib/commonjs/experiment/util/backoff.js.map +1 -0
- package/lib/commonjs/experiment/util/base64.js +23 -0
- package/lib/commonjs/experiment/util/base64.js.map +1 -0
- package/lib/commonjs/experiment/util/convert.js +78 -0
- package/lib/commonjs/experiment/util/convert.js.map +1 -0
- package/lib/commonjs/experiment/util/index.js +25 -0
- package/lib/commonjs/experiment/util/index.js.map +1 -0
- package/lib/commonjs/experiment/util/platform.js +16 -0
- package/lib/commonjs/experiment/util/platform.js.map +1 -0
- package/lib/commonjs/experiment/util/randomstring.js +16 -0
- package/lib/commonjs/experiment/util/randomstring.js.map +1 -0
- package/lib/commonjs/experiment/util/userSessionExposureTracker.js +40 -0
- package/lib/commonjs/experiment/util/userSessionExposureTracker.js.map +1 -0
- package/lib/commonjs/index.js +298 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.web.js +22 -0
- package/lib/commonjs/index.web.js.map +1 -0
- package/lib/commonjs/native/context.js +43 -0
- package/lib/commonjs/native/context.js.map +1 -0
- package/lib/commonjs/native/http.js +62 -0
- package/lib/commonjs/native/http.js.map +1 -0
- package/lib/commonjs/native/hybrid.js +31 -0
- package/lib/commonjs/native/hybrid.js.map +1 -0
- package/lib/commonjs/native/storage.js +93 -0
- package/lib/commonjs/native/storage.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/module/AmplitudeContext.nitro.js +4 -0
- package/lib/module/AmplitudeContext.nitro.js.map +1 -0
- package/lib/module/AmplitudeStorage.nitro.js +4 -0
- package/lib/module/AmplitudeStorage.nitro.js.map +1 -0
- package/lib/module/AmplitudeWorker.nitro.js +4 -0
- package/lib/module/AmplitudeWorker.nitro.js.map +1 -0
- package/lib/module/analytics/campaign/campaign-tracker.js +100 -0
- package/lib/module/analytics/campaign/campaign-tracker.js.map +1 -0
- package/lib/module/analytics/campaign/types.js +4 -0
- package/lib/module/analytics/campaign/types.js.map +1 -0
- package/lib/module/analytics/config.js +272 -0
- package/lib/module/analytics/config.js.map +1 -0
- package/lib/module/analytics/cookie-migration/index.js +51 -0
- package/lib/module/analytics/cookie-migration/index.js.map +1 -0
- package/lib/module/analytics/index.js +34 -0
- package/lib/module/analytics/index.js.map +1 -0
- package/lib/module/analytics/migration/remnant-data-migration.js +172 -0
- package/lib/module/analytics/migration/remnant-data-migration.js.map +1 -0
- package/lib/module/analytics/nitro-transport.js +26 -0
- package/lib/module/analytics/nitro-transport.js.map +1 -0
- package/lib/module/analytics/plugins/context.js +134 -0
- package/lib/module/analytics/plugins/context.js.map +1 -0
- package/lib/module/analytics/react-native-client.js +346 -0
- package/lib/module/analytics/react-native-client.js.map +1 -0
- package/lib/module/analytics/storage/local-storage.js +68 -0
- package/lib/module/analytics/storage/local-storage.js.map +1 -0
- package/lib/module/analytics/types.js +4 -0
- package/lib/module/analytics/types.js.map +1 -0
- package/lib/module/analytics/typings/browser-snippet.d.js +4 -0
- package/lib/module/analytics/typings/browser-snippet.d.js.map +1 -0
- package/lib/module/analytics/typings/ua-parser.d.js +2 -0
- package/lib/module/analytics/typings/ua-parser.d.js.map +1 -0
- package/lib/module/analytics/utils/platform.js +10 -0
- package/lib/module/analytics/utils/platform.js.map +1 -0
- package/lib/module/analytics/version.js +4 -0
- package/lib/module/analytics/version.js.map +1 -0
- package/lib/module/experiment/experimentClient.js +788 -0
- package/lib/module/experiment/experimentClient.js.map +1 -0
- package/lib/module/experiment/factory.js +73 -0
- package/lib/module/experiment/factory.js.map +1 -0
- package/lib/module/experiment/gen/version.js +5 -0
- package/lib/module/experiment/gen/version.js.map +1 -0
- package/lib/module/experiment/index.js +16 -0
- package/lib/module/experiment/index.js.map +1 -0
- package/lib/module/experiment/integration/NativeExperimentReactNativeClient.js +7 -0
- package/lib/module/experiment/integration/NativeExperimentReactNativeClient.js.map +1 -0
- package/lib/module/experiment/integration/connector.js +61 -0
- package/lib/module/experiment/integration/connector.js.map +1 -0
- package/lib/module/experiment/integration/default.js +87 -0
- package/lib/module/experiment/integration/default.js.map +1 -0
- package/lib/module/experiment/logger/ampLogger.js +76 -0
- package/lib/module/experiment/logger/ampLogger.js.map +1 -0
- package/lib/module/experiment/logger/consoleLogger.js +55 -0
- package/lib/module/experiment/logger/consoleLogger.js.map +1 -0
- package/lib/module/experiment/storage/cache.js +187 -0
- package/lib/module/experiment/storage/cache.js.map +1 -0
- package/lib/module/experiment/storage/local-storage.js +19 -0
- package/lib/module/experiment/storage/local-storage.js.map +1 -0
- package/lib/module/experiment/stubClient.js +41 -0
- package/lib/module/experiment/stubClient.js.map +1 -0
- package/lib/module/experiment/transport/http.js +66 -0
- package/lib/module/experiment/transport/http.js.map +1 -0
- package/lib/module/experiment/types/client.js +4 -0
- package/lib/module/experiment/types/client.js.map +1 -0
- package/lib/module/experiment/types/config.js +64 -0
- package/lib/module/experiment/types/config.js.map +1 -0
- package/lib/module/experiment/types/exposure.js +2 -0
- package/lib/module/experiment/types/exposure.js.map +1 -0
- package/lib/module/experiment/types/logger.js +39 -0
- package/lib/module/experiment/types/logger.js.map +1 -0
- package/lib/module/experiment/types/source.js +51 -0
- package/lib/module/experiment/types/source.js.map +1 -0
- package/lib/module/experiment/types/storage.js +2 -0
- package/lib/module/experiment/types/storage.js.map +1 -0
- package/lib/module/experiment/types/transport.js +2 -0
- package/lib/module/experiment/types/transport.js.map +1 -0
- package/lib/module/experiment/types/user.js +2 -0
- package/lib/module/experiment/types/user.js.map +1 -0
- package/lib/module/experiment/types/variant.js +2 -0
- package/lib/module/experiment/types/variant.js.map +1 -0
- package/lib/module/experiment/util/backoff.js +49 -0
- package/lib/module/experiment/util/backoff.js.map +1 -0
- package/lib/module/experiment/util/base64.js +16 -0
- package/lib/module/experiment/util/base64.js.map +1 -0
- package/lib/module/experiment/util/convert.js +71 -0
- package/lib/module/experiment/util/convert.js.map +1 -0
- package/lib/module/experiment/util/index.js +17 -0
- package/lib/module/experiment/util/index.js.map +1 -0
- package/lib/module/experiment/util/platform.js +10 -0
- package/lib/module/experiment/util/platform.js.map +1 -0
- package/lib/module/experiment/util/randomstring.js +11 -0
- package/lib/module/experiment/util/randomstring.js.map +1 -0
- package/lib/module/experiment/util/userSessionExposureTracker.js +35 -0
- package/lib/module/experiment/util/userSessionExposureTracker.js.map +1 -0
- package/lib/module/index.js +50 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.web.js +14 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/native/context.js +35 -0
- package/lib/module/native/context.js.map +1 -0
- package/lib/module/native/http.js +57 -0
- package/lib/module/native/http.js.map +1 -0
- package/lib/module/native/hybrid.js +24 -0
- package/lib/module/native/hybrid.js.map +1 -0
- package/lib/module/native/storage.js +86 -0
- package/lib/module/native/storage.js.map +1 -0
- package/lib/typescript/AmplitudeContext.nitro.d.ts +17 -0
- package/lib/typescript/AmplitudeContext.nitro.d.ts.map +1 -0
- package/lib/typescript/AmplitudeStorage.nitro.d.ts +17 -0
- package/lib/typescript/AmplitudeStorage.nitro.d.ts.map +1 -0
- package/lib/typescript/AmplitudeWorker.nitro.d.ts +11 -0
- package/lib/typescript/AmplitudeWorker.nitro.d.ts.map +1 -0
- package/lib/typescript/analytics/campaign/campaign-tracker.d.ts +85 -0
- package/lib/typescript/analytics/campaign/campaign-tracker.d.ts.map +1 -0
- package/lib/typescript/analytics/campaign/types.d.ts +11 -0
- package/lib/typescript/analytics/campaign/types.d.ts.map +1 -0
- package/lib/typescript/analytics/config.d.ts +68 -0
- package/lib/typescript/analytics/config.d.ts.map +1 -0
- package/lib/typescript/analytics/cookie-migration/index.d.ts +6 -0
- package/lib/typescript/analytics/cookie-migration/index.d.ts.map +1 -0
- package/lib/typescript/analytics/index.d.ts +7 -0
- package/lib/typescript/analytics/index.d.ts.map +1 -0
- package/lib/typescript/analytics/migration/remnant-data-migration.d.ts +20 -0
- package/lib/typescript/analytics/migration/remnant-data-migration.d.ts.map +1 -0
- package/lib/typescript/analytics/nitro-transport.d.ts +9 -0
- package/lib/typescript/analytics/nitro-transport.d.ts.map +1 -0
- package/lib/typescript/analytics/plugins/context.d.ts +14 -0
- package/lib/typescript/analytics/plugins/context.d.ts.map +1 -0
- package/lib/typescript/analytics/react-native-client.d.ts +55 -0
- package/lib/typescript/analytics/react-native-client.d.ts.map +1 -0
- package/lib/typescript/analytics/storage/local-storage.d.ts +14 -0
- package/lib/typescript/analytics/storage/local-storage.d.ts.map +1 -0
- package/lib/typescript/analytics/types.d.ts +2 -0
- package/lib/typescript/analytics/types.d.ts.map +1 -0
- package/lib/typescript/analytics/utils/platform.d.ts +3 -0
- package/lib/typescript/analytics/utils/platform.d.ts.map +1 -0
- package/lib/typescript/analytics/version.d.ts +2 -0
- package/lib/typescript/analytics/version.d.ts.map +1 -0
- package/lib/typescript/experiment/experimentClient.d.ts +234 -0
- package/lib/typescript/experiment/experimentClient.d.ts.map +1 -0
- package/lib/typescript/experiment/factory.d.ts +11 -0
- package/lib/typescript/experiment/factory.d.ts.map +1 -0
- package/lib/typescript/experiment/gen/version.d.ts +2 -0
- package/lib/typescript/experiment/gen/version.d.ts.map +1 -0
- package/lib/typescript/experiment/index.d.ts +15 -0
- package/lib/typescript/experiment/index.d.ts.map +1 -0
- package/lib/typescript/experiment/integration/NativeExperimentReactNativeClient.d.ts +16 -0
- package/lib/typescript/experiment/integration/NativeExperimentReactNativeClient.d.ts.map +1 -0
- package/lib/typescript/experiment/integration/connector.d.ts +16 -0
- package/lib/typescript/experiment/integration/connector.d.ts.map +1 -0
- package/lib/typescript/experiment/integration/default.d.ts +20 -0
- package/lib/typescript/experiment/integration/default.d.ts.map +1 -0
- package/lib/typescript/experiment/logger/ampLogger.d.ts +47 -0
- package/lib/typescript/experiment/logger/ampLogger.d.ts.map +1 -0
- package/lib/typescript/experiment/logger/consoleLogger.d.ts +40 -0
- package/lib/typescript/experiment/logger/consoleLogger.d.ts.map +1 -0
- package/lib/typescript/experiment/storage/cache.d.ts +35 -0
- package/lib/typescript/experiment/storage/cache.d.ts.map +1 -0
- package/lib/typescript/experiment/storage/local-storage.d.ts +11 -0
- package/lib/typescript/experiment/storage/local-storage.d.ts.map +1 -0
- package/lib/typescript/experiment/stubClient.d.ts +21 -0
- package/lib/typescript/experiment/stubClient.d.ts.map +1 -0
- package/lib/typescript/experiment/transport/http.d.ts +17 -0
- package/lib/typescript/experiment/transport/http.d.ts.map +1 -0
- package/lib/typescript/experiment/types/client.d.ts +36 -0
- package/lib/typescript/experiment/types/client.d.ts.map +1 -0
- package/lib/typescript/experiment/types/config.d.ts +164 -0
- package/lib/typescript/experiment/types/config.d.ts.map +1 -0
- package/lib/typescript/experiment/types/exposure.d.ts +107 -0
- package/lib/typescript/experiment/types/exposure.d.ts.map +1 -0
- package/lib/typescript/experiment/types/logger.d.ts +67 -0
- package/lib/typescript/experiment/types/logger.d.ts.map +1 -0
- package/lib/typescript/experiment/types/source.d.ts +43 -0
- package/lib/typescript/experiment/types/source.d.ts.map +1 -0
- package/lib/typescript/experiment/types/storage.d.ts +7 -0
- package/lib/typescript/experiment/types/storage.d.ts.map +1 -0
- package/lib/typescript/experiment/types/transport.d.ts +8 -0
- package/lib/typescript/experiment/types/transport.d.ts.map +1 -0
- package/lib/typescript/experiment/types/user.d.ts +106 -0
- package/lib/typescript/experiment/types/user.d.ts.map +1 -0
- package/lib/typescript/experiment/types/variant.d.ts +33 -0
- package/lib/typescript/experiment/types/variant.d.ts.map +1 -0
- package/lib/typescript/experiment/util/backoff.d.ts +14 -0
- package/lib/typescript/experiment/util/backoff.d.ts.map +1 -0
- package/lib/typescript/experiment/util/base64.d.ts +3 -0
- package/lib/typescript/experiment/util/base64.d.ts.map +1 -0
- package/lib/typescript/experiment/util/convert.d.ts +7 -0
- package/lib/typescript/experiment/util/convert.d.ts.map +1 -0
- package/lib/typescript/experiment/util/index.d.ts +6 -0
- package/lib/typescript/experiment/util/index.d.ts.map +1 -0
- package/lib/typescript/experiment/util/platform.d.ts +3 -0
- package/lib/typescript/experiment/util/platform.d.ts.map +1 -0
- package/lib/typescript/experiment/util/randomstring.d.ts +2 -0
- package/lib/typescript/experiment/util/randomstring.d.ts.map +1 -0
- package/lib/typescript/experiment/util/userSessionExposureTracker.d.ts +16 -0
- package/lib/typescript/experiment/util/userSessionExposureTracker.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +31 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/index.web.d.ts +12 -0
- package/lib/typescript/index.web.d.ts.map +1 -0
- package/lib/typescript/native/context.d.ts +29 -0
- package/lib/typescript/native/context.d.ts.map +1 -0
- package/lib/typescript/native/http.d.ts +6 -0
- package/lib/typescript/native/http.d.ts.map +1 -0
- package/lib/typescript/native/hybrid.d.ts +8 -0
- package/lib/typescript/native/hybrid.d.ts.map +1 -0
- package/lib/typescript/native/storage.d.ts +29 -0
- package/lib/typescript/native/storage.d.ts.map +1 -0
- package/nitro.json +33 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroAmplitude+autolinking.cmake +83 -0
- package/nitrogen/generated/android/NitroAmplitude+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroAmplitudeOnLoad.cpp +69 -0
- package/nitrogen/generated/android/NitroAmplitudeOnLoad.hpp +34 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitroamplitude/NitroAmplitudeOnLoad.kt +35 -0
- package/nitrogen/generated/ios/NitroAmplitude+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Umbrella.hpp +38 -0
- package/nitrogen/generated/ios/NitroAmplitudeAutolinking.mm +55 -0
- package/nitrogen/generated/ios/NitroAmplitudeAutolinking.swift +16 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeContextSpec.cpp +25 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeContextSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeStorageSpec.cpp +30 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeStorageSpec.hpp +73 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeWorkerSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridAmplitudeWorkerSpec.hpp +66 -0
- package/package.json +130 -0
- package/react-native-nitro-amplitude.podspec +36 -0
- package/src/AmplitudeContext.nitro.ts +21 -0
- package/src/AmplitudeStorage.nitro.ts +17 -0
- package/src/AmplitudeWorker.nitro.ts +25 -0
- package/src/analytics/campaign/campaign-tracker.ts +162 -0
- package/src/analytics/campaign/types.ts +18 -0
- package/src/analytics/config.ts +373 -0
- package/src/analytics/cookie-migration/index.ts +69 -0
- package/src/analytics/index.ts +36 -0
- package/src/analytics/migration/remnant-data-migration.ts +206 -0
- package/src/analytics/nitro-transport.ts +35 -0
- package/src/analytics/plugins/context.ts +166 -0
- package/src/analytics/react-native-client.ts +573 -0
- package/src/analytics/storage/local-storage.ts +76 -0
- package/src/analytics/types.ts +30 -0
- package/src/analytics/typings/browser-snippet.d.ts +7 -0
- package/src/analytics/typings/ua-parser.d.ts +4 -0
- package/src/analytics/utils/platform.ts +9 -0
- package/src/analytics/version.ts +1 -0
- package/src/experiment/experimentClient.ts +987 -0
- package/src/experiment/factory.ts +86 -0
- package/src/experiment/gen/version.ts +2 -0
- package/src/experiment/index.ts +14 -0
- package/src/experiment/integration/NativeExperimentReactNativeClient.ts +25 -0
- package/src/experiment/integration/connector.ts +82 -0
- package/src/experiment/integration/default.ts +107 -0
- package/src/experiment/logger/ampLogger.ts +76 -0
- package/src/experiment/logger/consoleLogger.ts +54 -0
- package/src/experiment/storage/cache.ts +271 -0
- package/src/experiment/storage/local-storage.ts +23 -0
- package/src/experiment/stubClient.ts +61 -0
- package/src/experiment/transport/http.ts +105 -0
- package/src/experiment/types/client.ts +38 -0
- package/src/experiment/types/config.ts +210 -0
- package/src/experiment/types/exposure.ts +107 -0
- package/src/experiment/types/logger.ts +71 -0
- package/src/experiment/types/source.ts +52 -0
- package/src/experiment/types/storage.ts +6 -0
- package/src/experiment/types/transport.ts +14 -0
- package/src/experiment/types/user.ts +132 -0
- package/src/experiment/types/variant.ts +36 -0
- package/src/experiment/util/backoff.ts +67 -0
- package/src/experiment/util/base64.ts +20 -0
- package/src/experiment/util/convert.ts +78 -0
- package/src/experiment/util/index.ts +23 -0
- package/src/experiment/util/platform.ts +9 -0
- package/src/experiment/util/randomstring.ts +12 -0
- package/src/experiment/util/userSessionExposureTracker.ts +47 -0
- package/src/index.ts +66 -0
- package/src/index.web.ts +19 -0
- package/src/native/context.ts +73 -0
- package/src/native/http.ts +77 -0
- package/src/native/hybrid.ts +32 -0
- package/src/native/storage.ts +107 -0
package/.watchmanconfig
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 João Paulo C. Marra
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# react-native-nitro-amplitude
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/react-native-nitro-amplitude)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://reactnative.dev/)
|
|
6
|
+
[](https://nitro.margelo.com/)
|
|
7
|
+
|
|
8
|
+
High-performance Amplitude Analytics and Experiment SDK for React Native, powered by Nitro Modules and C++.
|
|
9
|
+
|
|
10
|
+
This package combines the public APIs of `amplitude-rn-analytics` and `amplitude-rn-experiment` with a native Nitro layer for:
|
|
11
|
+
|
|
12
|
+
- synchronous JSI key-value storage (analytics events + experiment variants)
|
|
13
|
+
- synchronous device/application context collection
|
|
14
|
+
- background HTTP transport for uploads and experiment fetches
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
bun add react-native-nitro-amplitude react-native-nitro-modules@>=0.35.7
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Peer dependencies: `react`, `react-native`, and `react-native-nitro-modules >=0.35.7`.
|
|
23
|
+
|
|
24
|
+
Expo SDK 56:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
bunx expo install react-native-nitro-amplitude react-native-nitro-modules
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Add the config plugin and prebuild:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"expo": {
|
|
35
|
+
"plugins": ["react-native-nitro-amplitude"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Analytics quick start
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { init, track, identify, flush } from "react-native-nitro-amplitude";
|
|
44
|
+
|
|
45
|
+
await init("YOUR_API_KEY", "user-id", {
|
|
46
|
+
instanceName: "$default_instance",
|
|
47
|
+
trackingSessionEvents: true,
|
|
48
|
+
}).promise;
|
|
49
|
+
|
|
50
|
+
track("button_clicked", { screen: "home" });
|
|
51
|
+
await flush().promise;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Experiment quick start
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { Experiment, init } from "react-native-nitro-amplitude";
|
|
58
|
+
|
|
59
|
+
await init("YOUR_API_KEY").promise;
|
|
60
|
+
|
|
61
|
+
const experiment = Experiment.initializeWithAmplitudeAnalytics("YOUR_API_KEY");
|
|
62
|
+
await experiment.start();
|
|
63
|
+
|
|
64
|
+
const variant = experiment.variant("my-flag");
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Compatibility imports
|
|
68
|
+
|
|
69
|
+
The root entry exports both Analytics and Experiment APIs for new code:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { init, track, Experiment } from "react-native-nitro-amplitude";
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For migrations that need a clearer boundary between the two original packages,
|
|
76
|
+
the package also exposes compatibility subpaths:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { init, track } from "react-native-nitro-amplitude/analytics";
|
|
80
|
+
import { Experiment } from "react-native-nitro-amplitude/experiment";
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`react-native-nitro-amplitude/analytics` mirrors the public entrypoint shape of
|
|
84
|
+
`amplitude-rn-analytics`. `react-native-nitro-amplitude/experiment` mirrors the
|
|
85
|
+
public entrypoint shape of `amplitude-rn-experiment`.
|
|
86
|
+
|
|
87
|
+
## Native HybridObjects
|
|
88
|
+
|
|
89
|
+
| Object | Purpose |
|
|
90
|
+
| ------------------ | ----------------------------------------------- |
|
|
91
|
+
| `AmplitudeContext` | Device context + legacy SDK migration hooks |
|
|
92
|
+
| `AmplitudeStorage` | Memory + disk KV for analytics/experiment state |
|
|
93
|
+
| `AmplitudeWorker` | Background HTTP queue |
|
|
94
|
+
|
|
95
|
+
## Upstream compatibility
|
|
96
|
+
|
|
97
|
+
This package is a Nitro-first replacement, not a forked merge of the two source
|
|
98
|
+
packages. The JavaScript API surface is intentionally aligned with:
|
|
99
|
+
|
|
100
|
+
- `amplitude-rn-analytics` 1.6.0 for analytics client methods, storage provider
|
|
101
|
+
contracts, exported `Revenue`, `Identify`, and `Types`.
|
|
102
|
+
- `amplitude-rn-experiment` 1.8.13 for `Experiment`, `ExperimentClient`,
|
|
103
|
+
config/user/variant/exposure/storage types, loggers, and memory storage.
|
|
104
|
+
|
|
105
|
+
The default implementations differ where Nitro provides the native layer:
|
|
106
|
+
|
|
107
|
+
- analytics storage uses Nitro-backed memory/disk storage by default;
|
|
108
|
+
- experiment storage uses Nitro-backed storage by default;
|
|
109
|
+
- analytics upload and experiment fetches use the native `AmplitudeWorker`;
|
|
110
|
+
- native context is read through the `AmplitudeContext` HybridObject.
|
|
111
|
+
|
|
112
|
+
## Platform support
|
|
113
|
+
|
|
114
|
+
| Platform | Analytics | Experiment | Native Nitro |
|
|
115
|
+
| -------- | ----------------------------------------- | ----------- | ------------ |
|
|
116
|
+
| iOS | Yes | Yes | Yes |
|
|
117
|
+
| Android | Yes | Yes | Yes |
|
|
118
|
+
| Web | Unsupported entry (`index.web.ts` throws) | Unsupported | No |
|
|
119
|
+
|
|
120
|
+
## Development
|
|
121
|
+
|
|
122
|
+
From the monorepo root:
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
bun install
|
|
126
|
+
bun run codegen
|
|
127
|
+
bun run build
|
|
128
|
+
bun run check
|
|
129
|
+
bun run example:generate-icons # after editing apps/example/scripts/generate-icons.sh
|
|
130
|
+
bun run example:prebuild:clean
|
|
131
|
+
bun run example:android
|
|
132
|
+
bun run example:ios
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
See [AGENTS.md](./AGENTS.md) for package invariants and release bar.
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
MIT
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.18.0)
|
|
2
|
+
|
|
3
|
+
project(NitroAmplitude)
|
|
4
|
+
|
|
5
|
+
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
6
|
+
set(CMAKE_CXX_STANDARD 20)
|
|
7
|
+
|
|
8
|
+
file(GLOB SOURCES
|
|
9
|
+
"../cpp/bindings/*.cpp"
|
|
10
|
+
"./src/main/cpp/*.cpp"
|
|
11
|
+
)
|
|
12
|
+
list(FILTER SOURCES EXCLUDE REGEX ".*/[^/]*Test\\.cpp$")
|
|
13
|
+
|
|
14
|
+
add_library(
|
|
15
|
+
NitroAmplitude
|
|
16
|
+
SHARED
|
|
17
|
+
${SOURCES}
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
target_include_directories(
|
|
21
|
+
NitroAmplitude
|
|
22
|
+
PRIVATE
|
|
23
|
+
"../cpp/core"
|
|
24
|
+
"../cpp/bindings"
|
|
25
|
+
"./src/main/cpp"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
include("../nitrogen/generated/android/NitroAmplitude+autolinking.cmake")
|
|
29
|
+
|
|
30
|
+
target_link_libraries(
|
|
31
|
+
NitroAmplitude
|
|
32
|
+
android
|
|
33
|
+
log
|
|
34
|
+
)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
buildscript {
|
|
2
|
+
repositories {
|
|
3
|
+
google()
|
|
4
|
+
mavenCentral()
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
dependencies {
|
|
8
|
+
classpath "com.android.tools.build:gradle:8.10.1"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
def reactNativeArchitectures() {
|
|
13
|
+
def value = rootProject.getProperties().get("reactNativeArchitectures")
|
|
14
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
apply plugin: "com.android.library"
|
|
18
|
+
apply plugin: "org.jetbrains.kotlin.android"
|
|
19
|
+
// Apply autolinking script for Nitro
|
|
20
|
+
apply from: "../nitrogen/generated/android/NitroAmplitude+autolinking.gradle"
|
|
21
|
+
|
|
22
|
+
def getExtOrDefault(name) {
|
|
23
|
+
return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["NitroAmplitude_" + name]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
def getExtOrIntegerDefault(name) {
|
|
27
|
+
return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NitroAmplitude_" + name]).toInteger()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
android {
|
|
31
|
+
namespace = "com.nitroamplitude"
|
|
32
|
+
|
|
33
|
+
// Use values from root project or defaults
|
|
34
|
+
ndkVersion = getExtOrDefault("ndkVersion")
|
|
35
|
+
compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
|
|
36
|
+
|
|
37
|
+
defaultConfig {
|
|
38
|
+
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
|
|
39
|
+
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
|
|
40
|
+
consumerProguardFiles "consumer-rules.pro"
|
|
41
|
+
|
|
42
|
+
externalNativeBuild {
|
|
43
|
+
cmake {
|
|
44
|
+
cppFlags "-frtti -fexceptions -Wall -Wextra -fstack-protector-all"
|
|
45
|
+
arguments "-DANDROID_STL=c++_shared", "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
|
|
46
|
+
abiFilters (*reactNativeArchitectures())
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
externalNativeBuild {
|
|
52
|
+
cmake {
|
|
53
|
+
path "CMakeLists.txt"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
buildFeatures {
|
|
58
|
+
buildConfig = true
|
|
59
|
+
prefab = true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
compileOptions {
|
|
63
|
+
sourceCompatibility JavaVersion.VERSION_1_8
|
|
64
|
+
targetCompatibility JavaVersion.VERSION_1_8
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
sourceSets {
|
|
68
|
+
main {
|
|
69
|
+
java.srcDirs += ["src/main/java"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
repositories {
|
|
75
|
+
mavenCentral()
|
|
76
|
+
google()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
dependencies {
|
|
80
|
+
//noinspection GradleDynamicVersion
|
|
81
|
+
implementation "com.facebook.react:react-native:+"
|
|
82
|
+
implementation "androidx.security:security-crypto:1.1.0"
|
|
83
|
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
|
|
84
|
+
implementation project(":react-native-nitro-modules")
|
|
85
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# NitroAmplitude - JNI-callable methods must survive R8/ProGuard shrinking
|
|
2
|
+
|
|
3
|
+
-keep class com.nitroamplitude.AndroidAmplitudeAdapter {
|
|
4
|
+
public static *** setContext(...);
|
|
5
|
+
public static *** getContext(...);
|
|
6
|
+
public static *** prefetchContext(...);
|
|
7
|
+
public static *** getApplicationContextJson(...);
|
|
8
|
+
public static *** getLegacySessionDataJson(...);
|
|
9
|
+
public static *** getLegacyEventsJson(...);
|
|
10
|
+
public static *** removeLegacyEvent(...);
|
|
11
|
+
public static *** setDisk(...);
|
|
12
|
+
public static *** getDisk(...);
|
|
13
|
+
public static *** deleteDisk(...);
|
|
14
|
+
public static *** hasDisk(...);
|
|
15
|
+
public static *** getAllDiskKeys(...);
|
|
16
|
+
public static *** performHttpRequest(...);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
-keep class com.nitroamplitude.AndroidAmplitudeAdapter$Companion {
|
|
20
|
+
public <methods>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
-keep class com.nitroamplitude.NitroAmplitudePackage {
|
|
24
|
+
<init>();
|
|
25
|
+
<clinit>();
|
|
26
|
+
*;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
-keep class com.nitroamplitude.NitroAmplitudePackageKt {
|
|
30
|
+
public static *** initializeNitroAmplitude(...);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
-keep class com.margelo.nitro.com.nitroamplitude.NitroAmplitudeOnLoad {
|
|
34
|
+
public static *** initializeNative(...);
|
|
35
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#include "AndroidAmplitudeAdapterCpp.hpp"
|
|
2
|
+
|
|
3
|
+
namespace NitroAmplitude {
|
|
4
|
+
|
|
5
|
+
using namespace facebook::jni;
|
|
6
|
+
using JavaStringArray = JArrayClass<jstring>;
|
|
7
|
+
|
|
8
|
+
namespace {
|
|
9
|
+
|
|
10
|
+
std::vector<std::string> fromJavaStringArray(alias_ref<JavaStringArray> values) {
|
|
11
|
+
if (!values) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
std::vector<std::string> result;
|
|
15
|
+
const jsize size = values->size();
|
|
16
|
+
result.reserve(size);
|
|
17
|
+
for (jsize i = 0; i < size; ++i) {
|
|
18
|
+
auto current = values->getElement(i);
|
|
19
|
+
result.push_back(current ? current->toStdString() : std::string());
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
} // namespace
|
|
25
|
+
|
|
26
|
+
AndroidAmplitudeAdapterCpp::AndroidAmplitudeAdapterCpp(alias_ref<JObject> /*context*/) {}
|
|
27
|
+
|
|
28
|
+
void AndroidAmplitudeAdapterCpp::prefetchContext() {
|
|
29
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<void()>("prefetchContext");
|
|
30
|
+
method(AndroidAmplitudeAdapterJava::javaClassStatic());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
std::string AndroidAmplitudeAdapterCpp::getApplicationContextJson(const std::string& optionsJson) {
|
|
34
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<jstring(std::string)>(
|
|
35
|
+
"getApplicationContextJson", "(Ljava/lang/String;)Ljava/lang/String;");
|
|
36
|
+
auto result = method(AndroidAmplitudeAdapterJava::javaClassStatic(), optionsJson);
|
|
37
|
+
return result ? result->toStdString() : std::string("{}");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
std::string AndroidAmplitudeAdapterCpp::getLegacySessionDataJson(const std::string& instanceName) {
|
|
41
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<jstring(std::string)>(
|
|
42
|
+
"getLegacySessionDataJson", "(Ljava/lang/String;)Ljava/lang/String;");
|
|
43
|
+
auto result = method(AndroidAmplitudeAdapterJava::javaClassStatic(), instanceName);
|
|
44
|
+
return result ? result->toStdString() : std::string("{}");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
std::vector<std::string> AndroidAmplitudeAdapterCpp::getLegacyEventsJson(
|
|
48
|
+
const std::string& instanceName,
|
|
49
|
+
const std::string& eventKind) {
|
|
50
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<JavaStringArray(std::string, std::string)>(
|
|
51
|
+
"getLegacyEventsJson", "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;");
|
|
52
|
+
return fromJavaStringArray(method(AndroidAmplitudeAdapterJava::javaClassStatic(), instanceName, eventKind));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void AndroidAmplitudeAdapterCpp::removeLegacyEvent(
|
|
56
|
+
const std::string& instanceName,
|
|
57
|
+
const std::string& eventKind,
|
|
58
|
+
int64_t eventId) {
|
|
59
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<void(std::string, std::string, jlong)>(
|
|
60
|
+
"removeLegacyEvent", "(Ljava/lang/String;Ljava/lang/String;J)V");
|
|
61
|
+
method(AndroidAmplitudeAdapterJava::javaClassStatic(), instanceName, eventKind, eventId);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void AndroidAmplitudeAdapterCpp::setDisk(const std::string& key, const std::string& value) {
|
|
65
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<void(std::string, std::string)>(
|
|
66
|
+
"setDisk", "(Ljava/lang/String;Ljava/lang/String;)V");
|
|
67
|
+
method(AndroidAmplitudeAdapterJava::javaClassStatic(), key, value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
std::optional<std::string> AndroidAmplitudeAdapterCpp::getDisk(const std::string& key) {
|
|
71
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<jstring(std::string)>(
|
|
72
|
+
"getDisk", "(Ljava/lang/String;)Ljava/lang/String;");
|
|
73
|
+
auto result = method(AndroidAmplitudeAdapterJava::javaClassStatic(), key);
|
|
74
|
+
if (!result) {
|
|
75
|
+
return std::nullopt;
|
|
76
|
+
}
|
|
77
|
+
return result->toStdString();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void AndroidAmplitudeAdapterCpp::deleteDisk(const std::string& key) {
|
|
81
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<void(std::string)>(
|
|
82
|
+
"deleteDisk", "(Ljava/lang/String;)V");
|
|
83
|
+
method(AndroidAmplitudeAdapterJava::javaClassStatic(), key);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
bool AndroidAmplitudeAdapterCpp::hasDisk(const std::string& key) {
|
|
87
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<jboolean(std::string)>(
|
|
88
|
+
"hasDisk", "(Ljava/lang/String;)Z");
|
|
89
|
+
return method(AndroidAmplitudeAdapterJava::javaClassStatic(), key);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
std::vector<std::string> AndroidAmplitudeAdapterCpp::getAllDiskKeys() {
|
|
93
|
+
static auto method = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<JavaStringArray()>(
|
|
94
|
+
"getAllDiskKeys", "()[Ljava/lang/String;");
|
|
95
|
+
return fromJavaStringArray(method(AndroidAmplitudeAdapterJava::javaClassStatic()));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
HttpResult AndroidAmplitudeAdapterCpp::performHttpRequest(
|
|
99
|
+
const std::string& url,
|
|
100
|
+
const std::string& method,
|
|
101
|
+
const std::string& headersJson,
|
|
102
|
+
const std::string& body,
|
|
103
|
+
int timeoutMillis) {
|
|
104
|
+
static auto requestMethod = AndroidAmplitudeAdapterJava::javaClassStatic()->getStaticMethod<JavaStringArray(
|
|
105
|
+
std::string, std::string, std::string, std::string, jint)>(
|
|
106
|
+
"performHttpRequest",
|
|
107
|
+
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)[Ljava/lang/String;");
|
|
108
|
+
const auto result = fromJavaStringArray(requestMethod(
|
|
109
|
+
AndroidAmplitudeAdapterJava::javaClassStatic(),
|
|
110
|
+
url,
|
|
111
|
+
method,
|
|
112
|
+
headersJson,
|
|
113
|
+
body,
|
|
114
|
+
timeoutMillis));
|
|
115
|
+
HttpResult httpResult;
|
|
116
|
+
if (result.size() >= 3) {
|
|
117
|
+
httpResult.statusCode = std::stoi(result[0]);
|
|
118
|
+
httpResult.body = result[1];
|
|
119
|
+
httpResult.error = result[2];
|
|
120
|
+
} else {
|
|
121
|
+
httpResult.error = "Invalid HTTP response from Android adapter";
|
|
122
|
+
}
|
|
123
|
+
return httpResult;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
} // namespace NitroAmplitude
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "../../cpp/core/NativeAmplitudeAdapter.hpp"
|
|
4
|
+
#include <fbjni/fbjni.h>
|
|
5
|
+
|
|
6
|
+
namespace NitroAmplitude {
|
|
7
|
+
|
|
8
|
+
struct AndroidAmplitudeAdapterJava : facebook::jni::JavaClass<AndroidAmplitudeAdapterJava> {
|
|
9
|
+
static constexpr auto kJavaDescriptor = "Lcom/nitroamplitude/AndroidAmplitudeAdapter;";
|
|
10
|
+
|
|
11
|
+
static facebook::jni::alias_ref<facebook::jni::JObject> getContext() {
|
|
12
|
+
static auto method = javaClassStatic()->getStaticMethod<facebook::jni::JObject()>(
|
|
13
|
+
"getContext", "()Landroid/content/Context;");
|
|
14
|
+
return method(javaClassStatic());
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
class AndroidAmplitudeAdapterCpp : public NativeAmplitudeAdapter {
|
|
19
|
+
public:
|
|
20
|
+
explicit AndroidAmplitudeAdapterCpp(facebook::jni::alias_ref<facebook::jni::JObject> context);
|
|
21
|
+
~AndroidAmplitudeAdapterCpp() override = default;
|
|
22
|
+
|
|
23
|
+
void prefetchContext() override;
|
|
24
|
+
std::string getApplicationContextJson(const std::string& optionsJson) override;
|
|
25
|
+
std::string getLegacySessionDataJson(const std::string& instanceName) override;
|
|
26
|
+
std::vector<std::string> getLegacyEventsJson(
|
|
27
|
+
const std::string& instanceName,
|
|
28
|
+
const std::string& eventKind) override;
|
|
29
|
+
void removeLegacyEvent(
|
|
30
|
+
const std::string& instanceName,
|
|
31
|
+
const std::string& eventKind,
|
|
32
|
+
int64_t eventId) override;
|
|
33
|
+
|
|
34
|
+
void setDisk(const std::string& key, const std::string& value) override;
|
|
35
|
+
std::optional<std::string> getDisk(const std::string& key) override;
|
|
36
|
+
void deleteDisk(const std::string& key) override;
|
|
37
|
+
bool hasDisk(const std::string& key) override;
|
|
38
|
+
std::vector<std::string> getAllDiskKeys() override;
|
|
39
|
+
|
|
40
|
+
HttpResult performHttpRequest(
|
|
41
|
+
const std::string& url,
|
|
42
|
+
const std::string& method,
|
|
43
|
+
const std::string& headersJson,
|
|
44
|
+
const std::string& body,
|
|
45
|
+
int timeoutMillis) override;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
} // namespace NitroAmplitude
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#include <jni.h>
|
|
2
|
+
#include <fbjni/fbjni.h>
|
|
3
|
+
#include "../../../nitrogen/generated/android/NitroAmplitudeOnLoad.hpp"
|
|
4
|
+
|
|
5
|
+
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
6
|
+
return facebook::jni::initialize(vm, []() {
|
|
7
|
+
margelo::nitro::NitroAmplitude::registerAllNatives();
|
|
8
|
+
});
|
|
9
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
package com.nitroamplitude
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.SharedPreferences
|
|
5
|
+
import android.os.Build
|
|
6
|
+
import org.json.JSONObject
|
|
7
|
+
import java.io.BufferedReader
|
|
8
|
+
import java.io.InputStreamReader
|
|
9
|
+
import java.net.HttpURLConnection
|
|
10
|
+
import java.net.URL
|
|
11
|
+
import java.util.Locale
|
|
12
|
+
import java.util.concurrent.Executors
|
|
13
|
+
|
|
14
|
+
object AndroidAmplitudeAdapter {
|
|
15
|
+
private var appContext: Context? = null
|
|
16
|
+
private val executor = Executors.newSingleThreadExecutor()
|
|
17
|
+
private var cachedContextJson: String = "{}"
|
|
18
|
+
|
|
19
|
+
@JvmStatic
|
|
20
|
+
fun setContext(context: Context) {
|
|
21
|
+
appContext = context.applicationContext
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@JvmStatic
|
|
25
|
+
fun getContext(): Context {
|
|
26
|
+
return appContext ?: throw IllegalStateException("NitroAmplitude context not initialized")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private fun prefs(): SharedPreferences {
|
|
30
|
+
return getContext().getSharedPreferences("NitroAmplitude", Context.MODE_PRIVATE)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@JvmStatic
|
|
34
|
+
fun prefetchContext() {
|
|
35
|
+
executor.execute { cachedContextJson = buildApplicationContextJson("{}") }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@JvmStatic
|
|
39
|
+
fun getApplicationContextJson(optionsJson: String): String {
|
|
40
|
+
return buildApplicationContextJson(optionsJson)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private fun buildApplicationContextJson(optionsJson: String): String {
|
|
44
|
+
val context = getContext()
|
|
45
|
+
val options = try {
|
|
46
|
+
JSONObject(optionsJson)
|
|
47
|
+
} catch (_: Exception) {
|
|
48
|
+
JSONObject()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
val locale = context.resources.configuration.locales[0]
|
|
52
|
+
val json = JSONObject()
|
|
53
|
+
json.put("version", context.packageManager.getPackageInfo(context.packageName, 0).versionName)
|
|
54
|
+
json.put("platform", "Android")
|
|
55
|
+
json.put("language", locale.language)
|
|
56
|
+
json.put("country", locale.country)
|
|
57
|
+
json.put("osName", "android")
|
|
58
|
+
json.put("osVersion", Build.VERSION.RELEASE)
|
|
59
|
+
json.put("deviceManufacturer", Build.MANUFACTURER)
|
|
60
|
+
json.put("deviceModel", Build.MODEL)
|
|
61
|
+
json.put("deviceBrand", Build.BRAND)
|
|
62
|
+
if (options.optBoolean("carrier", false)) {
|
|
63
|
+
json.put("carrier", "")
|
|
64
|
+
}
|
|
65
|
+
if (options.optBoolean("idfv", false)) {
|
|
66
|
+
json.put("idfv", "")
|
|
67
|
+
}
|
|
68
|
+
if (options.optBoolean("adid", false)) {
|
|
69
|
+
json.put("adid", "")
|
|
70
|
+
}
|
|
71
|
+
if (options.optBoolean("appSetId", false)) {
|
|
72
|
+
json.put("appSetId", "")
|
|
73
|
+
}
|
|
74
|
+
return json.toString()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@JvmStatic
|
|
78
|
+
fun getLegacySessionDataJson(instanceName: String): String = "{}"
|
|
79
|
+
|
|
80
|
+
@JvmStatic
|
|
81
|
+
fun getLegacyEventsJson(instanceName: String, eventKind: String): Array<String> = emptyArray()
|
|
82
|
+
|
|
83
|
+
@JvmStatic
|
|
84
|
+
fun removeLegacyEvent(instanceName: String, eventKind: String, eventId: Long) {}
|
|
85
|
+
|
|
86
|
+
@JvmStatic
|
|
87
|
+
fun setDisk(key: String, value: String) {
|
|
88
|
+
prefs().edit().putString(key, value).apply()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@JvmStatic
|
|
92
|
+
fun getDisk(key: String): String? = prefs().getString(key, null)
|
|
93
|
+
|
|
94
|
+
@JvmStatic
|
|
95
|
+
fun deleteDisk(key: String) {
|
|
96
|
+
prefs().edit().remove(key).apply()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@JvmStatic
|
|
100
|
+
fun hasDisk(key: String): Boolean = prefs().contains(key)
|
|
101
|
+
|
|
102
|
+
@JvmStatic
|
|
103
|
+
fun getAllDiskKeys(): Array<String> = prefs().all.keys.toTypedArray()
|
|
104
|
+
|
|
105
|
+
@JvmStatic
|
|
106
|
+
fun performHttpRequest(
|
|
107
|
+
url: String,
|
|
108
|
+
method: String,
|
|
109
|
+
headersJson: String,
|
|
110
|
+
body: String,
|
|
111
|
+
timeoutMillis: Int,
|
|
112
|
+
): Array<String> {
|
|
113
|
+
val connection = (URL(url).openConnection() as HttpURLConnection).apply {
|
|
114
|
+
requestMethod = method
|
|
115
|
+
connectTimeout = timeoutMillis
|
|
116
|
+
readTimeout = timeoutMillis
|
|
117
|
+
doInput = true
|
|
118
|
+
val headers = try {
|
|
119
|
+
JSONObject(headersJson)
|
|
120
|
+
} catch (_: Exception) {
|
|
121
|
+
JSONObject()
|
|
122
|
+
}
|
|
123
|
+
val keys = headers.keys()
|
|
124
|
+
while (keys.hasNext()) {
|
|
125
|
+
val key = keys.next()
|
|
126
|
+
setRequestProperty(key, headers.optString(key))
|
|
127
|
+
}
|
|
128
|
+
if (body.isNotEmpty()) {
|
|
129
|
+
doOutput = true
|
|
130
|
+
outputStream.use { stream -> stream.write(body.toByteArray()) }
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return try {
|
|
135
|
+
val status = connection.responseCode
|
|
136
|
+
val stream = if (status >= 400) connection.errorStream else connection.inputStream
|
|
137
|
+
val responseBody = stream?.let {
|
|
138
|
+
BufferedReader(InputStreamReader(it)).use { reader -> reader.readText() }
|
|
139
|
+
} ?: ""
|
|
140
|
+
arrayOf(status.toString(), responseBody, "")
|
|
141
|
+
} catch (error: Exception) {
|
|
142
|
+
arrayOf("0", "", error.message ?: "HTTP request failed")
|
|
143
|
+
} finally {
|
|
144
|
+
connection.disconnect()
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package com.nitroamplitude
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
7
|
+
import com.margelo.nitro.com.nitroamplitude.NitroAmplitudeOnLoad
|
|
8
|
+
|
|
9
|
+
class NitroAmplitudePackage : BaseReactPackage() {
|
|
10
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? = null
|
|
11
|
+
|
|
12
|
+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider = ReactModuleInfoProvider { emptyMap() }
|
|
13
|
+
|
|
14
|
+
companion object {
|
|
15
|
+
init {
|
|
16
|
+
System.loadLibrary("NitroAmplitude")
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fun initializeNitroAmplitude(context: ReactApplicationContext) {
|
|
22
|
+
AndroidAmplitudeAdapter.setContext(context)
|
|
23
|
+
NitroAmplitudeOnLoad.initializeNative()
|
|
24
|
+
}
|