@salve-software/salvetron-react-native 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/LICENSE +21 -0
  2. package/NitroRnTuiSdk.podspec +31 -0
  3. package/README.md +90 -0
  4. package/android/CMakeLists.txt +32 -0
  5. package/android/build.gradle +148 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +5 -0
  8. package/android/src/main/AndroidManifest.xml +2 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  10. package/android/src/main/java/com/margelo/nitro/rntuisdk/HybridRnTuiSdk.kt +235 -0
  11. package/android/src/main/java/com/margelo/nitro/rntuisdk/PerformanceMonitor.kt +260 -0
  12. package/android/src/main/java/com/margelo/nitro/rntuisdk/RnTuiSdkPackage.kt +18 -0
  13. package/ios/Bridge.h +8 -0
  14. package/ios/HybridRnTuiSdk.swift +245 -0
  15. package/ios/PerformanceMonitor.swift +223 -0
  16. package/lib/commonjs/index.js +17 -0
  17. package/lib/commonjs/index.js.map +1 -0
  18. package/lib/commonjs/library/client/constants.js +33 -0
  19. package/lib/commonjs/library/client/constants.js.map +1 -0
  20. package/lib/commonjs/library/client/index.js +28 -0
  21. package/lib/commonjs/library/client/index.js.map +1 -0
  22. package/lib/commonjs/library/client/salvetron-client.js +363 -0
  23. package/lib/commonjs/library/client/salvetron-client.js.map +1 -0
  24. package/lib/commonjs/library/device/device-handler.js +80 -0
  25. package/lib/commonjs/library/device/device-handler.js.map +1 -0
  26. package/lib/commonjs/library/device/index.js +9 -0
  27. package/lib/commonjs/library/device/index.js.map +1 -0
  28. package/lib/commonjs/library/device/types.js +2 -0
  29. package/lib/commonjs/library/device/types.js.map +1 -0
  30. package/lib/commonjs/library/device/utils/generate-uuid.js +14 -0
  31. package/lib/commonjs/library/device/utils/generate-uuid.js.map +1 -0
  32. package/lib/commonjs/library/index.js +136 -0
  33. package/lib/commonjs/library/index.js.map +1 -0
  34. package/lib/commonjs/library/interceptors/index.js +11 -0
  35. package/lib/commonjs/library/interceptors/index.js.map +1 -0
  36. package/lib/commonjs/library/interceptors/js-console.js +88 -0
  37. package/lib/commonjs/library/interceptors/js-console.js.map +1 -0
  38. package/lib/commonjs/library/interceptors/xhr.js +74 -0
  39. package/lib/commonjs/library/interceptors/xhr.js.map +1 -0
  40. package/lib/commonjs/library/network-handler/index.js +17 -0
  41. package/lib/commonjs/library/network-handler/index.js.map +1 -0
  42. package/lib/commonjs/library/network-handler/network-handler.js +103 -0
  43. package/lib/commonjs/library/network-handler/network-handler.js.map +1 -0
  44. package/lib/commonjs/library/network-handler/types.js +6 -0
  45. package/lib/commonjs/library/network-handler/types.js.map +1 -0
  46. package/lib/commonjs/library/network-handler/utils/generate-request-id.js +13 -0
  47. package/lib/commonjs/library/network-handler/utils/generate-request-id.js.map +1 -0
  48. package/lib/commonjs/library/network-handler/utils/index.js +41 -0
  49. package/lib/commonjs/library/network-handler/utils/index.js.map +1 -0
  50. package/lib/commonjs/library/network-handler/utils/parse-response-headers.js +26 -0
  51. package/lib/commonjs/library/network-handler/utils/parse-response-headers.js.map +1 -0
  52. package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js +18 -0
  53. package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js.map +1 -0
  54. package/lib/commonjs/library/network-handler/utils/response-to-string.js +35 -0
  55. package/lib/commonjs/library/network-handler/utils/response-to-string.js.map +1 -0
  56. package/lib/commonjs/library/network-handler/utils/should-ignore-url.js +13 -0
  57. package/lib/commonjs/library/network-handler/utils/should-ignore-url.js.map +1 -0
  58. package/lib/commonjs/library/performance-handler/index.js +13 -0
  59. package/lib/commonjs/library/performance-handler/index.js.map +1 -0
  60. package/lib/commonjs/library/performance-handler/performance-handler.js +94 -0
  61. package/lib/commonjs/library/performance-handler/performance-handler.js.map +1 -0
  62. package/lib/commonjs/library/performance-handler/types.js +6 -0
  63. package/lib/commonjs/library/performance-handler/types.js.map +1 -0
  64. package/lib/commonjs/library/project/index.js +15 -0
  65. package/lib/commonjs/library/project/index.js.map +1 -0
  66. package/lib/commonjs/library/project/project-handler.js +31 -0
  67. package/lib/commonjs/library/project/project-handler.js.map +1 -0
  68. package/lib/commonjs/library/types.js +2 -0
  69. package/lib/commonjs/library/types.js.map +1 -0
  70. package/lib/commonjs/package.json +1 -0
  71. package/lib/commonjs/specs/rn-tui-sdk.nitro.js +6 -0
  72. package/lib/commonjs/specs/rn-tui-sdk.nitro.js.map +1 -0
  73. package/lib/module/index.js +6 -0
  74. package/lib/module/index.js.map +1 -0
  75. package/lib/module/library/client/constants.js +29 -0
  76. package/lib/module/library/client/constants.js.map +1 -0
  77. package/lib/module/library/client/index.js +6 -0
  78. package/lib/module/library/client/index.js.map +1 -0
  79. package/lib/module/library/client/salvetron-client.js +359 -0
  80. package/lib/module/library/client/salvetron-client.js.map +1 -0
  81. package/lib/module/library/device/device-handler.js +75 -0
  82. package/lib/module/library/device/device-handler.js.map +1 -0
  83. package/lib/module/library/device/index.js +5 -0
  84. package/lib/module/library/device/index.js.map +1 -0
  85. package/lib/module/library/device/types.js +2 -0
  86. package/lib/module/library/device/types.js.map +1 -0
  87. package/lib/module/library/device/utils/generate-uuid.js +10 -0
  88. package/lib/module/library/device/utils/generate-uuid.js.map +1 -0
  89. package/lib/module/library/index.js +135 -0
  90. package/lib/module/library/index.js.map +1 -0
  91. package/lib/module/library/interceptors/index.js +7 -0
  92. package/lib/module/library/interceptors/index.js.map +1 -0
  93. package/lib/module/library/interceptors/js-console.js +83 -0
  94. package/lib/module/library/interceptors/js-console.js.map +1 -0
  95. package/lib/module/library/interceptors/xhr.js +69 -0
  96. package/lib/module/library/interceptors/xhr.js.map +1 -0
  97. package/lib/module/library/network-handler/index.js +4 -0
  98. package/lib/module/library/network-handler/index.js.map +1 -0
  99. package/lib/module/library/network-handler/network-handler.js +98 -0
  100. package/lib/module/library/network-handler/network-handler.js.map +1 -0
  101. package/lib/module/library/network-handler/types.js +4 -0
  102. package/lib/module/library/network-handler/types.js.map +1 -0
  103. package/lib/module/library/network-handler/utils/generate-request-id.js +9 -0
  104. package/lib/module/library/network-handler/utils/generate-request-id.js.map +1 -0
  105. package/lib/module/library/network-handler/utils/index.js +8 -0
  106. package/lib/module/library/network-handler/utils/index.js.map +1 -0
  107. package/lib/module/library/network-handler/utils/parse-response-headers.js +22 -0
  108. package/lib/module/library/network-handler/utils/parse-response-headers.js.map +1 -0
  109. package/lib/module/library/network-handler/utils/read-blob-as-text.js +14 -0
  110. package/lib/module/library/network-handler/utils/read-blob-as-text.js.map +1 -0
  111. package/lib/module/library/network-handler/utils/response-to-string.js +31 -0
  112. package/lib/module/library/network-handler/utils/response-to-string.js.map +1 -0
  113. package/lib/module/library/network-handler/utils/should-ignore-url.js +9 -0
  114. package/lib/module/library/network-handler/utils/should-ignore-url.js.map +1 -0
  115. package/lib/module/library/performance-handler/index.js +4 -0
  116. package/lib/module/library/performance-handler/index.js.map +1 -0
  117. package/lib/module/library/performance-handler/performance-handler.js +89 -0
  118. package/lib/module/library/performance-handler/performance-handler.js.map +1 -0
  119. package/lib/module/library/performance-handler/types.js +4 -0
  120. package/lib/module/library/performance-handler/types.js.map +1 -0
  121. package/lib/module/library/project/index.js +6 -0
  122. package/lib/module/library/project/index.js.map +1 -0
  123. package/lib/module/library/project/project-handler.js +26 -0
  124. package/lib/module/library/project/project-handler.js.map +1 -0
  125. package/lib/module/library/types.js +2 -0
  126. package/lib/module/library/types.js.map +1 -0
  127. package/lib/module/specs/rn-tui-sdk.nitro.js +4 -0
  128. package/lib/module/specs/rn-tui-sdk.nitro.js.map +1 -0
  129. package/lib/typescript/src/index.d.ts +4 -0
  130. package/lib/typescript/src/index.d.ts.map +1 -0
  131. package/lib/typescript/src/library/client/constants.d.ts +23 -0
  132. package/lib/typescript/src/library/client/constants.d.ts.map +1 -0
  133. package/lib/typescript/src/library/client/index.d.ts +4 -0
  134. package/lib/typescript/src/library/client/index.d.ts.map +1 -0
  135. package/lib/typescript/src/library/client/salvetron-client.d.ts +73 -0
  136. package/lib/typescript/src/library/client/salvetron-client.d.ts.map +1 -0
  137. package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts +2 -0
  138. package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts.map +1 -0
  139. package/lib/typescript/src/library/device/device-handler.d.ts +11 -0
  140. package/lib/typescript/src/library/device/device-handler.d.ts.map +1 -0
  141. package/lib/typescript/src/library/device/index.d.ts +3 -0
  142. package/lib/typescript/src/library/device/index.d.ts.map +1 -0
  143. package/lib/typescript/src/library/device/types.d.ts +8 -0
  144. package/lib/typescript/src/library/device/types.d.ts.map +1 -0
  145. package/lib/typescript/src/library/device/utils/generate-uuid.d.ts +2 -0
  146. package/lib/typescript/src/library/device/utils/generate-uuid.d.ts.map +1 -0
  147. package/lib/typescript/src/library/index.d.ts +106 -0
  148. package/lib/typescript/src/library/index.d.ts.map +1 -0
  149. package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts +2 -0
  150. package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts.map +1 -0
  151. package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts +2 -0
  152. package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts.map +1 -0
  153. package/lib/typescript/src/library/interceptors/index.d.ts +5 -0
  154. package/lib/typescript/src/library/interceptors/index.d.ts.map +1 -0
  155. package/lib/typescript/src/library/interceptors/js-console.d.ts +17 -0
  156. package/lib/typescript/src/library/interceptors/js-console.d.ts.map +1 -0
  157. package/lib/typescript/src/library/interceptors/xhr.d.ts +14 -0
  158. package/lib/typescript/src/library/interceptors/xhr.d.ts.map +1 -0
  159. package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts +2 -0
  160. package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts.map +1 -0
  161. package/lib/typescript/src/library/network-handler/index.d.ts +2 -0
  162. package/lib/typescript/src/library/network-handler/index.d.ts.map +1 -0
  163. package/lib/typescript/src/library/network-handler/network-handler.d.ts +19 -0
  164. package/lib/typescript/src/library/network-handler/network-handler.d.ts.map +1 -0
  165. package/lib/typescript/src/library/network-handler/types.d.ts +6 -0
  166. package/lib/typescript/src/library/network-handler/types.d.ts.map +1 -0
  167. package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts +2 -0
  168. package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts.map +1 -0
  169. package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts +2 -0
  170. package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts.map +1 -0
  171. package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts +2 -0
  172. package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts.map +1 -0
  173. package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts +2 -0
  174. package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts.map +1 -0
  175. package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts +2 -0
  176. package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts.map +1 -0
  177. package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts +5 -0
  178. package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts.map +1 -0
  179. package/lib/typescript/src/library/network-handler/utils/index.d.ts +6 -0
  180. package/lib/typescript/src/library/network-handler/utils/index.d.ts.map +1 -0
  181. package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts +5 -0
  182. package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts.map +1 -0
  183. package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts +5 -0
  184. package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts.map +1 -0
  185. package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts +5 -0
  186. package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts.map +1 -0
  187. package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts +5 -0
  188. package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts.map +1 -0
  189. package/lib/typescript/src/library/performance-handler/index.d.ts +3 -0
  190. package/lib/typescript/src/library/performance-handler/index.d.ts.map +1 -0
  191. package/lib/typescript/src/library/performance-handler/performance-handler.d.ts +27 -0
  192. package/lib/typescript/src/library/performance-handler/performance-handler.d.ts.map +1 -0
  193. package/lib/typescript/src/library/performance-handler/types.d.ts +20 -0
  194. package/lib/typescript/src/library/performance-handler/types.d.ts.map +1 -0
  195. package/lib/typescript/src/library/project/index.d.ts +4 -0
  196. package/lib/typescript/src/library/project/index.d.ts.map +1 -0
  197. package/lib/typescript/src/library/project/project-handler.d.ts +7 -0
  198. package/lib/typescript/src/library/project/project-handler.d.ts.map +1 -0
  199. package/lib/typescript/src/library/types.d.ts +39 -0
  200. package/lib/typescript/src/library/types.d.ts.map +1 -0
  201. package/lib/typescript/src/specs/rn-tui-sdk.nitro.d.ts +100 -0
  202. package/lib/typescript/src/specs/rn-tui-sdk.nitro.d.ts.map +1 -0
  203. package/nitro.json +24 -0
  204. package/nitrogen/generated/.gitattributes +1 -0
  205. package/nitrogen/generated/android/NitroRnTuiSdk+autolinking.cmake +81 -0
  206. package/nitrogen/generated/android/NitroRnTuiSdk+autolinking.gradle +27 -0
  207. package/nitrogen/generated/android/NitroRnTuiSdkOnLoad.cpp +58 -0
  208. package/nitrogen/generated/android/NitroRnTuiSdkOnLoad.hpp +34 -0
  209. package/nitrogen/generated/android/c++/JDeviceInfoResult.hpp +69 -0
  210. package/nitrogen/generated/android/c++/JFunc_void_NativeLogEntry.hpp +80 -0
  211. package/nitrogen/generated/android/c++/JFunc_void_PerformanceMetrics.hpp +77 -0
  212. package/nitrogen/generated/android/c++/JHybridNitroRnTuiSdkSpec.cpp +124 -0
  213. package/nitrogen/generated/android/c++/JHybridNitroRnTuiSdkSpec.hpp +74 -0
  214. package/nitrogen/generated/android/c++/JNativeLogEntry.hpp +71 -0
  215. package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +64 -0
  216. package/nitrogen/generated/android/c++/JPerformanceMetrics.hpp +69 -0
  217. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/DeviceInfoResult.kt +47 -0
  218. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/Func_void_NativeLogEntry.kt +80 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/Func_void_PerformanceMetrics.kt +80 -0
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/HybridNitroRnTuiSdkSpec.kt +108 -0
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NativeLogEntry.kt +47 -0
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NativeLogLevel.kt +25 -0
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/NitroRnTuiSdkOnLoad.kt +35 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rntuisdk/PerformanceMetrics.kt +47 -0
  225. package/nitrogen/generated/ios/NitroRnTuiSdk+autolinking.rb +62 -0
  226. package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Bridge.cpp +49 -0
  227. package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Bridge.hpp +185 -0
  228. package/nitrogen/generated/ios/NitroRnTuiSdk-Swift-Cxx-Umbrella.hpp +58 -0
  229. package/nitrogen/generated/ios/NitroRnTuiSdkAutolinking.mm +33 -0
  230. package/nitrogen/generated/ios/NitroRnTuiSdkAutolinking.swift +26 -0
  231. package/nitrogen/generated/ios/c++/HybridNitroRnTuiSdkSpecSwift.cpp +11 -0
  232. package/nitrogen/generated/ios/c++/HybridNitroRnTuiSdkSpecSwift.hpp +175 -0
  233. package/nitrogen/generated/ios/swift/DeviceInfoResult.swift +44 -0
  234. package/nitrogen/generated/ios/swift/Func_void_NativeLogEntry.swift +46 -0
  235. package/nitrogen/generated/ios/swift/Func_void_PerformanceMetrics.swift +46 -0
  236. package/nitrogen/generated/ios/swift/HybridNitroRnTuiSdkSpec.swift +66 -0
  237. package/nitrogen/generated/ios/swift/HybridNitroRnTuiSdkSpec_cxx.swift +289 -0
  238. package/nitrogen/generated/ios/swift/NativeLogEntry.swift +44 -0
  239. package/nitrogen/generated/ios/swift/NativeLogLevel.swift +48 -0
  240. package/nitrogen/generated/ios/swift/PerformanceMetrics.swift +44 -0
  241. package/nitrogen/generated/shared/c++/DeviceInfoResult.hpp +95 -0
  242. package/nitrogen/generated/shared/c++/HybridNitroRnTuiSdkSpec.cpp +32 -0
  243. package/nitrogen/generated/shared/c++/HybridNitroRnTuiSdkSpec.hpp +83 -0
  244. package/nitrogen/generated/shared/c++/NativeLogEntry.hpp +97 -0
  245. package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +84 -0
  246. package/nitrogen/generated/shared/c++/PerformanceMetrics.hpp +95 -0
  247. package/package.json +128 -0
  248. package/react-native.config.js +16 -0
  249. package/src/index.ts +7 -0
  250. package/src/library/client/constants.ts +35 -0
  251. package/src/library/client/index.ts +9 -0
  252. package/src/library/client/salvetron-client.ts +433 -0
  253. package/src/library/device/__tests__/device-handler.test.ts +86 -0
  254. package/src/library/device/device-handler.ts +85 -0
  255. package/src/library/device/index.ts +3 -0
  256. package/src/library/device/types.ts +7 -0
  257. package/src/library/device/utils/generate-uuid.ts +7 -0
  258. package/src/library/index.ts +158 -0
  259. package/src/library/interceptors/__tests__/js-console.test.ts +186 -0
  260. package/src/library/interceptors/__tests__/xhr.test.ts +313 -0
  261. package/src/library/interceptors/index.ts +5 -0
  262. package/src/library/interceptors/js-console.ts +93 -0
  263. package/src/library/interceptors/xhr.ts +123 -0
  264. package/src/library/network-handler/__tests__/network-handler.test.ts +265 -0
  265. package/src/library/network-handler/index.ts +1 -0
  266. package/src/library/network-handler/network-handler.ts +141 -0
  267. package/src/library/network-handler/types.ts +6 -0
  268. package/src/library/network-handler/utils/__tests__/generate-request-id.test.ts +22 -0
  269. package/src/library/network-handler/utils/__tests__/parse-response-headers.test.ts +71 -0
  270. package/src/library/network-handler/utils/__tests__/read-blob-as-text.test.ts +79 -0
  271. package/src/library/network-handler/utils/__tests__/response-to-string.test.ts +85 -0
  272. package/src/library/network-handler/utils/__tests__/should-ignore-url.test.ts +45 -0
  273. package/src/library/network-handler/utils/generate-request-id.ts +6 -0
  274. package/src/library/network-handler/utils/index.ts +5 -0
  275. package/src/library/network-handler/utils/parse-response-headers.ts +20 -0
  276. package/src/library/network-handler/utils/read-blob-as-text.ts +11 -0
  277. package/src/library/network-handler/utils/response-to-string.ts +32 -0
  278. package/src/library/network-handler/utils/should-ignore-url.ts +6 -0
  279. package/src/library/performance-handler/index.ts +2 -0
  280. package/src/library/performance-handler/performance-handler.ts +104 -0
  281. package/src/library/performance-handler/types.ts +22 -0
  282. package/src/library/project/index.ts +4 -0
  283. package/src/library/project/project-handler.ts +28 -0
  284. package/src/library/types.ts +78 -0
  285. package/src/specs/rn-tui-sdk.nitro.ts +114 -0
@@ -0,0 +1,223 @@
1
+ //
2
+ // PerformanceMonitor.swift
3
+ // NitroRnTuiSdk
4
+ //
5
+ // Performance metrics monitoring for iOS
6
+ // Measures UI FPS, JS FPS, memory usage, and CPU usage
7
+ //
8
+
9
+ import Foundation
10
+ import QuartzCore
11
+ import UIKit
12
+
13
+ public struct PerformanceMetricsData {
14
+ let uiFps: Double
15
+ let jsFps: Double
16
+ let memoryUsageMB: Double
17
+ let cpuUsagePercent: Double
18
+ }
19
+
20
+ public typealias PerformanceMetricsCallback = (PerformanceMetricsData) -> Void
21
+
22
+ public class PerformanceMonitor {
23
+
24
+ // MARK: - Properties
25
+
26
+ private var displayLink: CADisplayLink?
27
+ private var displayLinkProxy: DisplayLinkProxy?
28
+ private var reportTimer: Timer?
29
+ private var callback: PerformanceMetricsCallback?
30
+
31
+ // UI FPS tracking
32
+ private var uiFrameCount: Int = 0
33
+ private var lastUiFpsUpdateTime: CFTimeInterval = 0
34
+ private var currentUiFps: Double = 0
35
+
36
+ // JS FPS tracking (via callback timing)
37
+ private var lastJsCallbackTime: CFTimeInterval = 0
38
+ private var jsFrameCount: Int = 0
39
+ private var lastJsFpsUpdateTime: CFTimeInterval = 0
40
+ private var currentJsFps: Double = 0
41
+
42
+ private var isMonitoring = false
43
+ private var intervalMs: Int = 1000
44
+
45
+ // MARK: - DisplayLinkProxy
46
+
47
+ // DisplayLinkProxy to avoid retain cycle with CADisplayLink
48
+ private class DisplayLinkProxy {
49
+ weak var target: PerformanceMonitor?
50
+
51
+ init(target: PerformanceMonitor) {
52
+ self.target = target
53
+ }
54
+
55
+ @objc func handleDisplayLink(_ link: CADisplayLink) {
56
+ target?.handleDisplayLink(link)
57
+ }
58
+ }
59
+
60
+ // MARK: - Public Methods
61
+
62
+ public func start(callback: @escaping PerformanceMetricsCallback, intervalMs: Int = 1000) -> Bool {
63
+ guard !isMonitoring else {
64
+ return false // Already monitoring
65
+ }
66
+
67
+ self.callback = callback
68
+ self.intervalMs = intervalMs
69
+ self.isMonitoring = true
70
+
71
+ // Reset counters
72
+ uiFrameCount = 0
73
+ jsFrameCount = 0
74
+ lastUiFpsUpdateTime = CACurrentMediaTime()
75
+ lastJsFpsUpdateTime = CACurrentMediaTime()
76
+ lastJsCallbackTime = CACurrentMediaTime()
77
+ currentUiFps = 0
78
+ currentJsFps = 0
79
+
80
+ // Set up CADisplayLink for UI FPS
81
+ displayLinkProxy = DisplayLinkProxy(target: self)
82
+ displayLink = CADisplayLink(target: displayLinkProxy!, selector: #selector(DisplayLinkProxy.handleDisplayLink(_:)))
83
+ displayLink?.add(to: .main, forMode: .common)
84
+
85
+ // Set up timer for reporting metrics
86
+ let interval = TimeInterval(intervalMs) / 1000.0
87
+ reportTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in
88
+ self?.reportMetrics()
89
+ }
90
+
91
+ return true
92
+ }
93
+
94
+ public func stop() {
95
+ guard isMonitoring else { return }
96
+
97
+ isMonitoring = false
98
+ callback = nil
99
+
100
+ // Stop display link
101
+ displayLink?.invalidate()
102
+ displayLink = nil
103
+ displayLinkProxy = nil
104
+
105
+ // Stop report timer
106
+ reportTimer?.invalidate()
107
+ reportTimer = nil
108
+ }
109
+
110
+ public func isRunning() -> Bool {
111
+ return isMonitoring
112
+ }
113
+
114
+ public func getSnapshot() -> PerformanceMetricsData {
115
+ return PerformanceMetricsData(
116
+ uiFps: currentUiFps,
117
+ jsFps: currentJsFps,
118
+ memoryUsageMB: getMemoryUsage(),
119
+ cpuUsagePercent: getCpuUsage()
120
+ )
121
+ }
122
+
123
+ public func recordJsFrame() {
124
+ guard isMonitoring else { return }
125
+
126
+ let now = CACurrentMediaTime()
127
+ lastJsCallbackTime = now
128
+ jsFrameCount += 1
129
+
130
+ // Calculate JS FPS every 500ms
131
+ let elapsed = now - lastJsFpsUpdateTime
132
+ if elapsed >= 0.5 {
133
+ currentJsFps = Double(jsFrameCount) / elapsed
134
+ jsFrameCount = 0
135
+ lastJsFpsUpdateTime = now
136
+ }
137
+ }
138
+
139
+ // MARK: - Private Methods
140
+
141
+ @objc private func handleDisplayLink(_ link: CADisplayLink) {
142
+ uiFrameCount += 1
143
+
144
+ let now = link.timestamp
145
+ let elapsed = now - lastUiFpsUpdateTime
146
+
147
+ // Calculate UI FPS every 500ms
148
+ if elapsed >= 0.5 {
149
+ currentUiFps = Double(uiFrameCount) / elapsed
150
+
151
+ // Cap at device refresh rate
152
+ let maxRefreshRate = Double(UIScreen.main.maximumFramesPerSecond)
153
+ if currentUiFps > maxRefreshRate {
154
+ currentUiFps = maxRefreshRate
155
+ }
156
+
157
+ uiFrameCount = 0
158
+ lastUiFpsUpdateTime = now
159
+ }
160
+ }
161
+
162
+ private func reportMetrics() {
163
+ let metrics = PerformanceMetricsData(
164
+ uiFps: currentUiFps,
165
+ jsFps: currentJsFps,
166
+ memoryUsageMB: getMemoryUsage(),
167
+ cpuUsagePercent: getCpuUsage()
168
+ )
169
+
170
+ callback?(metrics)
171
+ }
172
+
173
+ private func getMemoryUsage() -> Double {
174
+ var info = mach_task_basic_info()
175
+ var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
176
+
177
+ let result = withUnsafeMutablePointer(to: &info) {
178
+ $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
179
+ task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
180
+ }
181
+ }
182
+
183
+ if result == KERN_SUCCESS {
184
+ return Double(info.resident_size) / 1024.0 / 1024.0 // Convert to MB
185
+ }
186
+
187
+ return 0
188
+ }
189
+
190
+ private func getCpuUsage() -> Double {
191
+ var totalUsage: Double = 0
192
+ var threadList: thread_act_array_t?
193
+ var threadCount: mach_msg_type_number_t = 0
194
+
195
+ let result = task_threads(mach_task_self_, &threadList, &threadCount)
196
+
197
+ if result == KERN_SUCCESS, let threads = threadList {
198
+ for i in 0..<Int(threadCount) {
199
+ var threadInfo = thread_basic_info()
200
+ var threadInfoCount = mach_msg_type_number_t(THREAD_INFO_MAX)
201
+
202
+ let infoResult = withUnsafeMutablePointer(to: &threadInfo) {
203
+ $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
204
+ thread_info(threads[i], thread_flavor_t(THREAD_BASIC_INFO), $0, &threadInfoCount)
205
+ }
206
+ }
207
+
208
+ if infoResult == KERN_SUCCESS {
209
+ let cpuUsage = Double(threadInfo.cpu_usage) / Double(TH_USAGE_SCALE)
210
+ totalUsage += cpuUsage * 100.0
211
+ }
212
+ }
213
+
214
+ vm_deallocate(mach_task_self_, vm_address_t(bitPattern: threads), vm_size_t(threadCount * UInt32(MemoryLayout<thread_t>.size)))
215
+ }
216
+
217
+ return totalUsage
218
+ }
219
+
220
+ deinit {
221
+ stop()
222
+ }
223
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NitroRnTuiSdk = void 0;
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _library.default;
11
+ }
12
+ });
13
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
14
+ var _library = _interopRequireDefault(require("./library"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const NitroRnTuiSdk = exports.NitroRnTuiSdk = _reactNativeNitroModules.NitroModules.createHybridObject('NitroRnTuiSdk');
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeNitroModules","require","_library","_interopRequireDefault","e","__esModule","default","NitroRnTuiSdk","exports","NitroModules","createHybridObject"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAMA,IAAAC,QAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAmC,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAH5B,MAAMG,aAAa,GAAAC,OAAA,CAAAD,aAAA,GACxBE,qCAAY,CAACC,kBAAkB,CAAoB,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RECONNECT_CONFIG = exports.DEFAULT_IGNORED_URLS = exports.DEFAULT_CONFIG = void 0;
7
+ /**
8
+ * Default URL patterns to ignore during network interception
9
+ * Includes Metro bundler, hot reload, and debugger URLs
10
+ */
11
+ const DEFAULT_IGNORED_URLS = exports.DEFAULT_IGNORED_URLS = [/localhost:8081/, /127\.0\.0\.1:8081/, /10\.0\.2\.2:8081/,
12
+ // Android emulator
13
+ /symbolicate/, /\.hot-update\./, /hot$/, /\.bundle/, /__packager/, /debugger-ui/, /devtools/];
14
+
15
+ /**
16
+ * WebSocket reconnection settings
17
+ */
18
+ const RECONNECT_CONFIG = exports.RECONNECT_CONFIG = {
19
+ maxAttempts: 5,
20
+ maxDelay: 30000,
21
+ baseDelay: 1000
22
+ };
23
+
24
+ /**
25
+ * Default client configuration
26
+ */
27
+ const DEFAULT_CONFIG = exports.DEFAULT_CONFIG = {
28
+ host: 'localhost',
29
+ port: 8765,
30
+ enableNetworkCapture: true,
31
+ enablePerformanceMonitoring: false
32
+ };
33
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_IGNORED_URLS","exports","RECONNECT_CONFIG","maxAttempts","maxDelay","baseDelay","DEFAULT_CONFIG","host","port","enableNetworkCapture","enablePerformanceMonitoring"],"sourceRoot":"../../../../src","sources":["library/client/constants.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACO,MAAMA,oBAA8B,GAAAC,OAAA,CAAAD,oBAAA,GAAG,CAC5C,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB;AAAE;AACpB,aAAa,EACb,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,CACX;;AAED;AACA;AACA;AACO,MAAME,gBAAgB,GAAAD,OAAA,CAAAC,gBAAA,GAAG;EAC9BC,WAAW,EAAE,CAAC;EACdC,QAAQ,EAAE,KAAK;EACfC,SAAS,EAAE;AACb,CAAU;;AAEV;AACA;AACA;AACO,MAAMC,cAAc,GAAAL,OAAA,CAAAK,cAAA,GAAG;EAC5BC,IAAI,EAAE,WAAW;EACjBC,IAAI,EAAE,IAAI;EACVC,oBAAoB,EAAE,IAAI;EAC1BC,2BAA2B,EAAE;AAC/B,CAAU","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "DEFAULT_CONFIG", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _constants.DEFAULT_CONFIG;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "DEFAULT_IGNORED_URLS", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _constants.DEFAULT_IGNORED_URLS;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "RECONNECT_CONFIG", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _constants.RECONNECT_CONFIG;
22
+ }
23
+ });
24
+ exports.client = void 0;
25
+ var _salvetronClient = require("./salvetron-client");
26
+ var _constants = require("./constants");
27
+ const client = exports.client = new _salvetronClient.SalvetronClient();
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_salvetronClient","require","_constants","client","exports","SalvetronClient"],"sourceRoot":"../../../../src","sources":["library/client/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AAMO,MAAME,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAG,IAAIE,gCAAe,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SalvetronClient = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
9
+ var _constants = require("./constants");
10
+ var _networkHandler = require("../network-handler");
11
+ var _performanceHandler = require("../performance-handler");
12
+ var _device = require("../device");
13
+ var _project = require("../project");
14
+ var _interceptors = require("../interceptors");
15
+ /**
16
+ * WebSocket client for communicating with Salvetron CLI
17
+ */
18
+
19
+ /**
20
+ * Salvetron WebSocket Client
21
+ */
22
+ class SalvetronClient {
23
+ ws = null;
24
+ messageQueue = [];
25
+ reconnectAttempts = 0;
26
+ reconnectTimeout = null;
27
+ isConnecting = false;
28
+ manualDisconnect = false;
29
+
30
+ // Native log capture
31
+ nitroRnTuiSdk = null;
32
+ nativeLogCaptureEnabled = false;
33
+
34
+ // Network handler
35
+ networkHandler = null;
36
+
37
+ // Performance handler
38
+ performanceHandler = null;
39
+ performanceMonitoringEnabled = false;
40
+ constructor() {
41
+ this.config = {
42
+ host: _constants.DEFAULT_CONFIG.host,
43
+ port: _constants.DEFAULT_CONFIG.port,
44
+ enableNetworkCapture: _constants.DEFAULT_CONFIG.enableNetworkCapture,
45
+ enablePerformanceMonitoring: _constants.DEFAULT_CONFIG.enablePerformanceMonitoring,
46
+ ignoredUrls: [],
47
+ onConnect: () => {},
48
+ onDisconnect: () => {},
49
+ onError: () => {}
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Connect to Salvetron CLI
55
+ */
56
+ connect(userConfig = {}) {
57
+ if (typeof __DEV__ !== 'undefined' && !__DEV__) {
58
+ console.warn('[Salvetron] SDK only works in development mode');
59
+ return;
60
+ }
61
+ this.config = {
62
+ host: userConfig.host ?? _constants.DEFAULT_CONFIG.host,
63
+ port: userConfig.port ?? _constants.DEFAULT_CONFIG.port,
64
+ enableNetworkCapture: userConfig.enableNetworkCapture ?? _constants.DEFAULT_CONFIG.enableNetworkCapture,
65
+ enablePerformanceMonitoring: userConfig.enablePerformanceMonitoring ?? _constants.DEFAULT_CONFIG.enablePerformanceMonitoring,
66
+ ignoredUrls: [..._constants.DEFAULT_IGNORED_URLS, ...(userConfig.ignoredUrls ?? [])],
67
+ onConnect: userConfig.onConnect ?? (() => {}),
68
+ onDisconnect: userConfig.onDisconnect ?? (() => {}),
69
+ onError: userConfig.onError ?? (() => {})
70
+ };
71
+ this.manualDisconnect = false;
72
+ this.connectWebSocket();
73
+ }
74
+
75
+ /**
76
+ * Disconnect from Salvetron
77
+ */
78
+ disconnect() {
79
+ this.manualDisconnect = true;
80
+ this.cleanup();
81
+ }
82
+
83
+ /**
84
+ * Check if connected
85
+ */
86
+ isConnected() {
87
+ return this.ws?.readyState === WebSocket.OPEN;
88
+ }
89
+
90
+ /**
91
+ * Send a log event to Salvetron
92
+ */
93
+ sendLog(level, message, metadata) {
94
+ const event = {
95
+ type: 'log',
96
+ source: 'js',
97
+ level,
98
+ message,
99
+ timestamp: Date.now(),
100
+ metadata,
101
+ projectId: _project.projectHandler.getProjectId()
102
+ };
103
+ this.send(event);
104
+ }
105
+
106
+ /**
107
+ * Start capturing native platform logs
108
+ */
109
+ startNativeLogCapture() {
110
+ if (this.nativeLogCaptureEnabled) {
111
+ console.warn('[Salvetron] Native log capture already enabled');
112
+ return false;
113
+ }
114
+ try {
115
+ const nitro = this.getNitroRnTuiSdk();
116
+ const success = nitro.startLogCapture(log => {
117
+ this.handleNativeLog(log);
118
+ });
119
+ if (success) {
120
+ this.nativeLogCaptureEnabled = true;
121
+ console.log('[Salvetron] Native log capture enabled');
122
+ }
123
+ return success;
124
+ } catch (error) {
125
+ console.error('[Salvetron] Failed to start native log capture:', error);
126
+ return false;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Stop capturing native platform logs
132
+ */
133
+ stopNativeLogCapture() {
134
+ if (!this.nativeLogCaptureEnabled) return;
135
+ try {
136
+ const nitro = this.getNitroRnTuiSdk();
137
+ nitro.stopLogCapture();
138
+ this.nativeLogCaptureEnabled = false;
139
+ console.log('[Salvetron] Native log capture disabled');
140
+ } catch (error) {
141
+ console.error('[Salvetron] Failed to stop native log capture:', error);
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Check if native log capture is active
147
+ */
148
+ isNativeLogCaptureEnabled() {
149
+ return this.nativeLogCaptureEnabled;
150
+ }
151
+
152
+ /**
153
+ * Start performance monitoring
154
+ */
155
+ startPerformanceMonitoring() {
156
+ if (this.performanceMonitoringEnabled) {
157
+ console.warn('[Salvetron] Performance monitoring already enabled');
158
+ return false;
159
+ }
160
+ this.performanceHandler = new _performanceHandler.PerformanceHandler({
161
+ nitroRnTuiSdk: this.getNitroRnTuiSdk(),
162
+ onEvent: event => this.send(event)
163
+ });
164
+ const success = this.performanceHandler.start();
165
+ if (success) {
166
+ this.performanceMonitoringEnabled = true;
167
+ console.log('[Salvetron] Performance monitoring enabled');
168
+ }
169
+ return success;
170
+ }
171
+
172
+ /**
173
+ * Stop performance monitoring
174
+ */
175
+ stopPerformanceMonitoring() {
176
+ if (!this.performanceMonitoringEnabled) return;
177
+ try {
178
+ if (this.performanceHandler) {
179
+ this.performanceHandler.stop();
180
+ this.performanceHandler = null;
181
+ }
182
+ this.performanceMonitoringEnabled = false;
183
+ console.log('[Salvetron] Performance monitoring disabled');
184
+ } catch (error) {
185
+ console.error('[Salvetron] Failed to stop performance monitoring:', error);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Check if performance monitoring is active
191
+ */
192
+ isPerformanceMonitoringEnabled() {
193
+ return this.performanceMonitoringEnabled;
194
+ }
195
+ getNitroRnTuiSdk() {
196
+ if (!this.nitroRnTuiSdk) {
197
+ this.nitroRnTuiSdk = _reactNativeNitroModules.NitroModules.createHybridObject('NitroRnTuiSdk');
198
+ }
199
+ return this.nitroRnTuiSdk;
200
+ }
201
+ handleNativeLog(log) {
202
+ const platform = _reactNative.Platform.OS;
203
+ const level = log.level === 'verbose' ? 'debug' : log.level;
204
+ const event = {
205
+ type: 'native',
206
+ source: platform,
207
+ level: level,
208
+ message: log.message,
209
+ timestamp: log.timestamp,
210
+ metadata: log.tag ? {
211
+ tag: log.tag
212
+ } : undefined,
213
+ projectId: _project.projectHandler.getProjectId()
214
+ };
215
+ this.send(event);
216
+ }
217
+ connectWebSocket() {
218
+ _interceptors.jsConsoleInterceptor.start({
219
+ onLog: (level, message, metadata) => this.sendLog(level, message, metadata)
220
+ });
221
+ if (this.isConnecting || this.isConnected()) return;
222
+ this.isConnecting = true;
223
+ const url = `ws://${this.config.host}:${this.config.port}`;
224
+ try {
225
+ this.ws = new WebSocket(url);
226
+ this.ws.onopen = () => {
227
+ this.isConnecting = false;
228
+ this.reconnectAttempts = 0;
229
+ console.log(`[Salvetron] Connected to ${url}`);
230
+ this.config.onConnect();
231
+ this.sendProjectInfo();
232
+ this.sendDeviceInfo();
233
+ this.flushQueue();
234
+ if (this.config.enableNetworkCapture) {
235
+ this.setupNetworkInterception();
236
+ }
237
+ if (this.config.enablePerformanceMonitoring) {
238
+ this.startPerformanceMonitoring();
239
+ }
240
+ this.startNativeLogCapture();
241
+ };
242
+ this.ws.onclose = () => {
243
+ this.isConnecting = false;
244
+ console.log('[Salvetron] Disconnected');
245
+ this.config.onDisconnect();
246
+ if (!this.manualDisconnect) {
247
+ this.scheduleReconnect();
248
+ }
249
+ };
250
+ this.ws.onerror = event => {
251
+ this.isConnecting = false;
252
+ const error = new Error('WebSocket error');
253
+ console.error('[Salvetron] Connection error:', event);
254
+ this.config.onError(error);
255
+ };
256
+ this.ws.onmessage = event => {
257
+ console.log('[Salvetron] Received:', event.data);
258
+ };
259
+ } catch (error) {
260
+ this.isConnecting = false;
261
+ console.error('[Salvetron] Failed to create WebSocket:', error);
262
+ this.scheduleReconnect();
263
+ }
264
+ }
265
+ scheduleReconnect() {
266
+ if (this.manualDisconnect) return;
267
+ if (this.reconnectAttempts >= _constants.RECONNECT_CONFIG.maxAttempts) {
268
+ console.warn('[Salvetron] Max reconnection attempts reached');
269
+ return;
270
+ }
271
+ const delay = Math.min(_constants.RECONNECT_CONFIG.baseDelay * Math.pow(2, this.reconnectAttempts), _constants.RECONNECT_CONFIG.maxDelay);
272
+ this.reconnectAttempts++;
273
+ console.log(`[Salvetron] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);
274
+ this.reconnectTimeout = setTimeout(() => {
275
+ this.connectWebSocket();
276
+ }, delay);
277
+ }
278
+ cleanup() {
279
+ if (this.reconnectTimeout) {
280
+ clearTimeout(this.reconnectTimeout);
281
+ this.reconnectTimeout = null;
282
+ }
283
+ this.stopNativeLogCapture();
284
+ this.stopPerformanceMonitoring();
285
+ _interceptors.xhrInterceptor.disable();
286
+ _interceptors.jsConsoleInterceptor.stop();
287
+ if (this.networkHandler) {
288
+ this.networkHandler.clear();
289
+ this.networkHandler = null;
290
+ }
291
+ if (this.ws) {
292
+ this.ws.onopen = null;
293
+ this.ws.onclose = null;
294
+ this.ws.onerror = null;
295
+ this.ws.onmessage = null;
296
+ this.ws.close();
297
+ this.ws = null;
298
+ }
299
+ this.messageQueue = [];
300
+ this.reconnectAttempts = 0;
301
+ this.isConnecting = false;
302
+ }
303
+ send(event) {
304
+ if (this.isConnected() && this.ws) {
305
+ try {
306
+ this.ws.send(JSON.stringify(event));
307
+ } catch (error) {
308
+ console.error('[Salvetron] Failed to send event:', error);
309
+ this.messageQueue.push(event);
310
+ }
311
+ } else {
312
+ this.messageQueue.push(event);
313
+ }
314
+ }
315
+ sendProjectInfo() {
316
+ try {
317
+ const projectInfo = _project.projectHandler.getProjectInfo();
318
+ const event = {
319
+ type: 'project_info',
320
+ ...projectInfo
321
+ };
322
+ this.send(event);
323
+ console.log(`[Salvetron] Project registered: ${projectInfo.appName} (${projectInfo.projectId})`);
324
+ } catch (error) {
325
+ console.warn('[Salvetron] Failed to send project info:', error);
326
+ }
327
+ }
328
+ async sendDeviceInfo() {
329
+ try {
330
+ const deviceInfo = _device.deviceHandler.getDeviceInfo();
331
+ const projectId = _project.projectHandler.getProjectId();
332
+ const event = {
333
+ type: 'device_info',
334
+ ...deviceInfo,
335
+ projectId
336
+ };
337
+ this.send(event);
338
+ console.log(`[Salvetron] Device registered: ${deviceInfo.deviceName} (${deviceInfo.deviceId})`);
339
+ } catch (error) {
340
+ console.warn('[Salvetron] Failed to send device info:', error);
341
+ }
342
+ }
343
+ flushQueue() {
344
+ while (this.messageQueue.length > 0 && this.isConnected()) {
345
+ const event = this.messageQueue.shift();
346
+ if (event) {
347
+ this.send(event);
348
+ }
349
+ }
350
+ }
351
+ setupNetworkInterception() {
352
+ this.networkHandler = new _networkHandler.NetworkHandler({
353
+ ignoredUrls: this.config.ignoredUrls,
354
+ onEvent: event => this.send(event)
355
+ });
356
+ const success = _interceptors.xhrInterceptor.enable(this.networkHandler.getCallbacks());
357
+ if (success) {
358
+ console.log('[Salvetron] Network capture enabled');
359
+ }
360
+ }
361
+ }
362
+ exports.SalvetronClient = SalvetronClient;
363
+ //# sourceMappingURL=salvetron-client.js.map