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.
Files changed (411) hide show
  1. package/.watchmanconfig +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +139 -0
  4. package/android/CMakeLists.txt +34 -0
  5. package/android/build.gradle +85 -0
  6. package/android/consumer-rules.pro +35 -0
  7. package/android/gradle.properties +4 -0
  8. package/android/src/main/cpp/AndroidAmplitudeAdapterCpp.cpp +126 -0
  9. package/android/src/main/cpp/AndroidAmplitudeAdapterCpp.hpp +48 -0
  10. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  11. package/android/src/main/java/com/nitroamplitude/AndroidAmplitudeAdapter.kt +147 -0
  12. package/android/src/main/java/com/nitroamplitude/NitroAmplitudePackage.kt +24 -0
  13. package/app.plugin.js +36 -0
  14. package/cpp/bindings/HybridAmplitudeContext.cpp +83 -0
  15. package/cpp/bindings/HybridAmplitudeContext.hpp +29 -0
  16. package/cpp/bindings/HybridAmplitudeStorage.cpp +163 -0
  17. package/cpp/bindings/HybridAmplitudeStorage.hpp +38 -0
  18. package/cpp/bindings/HybridAmplitudeWorker.cpp +162 -0
  19. package/cpp/bindings/HybridAmplitudeWorker.hpp +74 -0
  20. package/cpp/core/NativeAmplitudeAdapter.hpp +44 -0
  21. package/ios/IOSAmplitudeAdapterCpp.hpp +37 -0
  22. package/ios/IOSAmplitudeAdapterCpp.mm +155 -0
  23. package/lib/commonjs/AmplitudeContext.nitro.js +6 -0
  24. package/lib/commonjs/AmplitudeContext.nitro.js.map +1 -0
  25. package/lib/commonjs/AmplitudeStorage.nitro.js +6 -0
  26. package/lib/commonjs/AmplitudeStorage.nitro.js.map +1 -0
  27. package/lib/commonjs/AmplitudeWorker.nitro.js +6 -0
  28. package/lib/commonjs/AmplitudeWorker.nitro.js.map +1 -0
  29. package/lib/commonjs/analytics/campaign/campaign-tracker.js +105 -0
  30. package/lib/commonjs/analytics/campaign/campaign-tracker.js.map +1 -0
  31. package/lib/commonjs/analytics/campaign/types.js +6 -0
  32. package/lib/commonjs/analytics/campaign/types.js.map +1 -0
  33. package/lib/commonjs/analytics/config.js +283 -0
  34. package/lib/commonjs/analytics/config.js.map +1 -0
  35. package/lib/commonjs/analytics/cookie-migration/index.js +59 -0
  36. package/lib/commonjs/analytics/cookie-migration/index.js.map +1 -0
  37. package/lib/commonjs/analytics/index.js +95 -0
  38. package/lib/commonjs/analytics/index.js.map +1 -0
  39. package/lib/commonjs/analytics/migration/remnant-data-migration.js +177 -0
  40. package/lib/commonjs/analytics/migration/remnant-data-migration.js.map +1 -0
  41. package/lib/commonjs/analytics/nitro-transport.js +31 -0
  42. package/lib/commonjs/analytics/nitro-transport.js.map +1 -0
  43. package/lib/commonjs/analytics/plugins/context.js +140 -0
  44. package/lib/commonjs/analytics/plugins/context.js.map +1 -0
  45. package/lib/commonjs/analytics/react-native-client.js +352 -0
  46. package/lib/commonjs/analytics/react-native-client.js.map +1 -0
  47. package/lib/commonjs/analytics/storage/local-storage.js +73 -0
  48. package/lib/commonjs/analytics/storage/local-storage.js.map +1 -0
  49. package/lib/commonjs/analytics/types.js +175 -0
  50. package/lib/commonjs/analytics/types.js.map +1 -0
  51. package/lib/commonjs/analytics/typings/browser-snippet.d.js +6 -0
  52. package/lib/commonjs/analytics/typings/browser-snippet.d.js.map +1 -0
  53. package/lib/commonjs/analytics/typings/ua-parser.d.js +2 -0
  54. package/lib/commonjs/analytics/typings/ua-parser.d.js.map +1 -0
  55. package/lib/commonjs/analytics/utils/platform.js +16 -0
  56. package/lib/commonjs/analytics/utils/platform.js.map +1 -0
  57. package/lib/commonjs/analytics/version.js +8 -0
  58. package/lib/commonjs/analytics/version.js.map +1 -0
  59. package/lib/commonjs/experiment/experimentClient.js +792 -0
  60. package/lib/commonjs/experiment/experimentClient.js.map +1 -0
  61. package/lib/commonjs/experiment/factory.js +77 -0
  62. package/lib/commonjs/experiment/factory.js.map +1 -0
  63. package/lib/commonjs/experiment/gen/version.js +9 -0
  64. package/lib/commonjs/experiment/gen/version.js.map +1 -0
  65. package/lib/commonjs/experiment/index.js +143 -0
  66. package/lib/commonjs/experiment/index.js.map +1 -0
  67. package/lib/commonjs/experiment/integration/NativeExperimentReactNativeClient.js +11 -0
  68. package/lib/commonjs/experiment/integration/NativeExperimentReactNativeClient.js.map +1 -0
  69. package/lib/commonjs/experiment/integration/connector.js +67 -0
  70. package/lib/commonjs/experiment/integration/connector.js.map +1 -0
  71. package/lib/commonjs/experiment/integration/default.js +92 -0
  72. package/lib/commonjs/experiment/integration/default.js.map +1 -0
  73. package/lib/commonjs/experiment/logger/ampLogger.js +80 -0
  74. package/lib/commonjs/experiment/logger/ampLogger.js.map +1 -0
  75. package/lib/commonjs/experiment/logger/consoleLogger.js +60 -0
  76. package/lib/commonjs/experiment/logger/consoleLogger.js.map +1 -0
  77. package/lib/commonjs/experiment/storage/cache.js +197 -0
  78. package/lib/commonjs/experiment/storage/cache.js.map +1 -0
  79. package/lib/commonjs/experiment/storage/local-storage.js +25 -0
  80. package/lib/commonjs/experiment/storage/local-storage.js.map +1 -0
  81. package/lib/commonjs/experiment/stubClient.js +46 -0
  82. package/lib/commonjs/experiment/stubClient.js.map +1 -0
  83. package/lib/commonjs/experiment/transport/http.js +72 -0
  84. package/lib/commonjs/experiment/transport/http.js.map +1 -0
  85. package/lib/commonjs/experiment/types/client.js +6 -0
  86. package/lib/commonjs/experiment/types/client.js.map +1 -0
  87. package/lib/commonjs/experiment/types/config.js +67 -0
  88. package/lib/commonjs/experiment/types/config.js.map +1 -0
  89. package/lib/commonjs/experiment/types/exposure.js +2 -0
  90. package/lib/commonjs/experiment/types/exposure.js.map +1 -0
  91. package/lib/commonjs/experiment/types/logger.js +42 -0
  92. package/lib/commonjs/experiment/types/logger.js.map +1 -0
  93. package/lib/commonjs/experiment/types/source.js +54 -0
  94. package/lib/commonjs/experiment/types/source.js.map +1 -0
  95. package/lib/commonjs/experiment/types/storage.js +2 -0
  96. package/lib/commonjs/experiment/types/storage.js.map +1 -0
  97. package/lib/commonjs/experiment/types/transport.js +2 -0
  98. package/lib/commonjs/experiment/types/transport.js.map +1 -0
  99. package/lib/commonjs/experiment/types/user.js +2 -0
  100. package/lib/commonjs/experiment/types/user.js.map +1 -0
  101. package/lib/commonjs/experiment/types/variant.js +2 -0
  102. package/lib/commonjs/experiment/types/variant.js.map +1 -0
  103. package/lib/commonjs/experiment/util/backoff.js +54 -0
  104. package/lib/commonjs/experiment/util/backoff.js.map +1 -0
  105. package/lib/commonjs/experiment/util/base64.js +23 -0
  106. package/lib/commonjs/experiment/util/base64.js.map +1 -0
  107. package/lib/commonjs/experiment/util/convert.js +78 -0
  108. package/lib/commonjs/experiment/util/convert.js.map +1 -0
  109. package/lib/commonjs/experiment/util/index.js +25 -0
  110. package/lib/commonjs/experiment/util/index.js.map +1 -0
  111. package/lib/commonjs/experiment/util/platform.js +16 -0
  112. package/lib/commonjs/experiment/util/platform.js.map +1 -0
  113. package/lib/commonjs/experiment/util/randomstring.js +16 -0
  114. package/lib/commonjs/experiment/util/randomstring.js.map +1 -0
  115. package/lib/commonjs/experiment/util/userSessionExposureTracker.js +40 -0
  116. package/lib/commonjs/experiment/util/userSessionExposureTracker.js.map +1 -0
  117. package/lib/commonjs/index.js +298 -0
  118. package/lib/commonjs/index.js.map +1 -0
  119. package/lib/commonjs/index.web.js +22 -0
  120. package/lib/commonjs/index.web.js.map +1 -0
  121. package/lib/commonjs/native/context.js +43 -0
  122. package/lib/commonjs/native/context.js.map +1 -0
  123. package/lib/commonjs/native/http.js +62 -0
  124. package/lib/commonjs/native/http.js.map +1 -0
  125. package/lib/commonjs/native/hybrid.js +31 -0
  126. package/lib/commonjs/native/hybrid.js.map +1 -0
  127. package/lib/commonjs/native/storage.js +93 -0
  128. package/lib/commonjs/native/storage.js.map +1 -0
  129. package/lib/commonjs/package.json +1 -0
  130. package/lib/module/AmplitudeContext.nitro.js +4 -0
  131. package/lib/module/AmplitudeContext.nitro.js.map +1 -0
  132. package/lib/module/AmplitudeStorage.nitro.js +4 -0
  133. package/lib/module/AmplitudeStorage.nitro.js.map +1 -0
  134. package/lib/module/AmplitudeWorker.nitro.js +4 -0
  135. package/lib/module/AmplitudeWorker.nitro.js.map +1 -0
  136. package/lib/module/analytics/campaign/campaign-tracker.js +100 -0
  137. package/lib/module/analytics/campaign/campaign-tracker.js.map +1 -0
  138. package/lib/module/analytics/campaign/types.js +4 -0
  139. package/lib/module/analytics/campaign/types.js.map +1 -0
  140. package/lib/module/analytics/config.js +272 -0
  141. package/lib/module/analytics/config.js.map +1 -0
  142. package/lib/module/analytics/cookie-migration/index.js +51 -0
  143. package/lib/module/analytics/cookie-migration/index.js.map +1 -0
  144. package/lib/module/analytics/index.js +34 -0
  145. package/lib/module/analytics/index.js.map +1 -0
  146. package/lib/module/analytics/migration/remnant-data-migration.js +172 -0
  147. package/lib/module/analytics/migration/remnant-data-migration.js.map +1 -0
  148. package/lib/module/analytics/nitro-transport.js +26 -0
  149. package/lib/module/analytics/nitro-transport.js.map +1 -0
  150. package/lib/module/analytics/plugins/context.js +134 -0
  151. package/lib/module/analytics/plugins/context.js.map +1 -0
  152. package/lib/module/analytics/react-native-client.js +346 -0
  153. package/lib/module/analytics/react-native-client.js.map +1 -0
  154. package/lib/module/analytics/storage/local-storage.js +68 -0
  155. package/lib/module/analytics/storage/local-storage.js.map +1 -0
  156. package/lib/module/analytics/types.js +4 -0
  157. package/lib/module/analytics/types.js.map +1 -0
  158. package/lib/module/analytics/typings/browser-snippet.d.js +4 -0
  159. package/lib/module/analytics/typings/browser-snippet.d.js.map +1 -0
  160. package/lib/module/analytics/typings/ua-parser.d.js +2 -0
  161. package/lib/module/analytics/typings/ua-parser.d.js.map +1 -0
  162. package/lib/module/analytics/utils/platform.js +10 -0
  163. package/lib/module/analytics/utils/platform.js.map +1 -0
  164. package/lib/module/analytics/version.js +4 -0
  165. package/lib/module/analytics/version.js.map +1 -0
  166. package/lib/module/experiment/experimentClient.js +788 -0
  167. package/lib/module/experiment/experimentClient.js.map +1 -0
  168. package/lib/module/experiment/factory.js +73 -0
  169. package/lib/module/experiment/factory.js.map +1 -0
  170. package/lib/module/experiment/gen/version.js +5 -0
  171. package/lib/module/experiment/gen/version.js.map +1 -0
  172. package/lib/module/experiment/index.js +16 -0
  173. package/lib/module/experiment/index.js.map +1 -0
  174. package/lib/module/experiment/integration/NativeExperimentReactNativeClient.js +7 -0
  175. package/lib/module/experiment/integration/NativeExperimentReactNativeClient.js.map +1 -0
  176. package/lib/module/experiment/integration/connector.js +61 -0
  177. package/lib/module/experiment/integration/connector.js.map +1 -0
  178. package/lib/module/experiment/integration/default.js +87 -0
  179. package/lib/module/experiment/integration/default.js.map +1 -0
  180. package/lib/module/experiment/logger/ampLogger.js +76 -0
  181. package/lib/module/experiment/logger/ampLogger.js.map +1 -0
  182. package/lib/module/experiment/logger/consoleLogger.js +55 -0
  183. package/lib/module/experiment/logger/consoleLogger.js.map +1 -0
  184. package/lib/module/experiment/storage/cache.js +187 -0
  185. package/lib/module/experiment/storage/cache.js.map +1 -0
  186. package/lib/module/experiment/storage/local-storage.js +19 -0
  187. package/lib/module/experiment/storage/local-storage.js.map +1 -0
  188. package/lib/module/experiment/stubClient.js +41 -0
  189. package/lib/module/experiment/stubClient.js.map +1 -0
  190. package/lib/module/experiment/transport/http.js +66 -0
  191. package/lib/module/experiment/transport/http.js.map +1 -0
  192. package/lib/module/experiment/types/client.js +4 -0
  193. package/lib/module/experiment/types/client.js.map +1 -0
  194. package/lib/module/experiment/types/config.js +64 -0
  195. package/lib/module/experiment/types/config.js.map +1 -0
  196. package/lib/module/experiment/types/exposure.js +2 -0
  197. package/lib/module/experiment/types/exposure.js.map +1 -0
  198. package/lib/module/experiment/types/logger.js +39 -0
  199. package/lib/module/experiment/types/logger.js.map +1 -0
  200. package/lib/module/experiment/types/source.js +51 -0
  201. package/lib/module/experiment/types/source.js.map +1 -0
  202. package/lib/module/experiment/types/storage.js +2 -0
  203. package/lib/module/experiment/types/storage.js.map +1 -0
  204. package/lib/module/experiment/types/transport.js +2 -0
  205. package/lib/module/experiment/types/transport.js.map +1 -0
  206. package/lib/module/experiment/types/user.js +2 -0
  207. package/lib/module/experiment/types/user.js.map +1 -0
  208. package/lib/module/experiment/types/variant.js +2 -0
  209. package/lib/module/experiment/types/variant.js.map +1 -0
  210. package/lib/module/experiment/util/backoff.js +49 -0
  211. package/lib/module/experiment/util/backoff.js.map +1 -0
  212. package/lib/module/experiment/util/base64.js +16 -0
  213. package/lib/module/experiment/util/base64.js.map +1 -0
  214. package/lib/module/experiment/util/convert.js +71 -0
  215. package/lib/module/experiment/util/convert.js.map +1 -0
  216. package/lib/module/experiment/util/index.js +17 -0
  217. package/lib/module/experiment/util/index.js.map +1 -0
  218. package/lib/module/experiment/util/platform.js +10 -0
  219. package/lib/module/experiment/util/platform.js.map +1 -0
  220. package/lib/module/experiment/util/randomstring.js +11 -0
  221. package/lib/module/experiment/util/randomstring.js.map +1 -0
  222. package/lib/module/experiment/util/userSessionExposureTracker.js +35 -0
  223. package/lib/module/experiment/util/userSessionExposureTracker.js.map +1 -0
  224. package/lib/module/index.js +50 -0
  225. package/lib/module/index.js.map +1 -0
  226. package/lib/module/index.web.js +14 -0
  227. package/lib/module/index.web.js.map +1 -0
  228. package/lib/module/native/context.js +35 -0
  229. package/lib/module/native/context.js.map +1 -0
  230. package/lib/module/native/http.js +57 -0
  231. package/lib/module/native/http.js.map +1 -0
  232. package/lib/module/native/hybrid.js +24 -0
  233. package/lib/module/native/hybrid.js.map +1 -0
  234. package/lib/module/native/storage.js +86 -0
  235. package/lib/module/native/storage.js.map +1 -0
  236. package/lib/typescript/AmplitudeContext.nitro.d.ts +17 -0
  237. package/lib/typescript/AmplitudeContext.nitro.d.ts.map +1 -0
  238. package/lib/typescript/AmplitudeStorage.nitro.d.ts +17 -0
  239. package/lib/typescript/AmplitudeStorage.nitro.d.ts.map +1 -0
  240. package/lib/typescript/AmplitudeWorker.nitro.d.ts +11 -0
  241. package/lib/typescript/AmplitudeWorker.nitro.d.ts.map +1 -0
  242. package/lib/typescript/analytics/campaign/campaign-tracker.d.ts +85 -0
  243. package/lib/typescript/analytics/campaign/campaign-tracker.d.ts.map +1 -0
  244. package/lib/typescript/analytics/campaign/types.d.ts +11 -0
  245. package/lib/typescript/analytics/campaign/types.d.ts.map +1 -0
  246. package/lib/typescript/analytics/config.d.ts +68 -0
  247. package/lib/typescript/analytics/config.d.ts.map +1 -0
  248. package/lib/typescript/analytics/cookie-migration/index.d.ts +6 -0
  249. package/lib/typescript/analytics/cookie-migration/index.d.ts.map +1 -0
  250. package/lib/typescript/analytics/index.d.ts +7 -0
  251. package/lib/typescript/analytics/index.d.ts.map +1 -0
  252. package/lib/typescript/analytics/migration/remnant-data-migration.d.ts +20 -0
  253. package/lib/typescript/analytics/migration/remnant-data-migration.d.ts.map +1 -0
  254. package/lib/typescript/analytics/nitro-transport.d.ts +9 -0
  255. package/lib/typescript/analytics/nitro-transport.d.ts.map +1 -0
  256. package/lib/typescript/analytics/plugins/context.d.ts +14 -0
  257. package/lib/typescript/analytics/plugins/context.d.ts.map +1 -0
  258. package/lib/typescript/analytics/react-native-client.d.ts +55 -0
  259. package/lib/typescript/analytics/react-native-client.d.ts.map +1 -0
  260. package/lib/typescript/analytics/storage/local-storage.d.ts +14 -0
  261. package/lib/typescript/analytics/storage/local-storage.d.ts.map +1 -0
  262. package/lib/typescript/analytics/types.d.ts +2 -0
  263. package/lib/typescript/analytics/types.d.ts.map +1 -0
  264. package/lib/typescript/analytics/utils/platform.d.ts +3 -0
  265. package/lib/typescript/analytics/utils/platform.d.ts.map +1 -0
  266. package/lib/typescript/analytics/version.d.ts +2 -0
  267. package/lib/typescript/analytics/version.d.ts.map +1 -0
  268. package/lib/typescript/experiment/experimentClient.d.ts +234 -0
  269. package/lib/typescript/experiment/experimentClient.d.ts.map +1 -0
  270. package/lib/typescript/experiment/factory.d.ts +11 -0
  271. package/lib/typescript/experiment/factory.d.ts.map +1 -0
  272. package/lib/typescript/experiment/gen/version.d.ts +2 -0
  273. package/lib/typescript/experiment/gen/version.d.ts.map +1 -0
  274. package/lib/typescript/experiment/index.d.ts +15 -0
  275. package/lib/typescript/experiment/index.d.ts.map +1 -0
  276. package/lib/typescript/experiment/integration/NativeExperimentReactNativeClient.d.ts +16 -0
  277. package/lib/typescript/experiment/integration/NativeExperimentReactNativeClient.d.ts.map +1 -0
  278. package/lib/typescript/experiment/integration/connector.d.ts +16 -0
  279. package/lib/typescript/experiment/integration/connector.d.ts.map +1 -0
  280. package/lib/typescript/experiment/integration/default.d.ts +20 -0
  281. package/lib/typescript/experiment/integration/default.d.ts.map +1 -0
  282. package/lib/typescript/experiment/logger/ampLogger.d.ts +47 -0
  283. package/lib/typescript/experiment/logger/ampLogger.d.ts.map +1 -0
  284. package/lib/typescript/experiment/logger/consoleLogger.d.ts +40 -0
  285. package/lib/typescript/experiment/logger/consoleLogger.d.ts.map +1 -0
  286. package/lib/typescript/experiment/storage/cache.d.ts +35 -0
  287. package/lib/typescript/experiment/storage/cache.d.ts.map +1 -0
  288. package/lib/typescript/experiment/storage/local-storage.d.ts +11 -0
  289. package/lib/typescript/experiment/storage/local-storage.d.ts.map +1 -0
  290. package/lib/typescript/experiment/stubClient.d.ts +21 -0
  291. package/lib/typescript/experiment/stubClient.d.ts.map +1 -0
  292. package/lib/typescript/experiment/transport/http.d.ts +17 -0
  293. package/lib/typescript/experiment/transport/http.d.ts.map +1 -0
  294. package/lib/typescript/experiment/types/client.d.ts +36 -0
  295. package/lib/typescript/experiment/types/client.d.ts.map +1 -0
  296. package/lib/typescript/experiment/types/config.d.ts +164 -0
  297. package/lib/typescript/experiment/types/config.d.ts.map +1 -0
  298. package/lib/typescript/experiment/types/exposure.d.ts +107 -0
  299. package/lib/typescript/experiment/types/exposure.d.ts.map +1 -0
  300. package/lib/typescript/experiment/types/logger.d.ts +67 -0
  301. package/lib/typescript/experiment/types/logger.d.ts.map +1 -0
  302. package/lib/typescript/experiment/types/source.d.ts +43 -0
  303. package/lib/typescript/experiment/types/source.d.ts.map +1 -0
  304. package/lib/typescript/experiment/types/storage.d.ts +7 -0
  305. package/lib/typescript/experiment/types/storage.d.ts.map +1 -0
  306. package/lib/typescript/experiment/types/transport.d.ts +8 -0
  307. package/lib/typescript/experiment/types/transport.d.ts.map +1 -0
  308. package/lib/typescript/experiment/types/user.d.ts +106 -0
  309. package/lib/typescript/experiment/types/user.d.ts.map +1 -0
  310. package/lib/typescript/experiment/types/variant.d.ts +33 -0
  311. package/lib/typescript/experiment/types/variant.d.ts.map +1 -0
  312. package/lib/typescript/experiment/util/backoff.d.ts +14 -0
  313. package/lib/typescript/experiment/util/backoff.d.ts.map +1 -0
  314. package/lib/typescript/experiment/util/base64.d.ts +3 -0
  315. package/lib/typescript/experiment/util/base64.d.ts.map +1 -0
  316. package/lib/typescript/experiment/util/convert.d.ts +7 -0
  317. package/lib/typescript/experiment/util/convert.d.ts.map +1 -0
  318. package/lib/typescript/experiment/util/index.d.ts +6 -0
  319. package/lib/typescript/experiment/util/index.d.ts.map +1 -0
  320. package/lib/typescript/experiment/util/platform.d.ts +3 -0
  321. package/lib/typescript/experiment/util/platform.d.ts.map +1 -0
  322. package/lib/typescript/experiment/util/randomstring.d.ts +2 -0
  323. package/lib/typescript/experiment/util/randomstring.d.ts.map +1 -0
  324. package/lib/typescript/experiment/util/userSessionExposureTracker.d.ts +16 -0
  325. package/lib/typescript/experiment/util/userSessionExposureTracker.d.ts.map +1 -0
  326. package/lib/typescript/index.d.ts +31 -0
  327. package/lib/typescript/index.d.ts.map +1 -0
  328. package/lib/typescript/index.web.d.ts +12 -0
  329. package/lib/typescript/index.web.d.ts.map +1 -0
  330. package/lib/typescript/native/context.d.ts +29 -0
  331. package/lib/typescript/native/context.d.ts.map +1 -0
  332. package/lib/typescript/native/http.d.ts +6 -0
  333. package/lib/typescript/native/http.d.ts.map +1 -0
  334. package/lib/typescript/native/hybrid.d.ts +8 -0
  335. package/lib/typescript/native/hybrid.d.ts.map +1 -0
  336. package/lib/typescript/native/storage.d.ts +29 -0
  337. package/lib/typescript/native/storage.d.ts.map +1 -0
  338. package/nitro.json +33 -0
  339. package/nitrogen/generated/.gitattributes +1 -0
  340. package/nitrogen/generated/android/NitroAmplitude+autolinking.cmake +83 -0
  341. package/nitrogen/generated/android/NitroAmplitude+autolinking.gradle +27 -0
  342. package/nitrogen/generated/android/NitroAmplitudeOnLoad.cpp +69 -0
  343. package/nitrogen/generated/android/NitroAmplitudeOnLoad.hpp +34 -0
  344. package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitroamplitude/NitroAmplitudeOnLoad.kt +35 -0
  345. package/nitrogen/generated/ios/NitroAmplitude+autolinking.rb +62 -0
  346. package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Bridge.cpp +17 -0
  347. package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Bridge.hpp +27 -0
  348. package/nitrogen/generated/ios/NitroAmplitude-Swift-Cxx-Umbrella.hpp +38 -0
  349. package/nitrogen/generated/ios/NitroAmplitudeAutolinking.mm +55 -0
  350. package/nitrogen/generated/ios/NitroAmplitudeAutolinking.swift +16 -0
  351. package/nitrogen/generated/shared/c++/HybridAmplitudeContextSpec.cpp +25 -0
  352. package/nitrogen/generated/shared/c++/HybridAmplitudeContextSpec.hpp +67 -0
  353. package/nitrogen/generated/shared/c++/HybridAmplitudeStorageSpec.cpp +30 -0
  354. package/nitrogen/generated/shared/c++/HybridAmplitudeStorageSpec.hpp +73 -0
  355. package/nitrogen/generated/shared/c++/HybridAmplitudeWorkerSpec.cpp +24 -0
  356. package/nitrogen/generated/shared/c++/HybridAmplitudeWorkerSpec.hpp +66 -0
  357. package/package.json +130 -0
  358. package/react-native-nitro-amplitude.podspec +36 -0
  359. package/src/AmplitudeContext.nitro.ts +21 -0
  360. package/src/AmplitudeStorage.nitro.ts +17 -0
  361. package/src/AmplitudeWorker.nitro.ts +25 -0
  362. package/src/analytics/campaign/campaign-tracker.ts +162 -0
  363. package/src/analytics/campaign/types.ts +18 -0
  364. package/src/analytics/config.ts +373 -0
  365. package/src/analytics/cookie-migration/index.ts +69 -0
  366. package/src/analytics/index.ts +36 -0
  367. package/src/analytics/migration/remnant-data-migration.ts +206 -0
  368. package/src/analytics/nitro-transport.ts +35 -0
  369. package/src/analytics/plugins/context.ts +166 -0
  370. package/src/analytics/react-native-client.ts +573 -0
  371. package/src/analytics/storage/local-storage.ts +76 -0
  372. package/src/analytics/types.ts +30 -0
  373. package/src/analytics/typings/browser-snippet.d.ts +7 -0
  374. package/src/analytics/typings/ua-parser.d.ts +4 -0
  375. package/src/analytics/utils/platform.ts +9 -0
  376. package/src/analytics/version.ts +1 -0
  377. package/src/experiment/experimentClient.ts +987 -0
  378. package/src/experiment/factory.ts +86 -0
  379. package/src/experiment/gen/version.ts +2 -0
  380. package/src/experiment/index.ts +14 -0
  381. package/src/experiment/integration/NativeExperimentReactNativeClient.ts +25 -0
  382. package/src/experiment/integration/connector.ts +82 -0
  383. package/src/experiment/integration/default.ts +107 -0
  384. package/src/experiment/logger/ampLogger.ts +76 -0
  385. package/src/experiment/logger/consoleLogger.ts +54 -0
  386. package/src/experiment/storage/cache.ts +271 -0
  387. package/src/experiment/storage/local-storage.ts +23 -0
  388. package/src/experiment/stubClient.ts +61 -0
  389. package/src/experiment/transport/http.ts +105 -0
  390. package/src/experiment/types/client.ts +38 -0
  391. package/src/experiment/types/config.ts +210 -0
  392. package/src/experiment/types/exposure.ts +107 -0
  393. package/src/experiment/types/logger.ts +71 -0
  394. package/src/experiment/types/source.ts +52 -0
  395. package/src/experiment/types/storage.ts +6 -0
  396. package/src/experiment/types/transport.ts +14 -0
  397. package/src/experiment/types/user.ts +132 -0
  398. package/src/experiment/types/variant.ts +36 -0
  399. package/src/experiment/util/backoff.ts +67 -0
  400. package/src/experiment/util/base64.ts +20 -0
  401. package/src/experiment/util/convert.ts +78 -0
  402. package/src/experiment/util/index.ts +23 -0
  403. package/src/experiment/util/platform.ts +9 -0
  404. package/src/experiment/util/randomstring.ts +12 -0
  405. package/src/experiment/util/userSessionExposureTracker.ts +47 -0
  406. package/src/index.ts +66 -0
  407. package/src/index.web.ts +19 -0
  408. package/src/native/context.ts +73 -0
  409. package/src/native/http.ts +77 -0
  410. package/src/native/hybrid.ts +32 -0
  411. package/src/native/storage.ts +107 -0
@@ -0,0 +1,6 @@
1
+ {
2
+ "ignore_dirs": [
3
+ "android/.cxx",
4
+ "android/build"
5
+ ]
6
+ }
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
+ [![npm](https://img.shields.io/npm/v/react-native-nitro-amplitude)](https://www.npmjs.com/package/react-native-nitro-amplitude)
4
+ [![MIT license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
+ [![React Native](https://img.shields.io/badge/react--native-%3E%3D0.75-61dafb)](https://reactnative.dev/)
6
+ [![Nitro Modules](https://img.shields.io/badge/nitro--modules-%3E%3D0.35.7-black)](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,4 @@
1
+ NitroAmplitude_ndkVersion=27.1.12297006
2
+ NitroAmplitude_compileSdkVersion=36
3
+ NitroAmplitude_targetSdkVersion=36
4
+ NitroAmplitude_minSdkVersion=24
@@ -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
+ }