@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,313 @@
1
+ import { XHRInterceptor } from '../xhr'
2
+
3
+ describe('XHRInterceptor', () => {
4
+ let interceptor: XHRInterceptor
5
+
6
+ const originalXMLHttpRequest = global.XMLHttpRequest
7
+
8
+ const openMock = jest.fn()
9
+ const sendMock = jest.fn()
10
+ const setRequestHeaderMock = jest.fn()
11
+
12
+ class MockXMLHttpRequest {
13
+ static HEADERS_RECEIVED = 2
14
+ static DONE = 4
15
+
16
+ public readonly HEADERS_RECEIVED =
17
+ MockXMLHttpRequest.HEADERS_RECEIVED
18
+
19
+ public readonly DONE =
20
+ MockXMLHttpRequest.DONE
21
+
22
+ public readyState = 0
23
+ public status = 200
24
+ public timeout = 0
25
+ public response = '{"success":true}'
26
+ public responseURL = 'https://api.test.com'
27
+ public responseType = 'json'
28
+
29
+ private listeners: Record<string, Array<() => void>> = {}
30
+
31
+ open(method: string, url: string) {
32
+ openMock(method, url)
33
+ }
34
+
35
+ send(data?: unknown) {
36
+ sendMock(data)
37
+ }
38
+
39
+ setRequestHeader(header: string, value: string) {
40
+ setRequestHeaderMock(header, value)
41
+ }
42
+
43
+ addEventListener(event: string, callback: () => void) {
44
+ if (!this.listeners[event]) {
45
+ this.listeners[event] = []
46
+ }
47
+
48
+ this.listeners[event].push(callback)
49
+ }
50
+
51
+ emit(event: string) {
52
+ this.listeners[event]?.forEach(listener => listener())
53
+ }
54
+
55
+ getResponseHeader(name: string) {
56
+ if (name === 'Content-Type') {
57
+ return 'application/json; charset=utf-8'
58
+ }
59
+
60
+ if (name === 'Content-Length') {
61
+ return '128'
62
+ }
63
+
64
+ return null
65
+ }
66
+
67
+ getAllResponseHeaders() {
68
+ return 'Content-Type: application/json'
69
+ }
70
+ }
71
+
72
+ beforeEach(() => {
73
+ jest.clearAllMocks()
74
+
75
+ jest.spyOn(console, 'log').mockImplementation(() => {})
76
+ jest.spyOn(console, 'warn').mockImplementation(() => {})
77
+
78
+ global.XMLHttpRequest = MockXMLHttpRequest as any
79
+
80
+ interceptor = XHRInterceptor.getInstance()
81
+
82
+ interceptor.disable()
83
+ })
84
+
85
+ afterEach(() => {
86
+ jest.restoreAllMocks()
87
+ })
88
+
89
+ afterAll(() => {
90
+ global.XMLHttpRequest = originalXMLHttpRequest
91
+ })
92
+
93
+ it('should enable interceptor', () => {
94
+ const result = interceptor.enable({
95
+ onOpen: jest.fn(),
96
+ onSend: jest.fn(),
97
+ onRequestHeader: jest.fn(),
98
+ onHeaderReceived: jest.fn(),
99
+ onResponse: jest.fn(),
100
+ })
101
+
102
+ expect(result).toBe(true)
103
+ expect(interceptor.isEnabled()).toBe(true)
104
+ })
105
+
106
+ it('should prevent double enable', () => {
107
+ interceptor.enable({
108
+ onOpen: jest.fn(),
109
+ onSend: jest.fn(),
110
+ onRequestHeader: jest.fn(),
111
+ onHeaderReceived: jest.fn(),
112
+ onResponse: jest.fn(),
113
+ })
114
+
115
+ const result = interceptor.enable({
116
+ onOpen: jest.fn(),
117
+ onSend: jest.fn(),
118
+ onRequestHeader: jest.fn(),
119
+ onHeaderReceived: jest.fn(),
120
+ onResponse: jest.fn(),
121
+ })
122
+
123
+ expect(result).toBe(false)
124
+
125
+ expect(console.warn).toHaveBeenCalledWith(
126
+ '[Salvetron] Network interceptor already enabled'
127
+ )
128
+ })
129
+
130
+ it('should intercept open calls', () => {
131
+ const onOpen = jest.fn()
132
+
133
+ interceptor.enable({
134
+ onOpen,
135
+ onSend: jest.fn(),
136
+ onRequestHeader: jest.fn(),
137
+ onHeaderReceived: jest.fn(),
138
+ onResponse: jest.fn(),
139
+ })
140
+
141
+ const xhr = new XMLHttpRequest()
142
+
143
+ xhr.open('GET', 'https://api.test.com')
144
+
145
+ expect(onOpen).toHaveBeenCalledTimes(1)
146
+
147
+ expect(onOpen).toHaveBeenCalledWith(
148
+ 'GET',
149
+ 'https://api.test.com',
150
+ xhr
151
+ )
152
+
153
+ expect(openMock).toHaveBeenCalledTimes(1)
154
+
155
+ expect(openMock).toHaveBeenCalledWith(
156
+ 'GET',
157
+ 'https://api.test.com'
158
+ )
159
+ })
160
+
161
+ it('should intercept request headers', () => {
162
+ const onRequestHeader = jest.fn()
163
+
164
+ interceptor.enable({
165
+ onOpen: jest.fn(),
166
+ onSend: jest.fn(),
167
+ onRequestHeader,
168
+ onHeaderReceived: jest.fn(),
169
+ onResponse: jest.fn(),
170
+ })
171
+
172
+ const xhr = new XMLHttpRequest()
173
+
174
+ xhr.setRequestHeader('Authorization', 'Bearer token')
175
+
176
+ expect(onRequestHeader).toHaveBeenCalledTimes(1)
177
+
178
+ expect(onRequestHeader).toHaveBeenCalledWith(
179
+ 'Authorization',
180
+ 'Bearer token',
181
+ xhr
182
+ )
183
+
184
+ expect(setRequestHeaderMock).toHaveBeenCalledTimes(1)
185
+
186
+ expect(setRequestHeaderMock).toHaveBeenCalledWith(
187
+ 'Authorization',
188
+ 'Bearer token'
189
+ )
190
+ })
191
+
192
+ it('should intercept send calls', () => {
193
+ const onSend = jest.fn()
194
+
195
+ interceptor.enable({
196
+ onOpen: jest.fn(),
197
+ onSend,
198
+ onRequestHeader: jest.fn(),
199
+ onHeaderReceived: jest.fn(),
200
+ onResponse: jest.fn(),
201
+ })
202
+
203
+ const xhr = new XMLHttpRequest()
204
+
205
+ xhr.send({ hello: true })
206
+
207
+ expect(onSend).toHaveBeenCalledTimes(1)
208
+
209
+ expect(onSend).toHaveBeenCalledWith(
210
+ { hello: true },
211
+ xhr
212
+ )
213
+
214
+ expect(sendMock).toHaveBeenCalledTimes(1)
215
+
216
+ expect(sendMock).toHaveBeenCalledWith({
217
+ hello: true,
218
+ })
219
+ })
220
+
221
+ it('should intercept HEADERS_RECEIVED state', () => {
222
+ const onHeaderReceived = jest.fn()
223
+
224
+ interceptor.enable({
225
+ onOpen: jest.fn(),
226
+ onSend: jest.fn(),
227
+ onRequestHeader: jest.fn(),
228
+ onHeaderReceived,
229
+ onResponse: jest.fn(),
230
+ })
231
+
232
+ const xhr = new XMLHttpRequest() as any
233
+
234
+ xhr.send()
235
+
236
+ xhr.readyState = xhr.HEADERS_RECEIVED
237
+
238
+ xhr.emit('readystatechange')
239
+
240
+ expect(onHeaderReceived).toHaveBeenCalledTimes(1)
241
+
242
+ expect(onHeaderReceived).toHaveBeenCalledWith(
243
+ 'application/json',
244
+ 128,
245
+ 'Content-Type: application/json',
246
+ xhr
247
+ )
248
+ })
249
+
250
+ it('should intercept DONE state', () => {
251
+ const onResponse = jest.fn()
252
+
253
+ interceptor.enable({
254
+ onOpen: jest.fn(),
255
+ onSend: jest.fn(),
256
+ onRequestHeader: jest.fn(),
257
+ onHeaderReceived: jest.fn(),
258
+ onResponse,
259
+ })
260
+
261
+ const xhr = new XMLHttpRequest() as any
262
+
263
+ xhr.send()
264
+
265
+ xhr.readyState = xhr.DONE
266
+
267
+ xhr.emit('readystatechange')
268
+
269
+ expect(onResponse).toHaveBeenCalledTimes(1)
270
+
271
+ expect(onResponse).toHaveBeenCalledWith(
272
+ 200,
273
+ false,
274
+ '{"success":true}',
275
+ 'https://api.test.com',
276
+ 'json',
277
+ xhr
278
+ )
279
+ })
280
+
281
+ it('should restore original methods on disable', () => {
282
+ const originalOpen = XMLHttpRequest.prototype.open
283
+ const originalSend = XMLHttpRequest.prototype.send
284
+ const originalSetRequestHeader =
285
+ XMLHttpRequest.prototype.setRequestHeader
286
+
287
+ interceptor.enable({
288
+ onOpen: jest.fn(),
289
+ onSend: jest.fn(),
290
+ onRequestHeader: jest.fn(),
291
+ onHeaderReceived: jest.fn(),
292
+ onResponse: jest.fn(),
293
+ })
294
+
295
+ expect(XMLHttpRequest.prototype.open).not.toBe(originalOpen)
296
+
297
+ expect(XMLHttpRequest.prototype.send).not.toBe(originalSend)
298
+
299
+ expect(XMLHttpRequest.prototype.setRequestHeader).not.toBe(
300
+ originalSetRequestHeader
301
+ )
302
+
303
+ interceptor.disable()
304
+
305
+ expect(XMLHttpRequest.prototype.open).toBe(originalOpen)
306
+
307
+ expect(XMLHttpRequest.prototype.send).toBe(originalSend)
308
+
309
+ expect(XMLHttpRequest.prototype.setRequestHeader).toBe(
310
+ originalSetRequestHeader
311
+ )
312
+ })
313
+ })
@@ -0,0 +1,5 @@
1
+ import { XHRInterceptor } from './xhr'
2
+ import { JSConsoleInterceptor } from './js-console'
3
+
4
+ export const xhrInterceptor = XHRInterceptor.getInstance()
5
+ export const jsConsoleInterceptor = JSConsoleInterceptor.getInstance()
@@ -0,0 +1,93 @@
1
+ import type { LogLevel } from '../types'
2
+
3
+ export interface JSConsoleCallbacks {
4
+ onLog: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => void
5
+ }
6
+
7
+ export class JSConsoleInterceptor {
8
+ private static instance: JSConsoleInterceptor | null = null
9
+
10
+ private enabled = false
11
+ private callbacks: JSConsoleCallbacks | null = null
12
+
13
+ private readonly originalLog = console.log
14
+ private readonly originalWarn = console.warn
15
+ private readonly originalError = console.error
16
+
17
+ public static getInstance(): JSConsoleInterceptor {
18
+ if (!JSConsoleInterceptor.instance) {
19
+ JSConsoleInterceptor.instance = new JSConsoleInterceptor()
20
+ }
21
+ return JSConsoleInterceptor.instance
22
+ }
23
+
24
+ public isEnabled(): boolean {
25
+ return this.enabled
26
+ }
27
+
28
+ public start(callbacks: JSConsoleCallbacks): boolean {
29
+ if (this.enabled) {
30
+ return false
31
+ }
32
+
33
+ this.callbacks = callbacks
34
+
35
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
36
+ const self = this
37
+
38
+ console.log = function (...args: unknown[]) {
39
+ self.originalLog.apply(console, args)
40
+ try {
41
+ const first = args[0]
42
+ if (typeof first === 'string' && first.startsWith('[Salvetron]')) return
43
+ const message = String(args[0])
44
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
45
+ self.callbacks?.onLog('log', message, metadata)
46
+ } catch {
47
+ // swallow forwarding errors
48
+ }
49
+ }
50
+
51
+ console.warn = function (...args: unknown[]) {
52
+ self.originalWarn.apply(console, args)
53
+ try {
54
+ const first = args[0]
55
+ if (typeof first === 'string' && first.startsWith('[Salvetron]')) return
56
+ const message = String(args[0])
57
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
58
+ self.callbacks?.onLog('warn', message, metadata)
59
+ } catch {
60
+ // swallow forwarding errors
61
+ }
62
+ }
63
+
64
+ console.error = function (...args: unknown[]) {
65
+ self.originalError.apply(console, args)
66
+ try {
67
+ const first = args[0]
68
+ if (typeof first === 'string' && first.startsWith('[Salvetron]')) return
69
+ const message = String(args[0])
70
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
71
+ self.callbacks?.onLog('error', message, metadata)
72
+ } catch {
73
+ // swallow forwarding errors
74
+ }
75
+ }
76
+
77
+ this.enabled = true
78
+ return true
79
+ }
80
+
81
+ public stop(): void {
82
+ if (!this.enabled) {
83
+ return
84
+ }
85
+
86
+ console.log = this.originalLog
87
+ console.warn = this.originalWarn
88
+ console.error = this.originalError
89
+
90
+ this.callbacks = null
91
+ this.enabled = false
92
+ }
93
+ }
@@ -0,0 +1,123 @@
1
+ import type { NetworkCallbacks } from '../types';
2
+
3
+ export class XHRInterceptor {
4
+ private static instance: XHRInterceptor | null = null;
5
+
6
+ private readonly originalOpen = XMLHttpRequest.prototype.open;
7
+ private readonly originalSend = XMLHttpRequest.prototype.send;
8
+ private readonly originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
9
+
10
+ private enabled = false;
11
+
12
+ private callbacks: {
13
+ onOpen?: NetworkCallbacks['onOpen'];
14
+ onSend?: NetworkCallbacks['onSend'];
15
+ onRequestHeader?: NetworkCallbacks['onRequestHeader'];
16
+ onHeaderReceived?: NetworkCallbacks['onHeaderReceived'];
17
+ onResponse?: NetworkCallbacks['onResponse'];
18
+ } = {};
19
+
20
+ public static getInstance(): XHRInterceptor {
21
+ if (!XHRInterceptor.instance) {
22
+ XHRInterceptor.instance = new XHRInterceptor();
23
+ }
24
+
25
+ return XHRInterceptor.instance;
26
+ }
27
+
28
+ public isEnabled(): boolean {
29
+ return this.enabled;
30
+ }
31
+
32
+ public enable(callbacks: NetworkCallbacks): boolean {
33
+ if (this.enabled) {
34
+ console.warn('[Salvetron] Network interceptor already enabled');
35
+ return false;
36
+ }
37
+
38
+ this.callbacks = callbacks;
39
+
40
+ XMLHttpRequest.prototype.open = function (
41
+ this: XMLHttpRequest,
42
+ method: string,
43
+ url: string | URL
44
+ ) {
45
+ XHRInterceptor.getInstance().callbacks.onOpen?.(method, url.toString(), this);
46
+
47
+ return XHRInterceptor.getInstance().originalOpen.apply(this, arguments as any);
48
+ };
49
+
50
+ XMLHttpRequest.prototype.setRequestHeader = function (
51
+ this: XMLHttpRequest,
52
+ header: string,
53
+ value: string
54
+ ) {
55
+ XHRInterceptor.getInstance().callbacks.onRequestHeader?.(header, value, this);
56
+
57
+ return XHRInterceptor.getInstance().originalSetRequestHeader.apply(
58
+ this,
59
+ arguments as any
60
+ );
61
+ };
62
+
63
+ XMLHttpRequest.prototype.send = function (this: XMLHttpRequest, data?: unknown) {
64
+ const interceptor = XHRInterceptor.getInstance();
65
+
66
+ interceptor.callbacks.onSend?.(data, this);
67
+
68
+ if (this.addEventListener) {
69
+ this.addEventListener('readystatechange', () => {
70
+ if (!interceptor.enabled) {
71
+ return;
72
+ }
73
+
74
+ if (this.readyState === this.HEADERS_RECEIVED) {
75
+ const contentType = this.getResponseHeader('Content-Type');
76
+ const contentLength = this.getResponseHeader('Content-Length');
77
+
78
+ interceptor.callbacks.onHeaderReceived?.(
79
+ contentType?.split(';')[0],
80
+ contentLength ? parseInt(contentLength, 10) : undefined,
81
+ this.getAllResponseHeaders(),
82
+ this
83
+ );
84
+ }
85
+
86
+ if (this.readyState === this.DONE) {
87
+ interceptor.callbacks.onResponse?.(
88
+ this.status,
89
+ this.timeout > 0,
90
+ this.response,
91
+ this.responseURL,
92
+ this.responseType,
93
+ this
94
+ );
95
+ }
96
+ });
97
+ }
98
+
99
+ return interceptor.originalSend.apply(this, arguments as any);
100
+ };
101
+
102
+ this.enabled = true;
103
+
104
+ console.log('[Salvetron] Network interception enabled (XMLHttpRequest monkey-patch)');
105
+
106
+ return true;
107
+ }
108
+
109
+ public disable(): void {
110
+ if (!this.enabled) {
111
+ return;
112
+ }
113
+
114
+ XMLHttpRequest.prototype.open = this.originalOpen;
115
+ XMLHttpRequest.prototype.send = this.originalSend;
116
+ XMLHttpRequest.prototype.setRequestHeader = this.originalSetRequestHeader;
117
+
118
+ this.callbacks = {};
119
+ this.enabled = false;
120
+
121
+ console.log('[Salvetron] Network interception disabled');
122
+ }
123
+ }