@salve-software/mako-react-native 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NitroMako.podspec +31 -0
- package/README.md +90 -0
- package/android/CMakeLists.txt +32 -0
- package/android/build.gradle +148 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/margelo/nitro/mako/HybridMako.kt +235 -0
- package/android/src/main/java/com/margelo/nitro/mako/MakoPackage.kt +18 -0
- package/android/src/main/java/com/margelo/nitro/mako/PerformanceMonitor.kt +260 -0
- package/ios/Bridge.h +8 -0
- package/ios/HybridMako.swift +245 -0
- package/ios/PerformanceMonitor.swift +223 -0
- package/lib/commonjs/index.js +17 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/library/client/constants.js +34 -0
- package/lib/commonjs/library/client/constants.js.map +1 -0
- package/lib/commonjs/library/client/index.js +28 -0
- package/lib/commonjs/library/client/index.js.map +1 -0
- package/lib/commonjs/library/client/mako-client.js +419 -0
- package/lib/commonjs/library/client/mako-client.js.map +1 -0
- package/lib/commonjs/library/component-handler/component-handler.js +158 -0
- package/lib/commonjs/library/component-handler/component-handler.js.map +1 -0
- package/lib/commonjs/library/component-handler/index.js +39 -0
- package/lib/commonjs/library/component-handler/index.js.map +1 -0
- package/lib/commonjs/library/component-handler/types.js +6 -0
- package/lib/commonjs/library/component-handler/types.js.map +1 -0
- package/lib/commonjs/library/component-handler/utils/index.js +26 -0
- package/lib/commonjs/library/component-handler/utils/index.js.map +1 -0
- package/lib/commonjs/library/device/device-handler.js +80 -0
- package/lib/commonjs/library/device/device-handler.js.map +1 -0
- package/lib/commonjs/library/device/index.js +9 -0
- package/lib/commonjs/library/device/index.js.map +1 -0
- package/lib/commonjs/library/device/types.js +2 -0
- package/lib/commonjs/library/device/types.js.map +1 -0
- package/lib/commonjs/library/device/utils/generate-uuid.js +14 -0
- package/lib/commonjs/library/device/utils/generate-uuid.js.map +1 -0
- package/lib/commonjs/library/index.js +156 -0
- package/lib/commonjs/library/index.js.map +1 -0
- package/lib/commonjs/library/interceptors/index.js +13 -0
- package/lib/commonjs/library/interceptors/index.js.map +1 -0
- package/lib/commonjs/library/interceptors/js-console.js +88 -0
- package/lib/commonjs/library/interceptors/js-console.js.map +1 -0
- package/lib/commonjs/library/interceptors/react-devtools.js +219 -0
- package/lib/commonjs/library/interceptors/react-devtools.js.map +1 -0
- package/lib/commonjs/library/interceptors/xhr.js +74 -0
- package/lib/commonjs/library/interceptors/xhr.js.map +1 -0
- package/lib/commonjs/library/network-handler/index.js +17 -0
- package/lib/commonjs/library/network-handler/index.js.map +1 -0
- package/lib/commonjs/library/network-handler/network-handler.js +103 -0
- package/lib/commonjs/library/network-handler/network-handler.js.map +1 -0
- package/lib/commonjs/library/network-handler/types.js +6 -0
- package/lib/commonjs/library/network-handler/types.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/generate-request-id.js +13 -0
- package/lib/commonjs/library/network-handler/utils/generate-request-id.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/index.js +41 -0
- package/lib/commonjs/library/network-handler/utils/index.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/parse-response-headers.js +26 -0
- package/lib/commonjs/library/network-handler/utils/parse-response-headers.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js +18 -0
- package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/response-to-string.js +35 -0
- package/lib/commonjs/library/network-handler/utils/response-to-string.js.map +1 -0
- package/lib/commonjs/library/network-handler/utils/should-ignore-url.js +13 -0
- package/lib/commonjs/library/network-handler/utils/should-ignore-url.js.map +1 -0
- package/lib/commonjs/library/performance-handler/index.js +13 -0
- package/lib/commonjs/library/performance-handler/index.js.map +1 -0
- package/lib/commonjs/library/performance-handler/performance-handler.js +94 -0
- package/lib/commonjs/library/performance-handler/performance-handler.js.map +1 -0
- package/lib/commonjs/library/performance-handler/types.js +6 -0
- package/lib/commonjs/library/performance-handler/types.js.map +1 -0
- package/lib/commonjs/library/project/index.js +15 -0
- package/lib/commonjs/library/project/index.js.map +1 -0
- package/lib/commonjs/library/project/project-handler.js +31 -0
- package/lib/commonjs/library/project/project-handler.js.map +1 -0
- package/lib/commonjs/library/types.js +2 -0
- package/lib/commonjs/library/types.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/mako.nitro.js +6 -0
- package/lib/commonjs/specs/mako.nitro.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/library/client/constants.js +30 -0
- package/lib/module/library/client/constants.js.map +1 -0
- package/lib/module/library/client/index.js +6 -0
- package/lib/module/library/client/index.js.map +1 -0
- package/lib/module/library/client/mako-client.js +415 -0
- package/lib/module/library/client/mako-client.js.map +1 -0
- package/lib/module/library/component-handler/component-handler.js +153 -0
- package/lib/module/library/component-handler/component-handler.js.map +1 -0
- package/lib/module/library/component-handler/index.js +6 -0
- package/lib/module/library/component-handler/index.js.map +1 -0
- package/lib/module/library/component-handler/types.js +4 -0
- package/lib/module/library/component-handler/types.js.map +1 -0
- package/lib/module/library/component-handler/utils/index.js +21 -0
- package/lib/module/library/component-handler/utils/index.js.map +1 -0
- package/lib/module/library/device/device-handler.js +75 -0
- package/lib/module/library/device/device-handler.js.map +1 -0
- package/lib/module/library/device/index.js +5 -0
- package/lib/module/library/device/index.js.map +1 -0
- package/lib/module/library/device/types.js +2 -0
- package/lib/module/library/device/types.js.map +1 -0
- package/lib/module/library/device/utils/generate-uuid.js +10 -0
- package/lib/module/library/device/utils/generate-uuid.js.map +1 -0
- package/lib/module/library/index.js +155 -0
- package/lib/module/library/index.js.map +1 -0
- package/lib/module/library/interceptors/index.js +9 -0
- package/lib/module/library/interceptors/index.js.map +1 -0
- package/lib/module/library/interceptors/js-console.js +83 -0
- package/lib/module/library/interceptors/js-console.js.map +1 -0
- package/lib/module/library/interceptors/react-devtools.js +214 -0
- package/lib/module/library/interceptors/react-devtools.js.map +1 -0
- package/lib/module/library/interceptors/xhr.js +69 -0
- package/lib/module/library/interceptors/xhr.js.map +1 -0
- package/lib/module/library/network-handler/index.js +4 -0
- package/lib/module/library/network-handler/index.js.map +1 -0
- package/lib/module/library/network-handler/network-handler.js +98 -0
- package/lib/module/library/network-handler/network-handler.js.map +1 -0
- package/lib/module/library/network-handler/types.js +4 -0
- package/lib/module/library/network-handler/types.js.map +1 -0
- package/lib/module/library/network-handler/utils/generate-request-id.js +9 -0
- package/lib/module/library/network-handler/utils/generate-request-id.js.map +1 -0
- package/lib/module/library/network-handler/utils/index.js +8 -0
- package/lib/module/library/network-handler/utils/index.js.map +1 -0
- package/lib/module/library/network-handler/utils/parse-response-headers.js +22 -0
- package/lib/module/library/network-handler/utils/parse-response-headers.js.map +1 -0
- package/lib/module/library/network-handler/utils/read-blob-as-text.js +14 -0
- package/lib/module/library/network-handler/utils/read-blob-as-text.js.map +1 -0
- package/lib/module/library/network-handler/utils/response-to-string.js +31 -0
- package/lib/module/library/network-handler/utils/response-to-string.js.map +1 -0
- package/lib/module/library/network-handler/utils/should-ignore-url.js +9 -0
- package/lib/module/library/network-handler/utils/should-ignore-url.js.map +1 -0
- package/lib/module/library/performance-handler/index.js +4 -0
- package/lib/module/library/performance-handler/index.js.map +1 -0
- package/lib/module/library/performance-handler/performance-handler.js +89 -0
- package/lib/module/library/performance-handler/performance-handler.js.map +1 -0
- package/lib/module/library/performance-handler/types.js +4 -0
- package/lib/module/library/performance-handler/types.js.map +1 -0
- package/lib/module/library/project/index.js +6 -0
- package/lib/module/library/project/index.js.map +1 -0
- package/lib/module/library/project/project-handler.js +26 -0
- package/lib/module/library/project/project-handler.js.map +1 -0
- package/lib/module/library/types.js +2 -0
- package/lib/module/library/types.js.map +1 -0
- package/lib/module/specs/mako.nitro.js +4 -0
- package/lib/module/specs/mako.nitro.js.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/library/client/constants.d.ts +24 -0
- package/lib/typescript/src/library/client/constants.d.ts.map +1 -0
- package/lib/typescript/src/library/client/index.d.ts +4 -0
- package/lib/typescript/src/library/client/index.d.ts.map +1 -0
- package/lib/typescript/src/library/client/mako-client.d.ts +87 -0
- package/lib/typescript/src/library/client/mako-client.d.ts.map +1 -0
- package/lib/typescript/src/library/component-handler/component-handler.d.ts +21 -0
- package/lib/typescript/src/library/component-handler/component-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/component-handler/index.d.ts +4 -0
- package/lib/typescript/src/library/component-handler/index.d.ts.map +1 -0
- package/lib/typescript/src/library/component-handler/types.d.ts +22 -0
- package/lib/typescript/src/library/component-handler/types.d.ts.map +1 -0
- package/lib/typescript/src/library/component-handler/utils/index.d.ts +13 -0
- package/lib/typescript/src/library/component-handler/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts +2 -0
- package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts.map +1 -0
- package/lib/typescript/src/library/device/device-handler.d.ts +11 -0
- package/lib/typescript/src/library/device/device-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/device/index.d.ts +3 -0
- package/lib/typescript/src/library/device/index.d.ts.map +1 -0
- package/lib/typescript/src/library/device/types.d.ts +8 -0
- package/lib/typescript/src/library/device/types.d.ts.map +1 -0
- package/lib/typescript/src/library/device/utils/generate-uuid.d.ts +2 -0
- package/lib/typescript/src/library/device/utils/generate-uuid.d.ts.map +1 -0
- package/lib/typescript/src/library/index.d.ts +120 -0
- package/lib/typescript/src/library/index.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts +2 -0
- package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/__tests__/react-devtools.test.d.ts +2 -0
- package/lib/typescript/src/library/interceptors/__tests__/react-devtools.test.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts +2 -0
- package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/index.d.ts +7 -0
- package/lib/typescript/src/library/interceptors/index.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/js-console.d.ts +17 -0
- package/lib/typescript/src/library/interceptors/js-console.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/react-devtools.d.ts +54 -0
- package/lib/typescript/src/library/interceptors/react-devtools.d.ts.map +1 -0
- package/lib/typescript/src/library/interceptors/xhr.d.ts +14 -0
- package/lib/typescript/src/library/interceptors/xhr.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/index.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/index.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/network-handler.d.ts +19 -0
- package/lib/typescript/src/library/network-handler/network-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/types.d.ts +6 -0
- package/lib/typescript/src/library/network-handler/types.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts +2 -0
- package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/index.d.ts +6 -0
- package/lib/typescript/src/library/network-handler/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts.map +1 -0
- package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts +5 -0
- package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/index.d.ts +3 -0
- package/lib/typescript/src/library/performance-handler/index.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/performance-handler.d.ts +27 -0
- package/lib/typescript/src/library/performance-handler/performance-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/performance-handler/types.d.ts +20 -0
- package/lib/typescript/src/library/performance-handler/types.d.ts.map +1 -0
- package/lib/typescript/src/library/project/index.d.ts +4 -0
- package/lib/typescript/src/library/project/index.d.ts.map +1 -0
- package/lib/typescript/src/library/project/project-handler.d.ts +7 -0
- package/lib/typescript/src/library/project/project-handler.d.ts.map +1 -0
- package/lib/typescript/src/library/types.d.ts +41 -0
- package/lib/typescript/src/library/types.d.ts.map +1 -0
- package/lib/typescript/src/specs/mako.nitro.d.ts +100 -0
- package/lib/typescript/src/specs/mako.nitro.d.ts.map +1 -0
- package/nitro.json +24 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroMako+autolinking.cmake +81 -0
- package/nitrogen/generated/android/NitroMako+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroMakoOnLoad.cpp +58 -0
- package/nitrogen/generated/android/NitroMakoOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JDeviceInfoResult.hpp +69 -0
- package/nitrogen/generated/android/c++/JFunc_void_NativeLogEntry.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_PerformanceMetrics.hpp +77 -0
- package/nitrogen/generated/android/c++/JHybridNitroMakoSpec.cpp +124 -0
- package/nitrogen/generated/android/c++/JHybridNitroMakoSpec.hpp +74 -0
- package/nitrogen/generated/android/c++/JNativeLogEntry.hpp +71 -0
- package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +64 -0
- package/nitrogen/generated/android/c++/JPerformanceMetrics.hpp +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/DeviceInfoResult.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/Func_void_NativeLogEntry.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/Func_void_PerformanceMetrics.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/HybridNitroMakoSpec.kt +108 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NativeLogEntry.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NativeLogLevel.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NitroMakoOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/PerformanceMetrics.kt +47 -0
- package/nitrogen/generated/ios/NitroMako+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Bridge.cpp +49 -0
- package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Bridge.hpp +185 -0
- package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Umbrella.hpp +58 -0
- package/nitrogen/generated/ios/NitroMakoAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroMakoAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridNitroMakoSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroMakoSpecSwift.hpp +175 -0
- package/nitrogen/generated/ios/swift/DeviceInfoResult.swift +44 -0
- package/nitrogen/generated/ios/swift/Func_void_NativeLogEntry.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PerformanceMetrics.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridNitroMakoSpec.swift +66 -0
- package/nitrogen/generated/ios/swift/HybridNitroMakoSpec_cxx.swift +289 -0
- package/nitrogen/generated/ios/swift/NativeLogEntry.swift +44 -0
- package/nitrogen/generated/ios/swift/NativeLogLevel.swift +48 -0
- package/nitrogen/generated/ios/swift/PerformanceMetrics.swift +44 -0
- package/nitrogen/generated/shared/c++/DeviceInfoResult.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridNitroMakoSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridNitroMakoSpec.hpp +83 -0
- package/nitrogen/generated/shared/c++/NativeLogEntry.hpp +97 -0
- package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +84 -0
- package/nitrogen/generated/shared/c++/PerformanceMetrics.hpp +95 -0
- package/package.json +128 -0
- package/react-native.config.js +16 -0
- package/src/index.ts +7 -0
- package/src/library/client/constants.ts +36 -0
- package/src/library/client/index.ts +9 -0
- package/src/library/client/mako-client.ts +494 -0
- package/src/library/component-handler/component-handler.ts +162 -0
- package/src/library/component-handler/index.ts +3 -0
- package/src/library/component-handler/types.ts +24 -0
- package/src/library/component-handler/utils/index.ts +23 -0
- package/src/library/device/__tests__/device-handler.test.ts +86 -0
- package/src/library/device/device-handler.ts +85 -0
- package/src/library/device/index.ts +3 -0
- package/src/library/device/types.ts +7 -0
- package/src/library/device/utils/generate-uuid.ts +7 -0
- package/src/library/index.ts +183 -0
- package/src/library/interceptors/__tests__/js-console.test.ts +186 -0
- package/src/library/interceptors/__tests__/react-devtools.test.ts +848 -0
- package/src/library/interceptors/__tests__/xhr.test.ts +313 -0
- package/src/library/interceptors/index.ts +7 -0
- package/src/library/interceptors/js-console.ts +93 -0
- package/src/library/interceptors/react-devtools.ts +268 -0
- package/src/library/interceptors/xhr.ts +123 -0
- package/src/library/network-handler/__tests__/network-handler.test.ts +265 -0
- package/src/library/network-handler/index.ts +1 -0
- package/src/library/network-handler/network-handler.ts +141 -0
- package/src/library/network-handler/types.ts +6 -0
- package/src/library/network-handler/utils/__tests__/generate-request-id.test.ts +22 -0
- package/src/library/network-handler/utils/__tests__/parse-response-headers.test.ts +71 -0
- package/src/library/network-handler/utils/__tests__/read-blob-as-text.test.ts +79 -0
- package/src/library/network-handler/utils/__tests__/response-to-string.test.ts +85 -0
- package/src/library/network-handler/utils/__tests__/should-ignore-url.test.ts +45 -0
- package/src/library/network-handler/utils/generate-request-id.ts +6 -0
- package/src/library/network-handler/utils/index.ts +5 -0
- package/src/library/network-handler/utils/parse-response-headers.ts +20 -0
- package/src/library/network-handler/utils/read-blob-as-text.ts +11 -0
- package/src/library/network-handler/utils/response-to-string.ts +32 -0
- package/src/library/network-handler/utils/should-ignore-url.ts +6 -0
- package/src/library/performance-handler/index.ts +2 -0
- package/src/library/performance-handler/performance-handler.ts +104 -0
- package/src/library/performance-handler/types.ts +22 -0
- package/src/library/project/index.ts +4 -0
- package/src/library/project/project-handler.ts +28 -0
- package/src/library/types.ts +82 -0
- package/src/specs/mako.nitro.ts +114 -0
|
@@ -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('[Mako] 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('[Mako] 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('[Mako] Network interception disabled');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { NetworkHandler } from '../index';
|
|
2
|
+
|
|
3
|
+
import * as utils from '../utils';
|
|
4
|
+
|
|
5
|
+
jest.mock('../utils');
|
|
6
|
+
|
|
7
|
+
describe('NetworkHandler', () => {
|
|
8
|
+
const onEvent = jest.fn();
|
|
9
|
+
|
|
10
|
+
const config = {
|
|
11
|
+
ignoredUrls: [],
|
|
12
|
+
onEvent,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
let handler: NetworkHandler;
|
|
16
|
+
let callbacks: ReturnType<NetworkHandler['getCallbacks']>;
|
|
17
|
+
let xhr: XMLHttpRequest;
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
jest.clearAllMocks();
|
|
21
|
+
|
|
22
|
+
handler = new NetworkHandler(config);
|
|
23
|
+
callbacks = handler.getCallbacks();
|
|
24
|
+
|
|
25
|
+
xhr = {} as XMLHttpRequest;
|
|
26
|
+
|
|
27
|
+
jest
|
|
28
|
+
.spyOn(utils, 'generateRequestId')
|
|
29
|
+
.mockReturnValue('request-id');
|
|
30
|
+
|
|
31
|
+
jest
|
|
32
|
+
.spyOn(Date, 'now')
|
|
33
|
+
.mockReturnValueOnce(1000)
|
|
34
|
+
.mockReturnValueOnce(1500);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
jest.restoreAllMocks();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should create pending request on open', () => {
|
|
42
|
+
jest
|
|
43
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
44
|
+
.mockReturnValue(false);
|
|
45
|
+
|
|
46
|
+
callbacks.onOpen(
|
|
47
|
+
'GET',
|
|
48
|
+
'https://api.com',
|
|
49
|
+
xhr,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
callbacks.onSend(undefined, xhr);
|
|
53
|
+
|
|
54
|
+
expect(onEvent).toHaveBeenCalledWith(
|
|
55
|
+
expect.objectContaining({
|
|
56
|
+
stage: 'request',
|
|
57
|
+
requestId: 'request-id',
|
|
58
|
+
method: 'GET',
|
|
59
|
+
url: 'https://api.com',
|
|
60
|
+
}),
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should ignore urls that match ignored patterns', () => {
|
|
65
|
+
jest
|
|
66
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
67
|
+
.mockReturnValue(true);
|
|
68
|
+
|
|
69
|
+
callbacks.onOpen(
|
|
70
|
+
'GET',
|
|
71
|
+
'https://ignored.com',
|
|
72
|
+
xhr,
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
callbacks.onSend(undefined, xhr);
|
|
76
|
+
|
|
77
|
+
expect(onEvent).not.toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should attach request headers', () => {
|
|
81
|
+
jest
|
|
82
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
83
|
+
.mockReturnValue(false);
|
|
84
|
+
|
|
85
|
+
callbacks.onOpen(
|
|
86
|
+
'POST',
|
|
87
|
+
'https://api.com',
|
|
88
|
+
xhr,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
callbacks.onRequestHeader(
|
|
92
|
+
'Authorization',
|
|
93
|
+
'Bearer token',
|
|
94
|
+
xhr,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
callbacks.onSend(undefined, xhr);
|
|
98
|
+
|
|
99
|
+
expect(onEvent).toHaveBeenCalledWith(
|
|
100
|
+
expect.objectContaining({
|
|
101
|
+
headers: {
|
|
102
|
+
Authorization: 'Bearer token',
|
|
103
|
+
},
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should attach request body', () => {
|
|
109
|
+
jest
|
|
110
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
111
|
+
.mockReturnValue(false);
|
|
112
|
+
|
|
113
|
+
callbacks.onOpen(
|
|
114
|
+
'POST',
|
|
115
|
+
'https://api.com',
|
|
116
|
+
xhr,
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
callbacks.onSend(
|
|
120
|
+
{ name: 'Gabriel' },
|
|
121
|
+
xhr,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
expect(onEvent).toHaveBeenCalledWith(
|
|
125
|
+
expect.objectContaining({
|
|
126
|
+
body: JSON.stringify({
|
|
127
|
+
name: 'Gabriel',
|
|
128
|
+
}),
|
|
129
|
+
}),
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('should parse response headers', () => {
|
|
134
|
+
jest
|
|
135
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
136
|
+
.mockReturnValue(false);
|
|
137
|
+
|
|
138
|
+
jest
|
|
139
|
+
.spyOn(utils, 'parseResponseHeaders')
|
|
140
|
+
.mockReturnValue({
|
|
141
|
+
'content-type': 'application/json',
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
callbacks.onOpen(
|
|
145
|
+
'GET',
|
|
146
|
+
'https://api.com',
|
|
147
|
+
xhr,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
callbacks.onHeaderReceived(
|
|
151
|
+
undefined,
|
|
152
|
+
undefined,
|
|
153
|
+
'Content-Type: application/json',
|
|
154
|
+
xhr,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
callbacks.onResponse(
|
|
158
|
+
200,
|
|
159
|
+
false,
|
|
160
|
+
'ok',
|
|
161
|
+
'https://api.com',
|
|
162
|
+
'text',
|
|
163
|
+
xhr,
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
expect(onEvent).toHaveBeenLastCalledWith(
|
|
167
|
+
expect.objectContaining({
|
|
168
|
+
headers: {
|
|
169
|
+
'content-type':
|
|
170
|
+
'application/json',
|
|
171
|
+
},
|
|
172
|
+
}),
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should emit response event', () => {
|
|
177
|
+
jest
|
|
178
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
179
|
+
.mockReturnValue(false);
|
|
180
|
+
|
|
181
|
+
jest
|
|
182
|
+
.spyOn(utils, 'responseToString')
|
|
183
|
+
.mockReturnValue('response body');
|
|
184
|
+
|
|
185
|
+
callbacks.onOpen(
|
|
186
|
+
'GET',
|
|
187
|
+
'https://api.com',
|
|
188
|
+
xhr,
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
callbacks.onSend(undefined, xhr);
|
|
192
|
+
|
|
193
|
+
callbacks.onResponse(
|
|
194
|
+
200,
|
|
195
|
+
false,
|
|
196
|
+
'response',
|
|
197
|
+
'https://api.com',
|
|
198
|
+
'text',
|
|
199
|
+
xhr,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
expect(onEvent).toHaveBeenLastCalledWith(
|
|
203
|
+
expect.objectContaining({
|
|
204
|
+
stage: 'response',
|
|
205
|
+
statusCode: 200,
|
|
206
|
+
body: 'response body',
|
|
207
|
+
duration: 500,
|
|
208
|
+
}),
|
|
209
|
+
);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('should handle blob responses', async () => {
|
|
213
|
+
jest
|
|
214
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
215
|
+
.mockReturnValue(false);
|
|
216
|
+
|
|
217
|
+
jest
|
|
218
|
+
.spyOn(utils, 'readBlobAsText')
|
|
219
|
+
.mockResolvedValue('blob content');
|
|
220
|
+
|
|
221
|
+
callbacks.onOpen(
|
|
222
|
+
'GET',
|
|
223
|
+
'https://api.com',
|
|
224
|
+
xhr,
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
callbacks.onResponse(
|
|
228
|
+
200,
|
|
229
|
+
false,
|
|
230
|
+
new Blob(['hello']),
|
|
231
|
+
'https://api.com',
|
|
232
|
+
'blob',
|
|
233
|
+
xhr,
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
await Promise.resolve();
|
|
237
|
+
|
|
238
|
+
expect(utils.readBlobAsText)
|
|
239
|
+
.toHaveBeenCalled();
|
|
240
|
+
|
|
241
|
+
expect(onEvent).toHaveBeenCalledWith(
|
|
242
|
+
expect.objectContaining({
|
|
243
|
+
body: 'blob content',
|
|
244
|
+
}),
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('should clear pending requests', () => {
|
|
249
|
+
jest
|
|
250
|
+
.spyOn(utils, 'shouldIgnoreUrl')
|
|
251
|
+
.mockReturnValue(false);
|
|
252
|
+
|
|
253
|
+
callbacks.onOpen(
|
|
254
|
+
'GET',
|
|
255
|
+
'https://api.com',
|
|
256
|
+
xhr,
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
handler.clear();
|
|
260
|
+
|
|
261
|
+
callbacks.onSend(undefined, xhr);
|
|
262
|
+
|
|
263
|
+
expect(onEvent).not.toHaveBeenCalled();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './network-handler'
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network interception handler
|
|
3
|
+
* Manages XHR request/response tracking and event creation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
NetworkCallbacks,
|
|
8
|
+
NetworkRequestEvent,
|
|
9
|
+
NetworkResponseEvent,
|
|
10
|
+
PendingRequest,
|
|
11
|
+
} from '../types'
|
|
12
|
+
import {
|
|
13
|
+
generateRequestId,
|
|
14
|
+
parseResponseHeaders,
|
|
15
|
+
shouldIgnoreUrl,
|
|
16
|
+
readBlobAsText,
|
|
17
|
+
responseToString,
|
|
18
|
+
} from './utils'
|
|
19
|
+
import type { NetworkHandlerConfig } from './types'
|
|
20
|
+
import { projectHandler } from '../project'
|
|
21
|
+
|
|
22
|
+
export class NetworkHandler {
|
|
23
|
+
private pendingRequests = new Map<XMLHttpRequest, PendingRequest>()
|
|
24
|
+
private config: NetworkHandlerConfig
|
|
25
|
+
|
|
26
|
+
constructor(config: NetworkHandlerConfig) {
|
|
27
|
+
this.config = config
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getCallbacks(): NetworkCallbacks {
|
|
31
|
+
return {
|
|
32
|
+
onOpen: this.handleOpen.bind(this),
|
|
33
|
+
onRequestHeader: this.handleRequestHeader.bind(this),
|
|
34
|
+
onSend: this.handleSend.bind(this),
|
|
35
|
+
onHeaderReceived: this.handleHeaderReceived.bind(this),
|
|
36
|
+
onResponse: this.handleResponse.bind(this),
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private handleOpen(method: string, url: string, xhr: XMLHttpRequest): void {
|
|
41
|
+
if (shouldIgnoreUrl(url, this.config.ignoredUrls)) return
|
|
42
|
+
|
|
43
|
+
const request: PendingRequest = {
|
|
44
|
+
id: generateRequestId(),
|
|
45
|
+
method,
|
|
46
|
+
url,
|
|
47
|
+
headers: {},
|
|
48
|
+
startTime: Date.now(),
|
|
49
|
+
}
|
|
50
|
+
this.pendingRequests.set(xhr, request)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private handleRequestHeader(
|
|
54
|
+
header: string,
|
|
55
|
+
value: string,
|
|
56
|
+
xhr: XMLHttpRequest
|
|
57
|
+
): void {
|
|
58
|
+
const request = this.pendingRequests.get(xhr)
|
|
59
|
+
if (request) {
|
|
60
|
+
request.headers[header] = value
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private handleSend(data: unknown, xhr: XMLHttpRequest): void {
|
|
65
|
+
const request = this.pendingRequests.get(xhr)
|
|
66
|
+
if (!request) return
|
|
67
|
+
|
|
68
|
+
if (data !== null && data !== undefined) {
|
|
69
|
+
request.body = typeof data === 'string' ? data : JSON.stringify(data)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const event: NetworkRequestEvent = {
|
|
73
|
+
type: 'network',
|
|
74
|
+
stage: 'request',
|
|
75
|
+
requestId: request.id,
|
|
76
|
+
method: request.method,
|
|
77
|
+
url: request.url,
|
|
78
|
+
headers: request.headers,
|
|
79
|
+
body: request.body,
|
|
80
|
+
timestamp: request.startTime,
|
|
81
|
+
projectId: projectHandler.getProjectId(),
|
|
82
|
+
}
|
|
83
|
+
this.config.onEvent(event)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private handleHeaderReceived(
|
|
87
|
+
_responseContentType: string | undefined,
|
|
88
|
+
_responseSize: number | undefined,
|
|
89
|
+
responseHeaders: string,
|
|
90
|
+
xhr: XMLHttpRequest
|
|
91
|
+
): void {
|
|
92
|
+
const request = this.pendingRequests.get(xhr)
|
|
93
|
+
if (request) {
|
|
94
|
+
request.responseHeaders = parseResponseHeaders(responseHeaders)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private handleResponse(
|
|
99
|
+
status: number,
|
|
100
|
+
_timeout: boolean,
|
|
101
|
+
response: unknown,
|
|
102
|
+
responseURL: string,
|
|
103
|
+
responseType: string,
|
|
104
|
+
xhr: XMLHttpRequest
|
|
105
|
+
): void {
|
|
106
|
+
const request = this.pendingRequests.get(xhr)
|
|
107
|
+
if (!request) return
|
|
108
|
+
|
|
109
|
+
const endTime = Date.now()
|
|
110
|
+
const projectId = projectHandler.getProjectId()
|
|
111
|
+
|
|
112
|
+
const sendResponseEvent = (bodyString: string | undefined) => {
|
|
113
|
+
const event: NetworkResponseEvent = {
|
|
114
|
+
type: 'network',
|
|
115
|
+
stage: 'response',
|
|
116
|
+
requestId: request.id,
|
|
117
|
+
method: request.method,
|
|
118
|
+
url: responseURL || request.url,
|
|
119
|
+
statusCode: status,
|
|
120
|
+
duration: endTime - request.startTime,
|
|
121
|
+
headers: request.responseHeaders,
|
|
122
|
+
body: bodyString,
|
|
123
|
+
timestamp: endTime,
|
|
124
|
+
projectId,
|
|
125
|
+
}
|
|
126
|
+
this.config.onEvent(event)
|
|
127
|
+
this.pendingRequests.delete(xhr)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (responseType === 'blob' && response instanceof Blob) {
|
|
131
|
+
readBlobAsText(response).then(sendResponseEvent)
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
sendResponseEvent(responseToString(response, xhr))
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
clear(): void {
|
|
139
|
+
this.pendingRequests.clear()
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { generateRequestId } from '../generate-request-id'
|
|
2
|
+
|
|
3
|
+
describe('generateRequestId', () => {
|
|
4
|
+
it('should return a string', () => {
|
|
5
|
+
const id = generateRequestId()
|
|
6
|
+
|
|
7
|
+
expect(typeof id).toBe('string')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('should generate an id in the expected format', () => {
|
|
11
|
+
const id = generateRequestId()
|
|
12
|
+
|
|
13
|
+
expect(id).toMatch(/^\d+-[a-z0-9]+$/)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('should generate unique ids', () => {
|
|
17
|
+
const id1 = generateRequestId()
|
|
18
|
+
const id2 = generateRequestId()
|
|
19
|
+
|
|
20
|
+
expect(id1).not.toBe(id2)
|
|
21
|
+
})
|
|
22
|
+
})
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { parseResponseHeaders } from '../parse-response-headers'
|
|
2
|
+
|
|
3
|
+
describe('parseResponseHeaders', () => {
|
|
4
|
+
it('should return empty object when headers string is empty', () => {
|
|
5
|
+
expect(parseResponseHeaders('')).toEqual({})
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
it('should parse single header', () => {
|
|
9
|
+
const headers = parseResponseHeaders('Content-Type: application/json')
|
|
10
|
+
|
|
11
|
+
expect(headers).toEqual({
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('should parse multiple headers', () => {
|
|
17
|
+
const headers = parseResponseHeaders(
|
|
18
|
+
[
|
|
19
|
+
'Content-Type: application/json',
|
|
20
|
+
'Authorization: Bearer token',
|
|
21
|
+
'X-Test: 123',
|
|
22
|
+
].join('\r\n')
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
expect(headers).toEqual({
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
'Authorization': 'Bearer token',
|
|
28
|
+
'X-Test': '123',
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('should trim spaces from keys and values', () => {
|
|
33
|
+
const headers = parseResponseHeaders(
|
|
34
|
+
' Content-Type : application/json '
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
expect(headers).toEqual({
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('should ignore invalid lines', () => {
|
|
43
|
+
const headers = parseResponseHeaders(
|
|
44
|
+
['Content-Type: application/json', 'invalid-line', ': missing-key'].join(
|
|
45
|
+
'\n'
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
expect(headers).toEqual({
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('should support values containing colon', () => {
|
|
55
|
+
const headers = parseResponseHeaders('Authorization: Bearer abc:def:ghi')
|
|
56
|
+
|
|
57
|
+
expect(headers).toEqual({
|
|
58
|
+
Authorization: 'Bearer abc:def:ghi',
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('should overwrite duplicated headers', () => {
|
|
63
|
+
const headers = parseResponseHeaders(
|
|
64
|
+
['X-Test: first', 'X-Test: second'].join('\n')
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
expect(headers).toEqual({
|
|
68
|
+
'X-Test': 'second',
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
})
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { readBlobAsText } from '../read-blob-as-text'
|
|
2
|
+
|
|
3
|
+
describe('readBlobAsText', () => {
|
|
4
|
+
const originalFileReader = global.FileReader
|
|
5
|
+
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
global.FileReader = originalFileReader
|
|
8
|
+
jest.restoreAllMocks()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('should resolve blob text successfully', async () => {
|
|
12
|
+
class MockFileReader {
|
|
13
|
+
result = 'hello world'
|
|
14
|
+
|
|
15
|
+
onloadend: (() => void) | null = null
|
|
16
|
+
onerror: (() => void) | null = null
|
|
17
|
+
|
|
18
|
+
readAsText() {
|
|
19
|
+
this.onloadend?.()
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
global.FileReader = MockFileReader
|
|
25
|
+
|
|
26
|
+
const blob = new Blob(['hello world'])
|
|
27
|
+
|
|
28
|
+
const result = await readBlobAsText(blob)
|
|
29
|
+
|
|
30
|
+
expect(result).toBe('hello world')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should resolve undefined on error', async () => {
|
|
34
|
+
class MockFileReader {
|
|
35
|
+
result = null
|
|
36
|
+
|
|
37
|
+
onloadend: (() => void) | null = null
|
|
38
|
+
onerror: (() => void) | null = null
|
|
39
|
+
|
|
40
|
+
readAsText() {
|
|
41
|
+
this.onerror?.()
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
global.FileReader = MockFileReader
|
|
47
|
+
|
|
48
|
+
const blob = new Blob(['test'])
|
|
49
|
+
|
|
50
|
+
const result = await readBlobAsText(blob)
|
|
51
|
+
|
|
52
|
+
expect(result).toBeUndefined()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should call readAsText with provided blob', async () => {
|
|
56
|
+
const readAsTextMock = jest.fn()
|
|
57
|
+
|
|
58
|
+
class MockFileReader {
|
|
59
|
+
result = 'ok'
|
|
60
|
+
|
|
61
|
+
onloadend: (() => void) | null = null
|
|
62
|
+
onerror: (() => void) | null = null
|
|
63
|
+
|
|
64
|
+
readAsText(blob: Blob) {
|
|
65
|
+
readAsTextMock(blob)
|
|
66
|
+
this.onloadend?.()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// @ts-ignore
|
|
71
|
+
global.FileReader = MockFileReader
|
|
72
|
+
|
|
73
|
+
const blob = new Blob(['content'])
|
|
74
|
+
|
|
75
|
+
await readBlobAsText(blob)
|
|
76
|
+
|
|
77
|
+
expect(readAsTextMock).toHaveBeenCalledWith(blob)
|
|
78
|
+
})
|
|
79
|
+
})
|