expo-updates 58.0.0 → 58.0.2
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/.npmignore +5 -0
- package/CHANGELOG.md +11 -0
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt +85 -33
- package/android/src/main/java/expo/modules/updates/loader/RemoteLoader.kt +23 -3
- package/build/ExpoUpdates.web.d.ts +1 -1
- package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/last-build.bin +0 -0
- package/ios/EXUpdates/AppLoader/FileDownloader.swift +23 -2
- package/package.json +4 -4
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cache-v2-f7b3549f78edcf21e703.json +0 -1419
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-e040f6d6310b1c8d7d75.json +0 -194
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-4a567ed04919744ae26e.json +0 -69
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/index-2026-09-10T12-41-06-0016.json +0 -92
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-expo-updates-Debug-d55207f1a077a90f2056.json +0 -235
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_deps +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_log +0 -17
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeCache.txt +0 -422
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -4
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/rules.ninja +0 -93
- package/android/.cxx/Debug/38204d1n/arm64-v8a/additional_project_files.txt +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build.json +0 -50
- package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build_mini.json +0 -37
- package/android/.cxx/Debug/38204d1n/arm64-v8a/build.ninja +0 -245
- package/android/.cxx/Debug/38204d1n/arm64-v8a/build_file_index.txt +0 -3
- package/android/.cxx/Debug/38204d1n/arm64-v8a/cmake_install.cmake +0 -54
- package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json +0 -52
- package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json.bin +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/configure_fingerprint.bin +0 -39
- package/android/.cxx/Debug/38204d1n/arm64-v8a/libbzip2.a +0 -0
- package/android/.cxx/Debug/38204d1n/arm64-v8a/metadata_generation_command.txt +0 -22
- package/android/.cxx/Debug/38204d1n/arm64-v8a/prefab_config.json +0 -9
- package/android/.cxx/Debug/38204d1n/arm64-v8a/symbol_folder_index.txt +0 -1
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/cache-v2-ae8b6f60c7f134daa03e.json +0 -1419
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-59c7020eed69ef2bfe3e.json +0 -194
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-63f4a3075f1b4457c584.json +0 -69
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/index-2026-09-07T15-55-40-0729.json +0 -92
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/target-bzip2-Debug-7ee22a1a3974c001a017.json +0 -143
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/target-expo-updates-Debug-0c1cd82b629aa1da43d3.json +0 -235
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.ninja_deps +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/.ninja_log +0 -17
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeCache.txt +0 -422
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/CMakeOutput.log +0 -266
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/TargetDirectories.txt +0 -4
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/cmake.check_cache +0 -1
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/rules.ninja +0 -93
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/additional_project_files.txt +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/android_gradle_build.json +0 -50
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/android_gradle_build_mini.json +0 -37
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/build.ninja +0 -245
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/build_file_index.txt +0 -3
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/cmake_install.cmake +0 -54
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/compile_commands.json +0 -52
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/compile_commands.json.bin +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/configure_fingerprint.bin +0 -33
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/libbzip2.a +0 -0
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/metadata_generation_command.txt +0 -22
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/prefab_config.json +0 -9
- package/android/.cxx/Debug/38204d1n/armeabi-v7a/symbol_folder_index.txt +0 -1
- package/android/.cxx/Debug/38204d1n/hash_key.txt +0 -29
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/fbjni/fbjniConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cache-v2-d7a10dd1f6d3df4d8ab3.json +0 -1419
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cmakeFiles-v1-6dee4bf659a7f2e2f5f6.json +0 -194
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/codemodel-v2-40de86b6f126d82f5ee9.json +0 -69
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/index-2026-09-10T12-40-19-0488.json +0 -92
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
- package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-expo-updates-Debug-9cbe107985289ffd0553.json +0 -235
- package/android/.cxx/Debug/38204d1n/x86/.ninja_deps +0 -0
- package/android/.cxx/Debug/38204d1n/x86/.ninja_log +0 -13
- package/android/.cxx/Debug/38204d1n/x86/CMakeCache.txt +0 -422
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/CMakeOutput.log +0 -256
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/TargetDirectories.txt +0 -4
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/cmake.check_cache +0 -1
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/rules.ninja +0 -93
- package/android/.cxx/Debug/38204d1n/x86/additional_project_files.txt +0 -0
- package/android/.cxx/Debug/38204d1n/x86/android_gradle_build.json +0 -50
- package/android/.cxx/Debug/38204d1n/x86/android_gradle_build_mini.json +0 -37
- package/android/.cxx/Debug/38204d1n/x86/build.ninja +0 -245
- package/android/.cxx/Debug/38204d1n/x86/build_file_index.txt +0 -3
- package/android/.cxx/Debug/38204d1n/x86/cmake_install.cmake +0 -54
- package/android/.cxx/Debug/38204d1n/x86/compile_commands.json +0 -52
- package/android/.cxx/Debug/38204d1n/x86/compile_commands.json.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86/configure_fingerprint.bin +0 -39
- package/android/.cxx/Debug/38204d1n/x86/libbzip2.a +0 -0
- package/android/.cxx/Debug/38204d1n/x86/metadata_generation_command.txt +0 -22
- package/android/.cxx/Debug/38204d1n/x86/prefab_config.json +0 -9
- package/android/.cxx/Debug/38204d1n/x86/symbol_folder_index.txt +0 -1
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/cache-v2-9126117537263988081d.json +0 -1419
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-8eafaadcce9c4bc5c9ea.json +0 -194
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/codemodel-v2-d82f541213b24e47c2e2.json +0 -69
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/index-2026-09-07T15-55-41-0613.json +0 -92
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
- package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/target-expo-updates-Debug-f0f846e7c91ce5a671f5.json +0 -235
- package/android/.cxx/Debug/38204d1n/x86_64/.ninja_deps +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/.ninja_log +0 -17
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeCache.txt +0 -422
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/CMakeOutput.log +0 -258
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/TargetDirectories.txt +0 -4
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/cmake.check_cache +0 -1
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/rules.ninja +0 -93
- package/android/.cxx/Debug/38204d1n/x86_64/additional_project_files.txt +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/android_gradle_build.json +0 -50
- package/android/.cxx/Debug/38204d1n/x86_64/android_gradle_build_mini.json +0 -37
- package/android/.cxx/Debug/38204d1n/x86_64/build.ninja +0 -245
- package/android/.cxx/Debug/38204d1n/x86_64/build_file_index.txt +0 -3
- package/android/.cxx/Debug/38204d1n/x86_64/cmake_install.cmake +0 -54
- package/android/.cxx/Debug/38204d1n/x86_64/compile_commands.json +0 -52
- package/android/.cxx/Debug/38204d1n/x86_64/compile_commands.json.bin +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/configure_fingerprint.bin +0 -33
- package/android/.cxx/Debug/38204d1n/x86_64/libbzip2.a +0 -0
- package/android/.cxx/Debug/38204d1n/x86_64/metadata_generation_command.txt +0 -22
- package/android/.cxx/Debug/38204d1n/x86_64/prefab_config.json +0 -9
- package/android/.cxx/Debug/38204d1n/x86_64/symbol_folder_index.txt +0 -1
- package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +0 -52
- package/android/.cxx/tools/debug/armeabi-v7a/compile_commands.json +0 -52
- package/android/.cxx/tools/debug/x86/compile_commands.json +0 -52
- package/android/.cxx/tools/debug/x86_64/compile_commands.json +0 -52
- package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/checksums/checksums.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/executionHistory/executionHistory.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/fileChanges/last-build.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.0/gc.properties +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/expo-updates-gradle-plugin/.gradle/file-system.probe +0 -0
- package/expo-updates-gradle-plugin/.gradle/vcs-1/gc.properties +0 -0
package/.npmignore
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 58.0.2 — 2026-09-14
|
|
14
|
+
|
|
15
|
+
_This version does not introduce any user-facing changes._
|
|
16
|
+
|
|
17
|
+
## 58.0.1 — 2026-09-14
|
|
18
|
+
|
|
19
|
+
### 🐛 Bug fixes
|
|
20
|
+
|
|
21
|
+
- [iOS] Apply bundle diffs against the embedded bundle in the app binary when the launched update is the embedded one, instead of failing to resolve a patch base and downloading the full bundle. ([#50018](https://github.com/expo/expo/pull/50018) by [@alanjhughes](https://github.com/alanjhughes))
|
|
22
|
+
- [Android] Apply bundle diffs against the embedded bundle in the app binary when the launched update is the embedded one, instead of failing to resolve a patch base and downloading the full bundle. ([#50019](https://github.com/expo/expo/pull/50019) by [@alanjhughes](https://github.com/alanjhughes))
|
|
23
|
+
|
|
13
24
|
## 58.0.0 — 2026-09-10
|
|
14
25
|
|
|
15
26
|
### 🎉 New features
|
package/android/build.gradle
CHANGED
|
@@ -42,7 +42,7 @@ expoModule {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
group = 'host.exp.exponent'
|
|
45
|
-
version = '58.0.
|
|
45
|
+
version = '58.0.2'
|
|
46
46
|
|
|
47
47
|
// Utility method to derive boolean values from the environment or from Java properties,
|
|
48
48
|
// and return them as strings to be used in BuildConfig fields
|
|
@@ -98,7 +98,7 @@ android {
|
|
|
98
98
|
namespace "expo.modules.updates"
|
|
99
99
|
defaultConfig {
|
|
100
100
|
versionCode 31
|
|
101
|
-
versionName '58.0.
|
|
101
|
+
versionName '58.0.2'
|
|
102
102
|
consumerProguardFiles("proguard-rules.pro")
|
|
103
103
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
104
104
|
|
|
@@ -23,6 +23,7 @@ import expo.modules.updates.manifest.ResponsePartHeaderData
|
|
|
23
23
|
import expo.modules.updates.manifest.ResponsePartInfo
|
|
24
24
|
import expo.modules.updates.manifest.UpdateFactory
|
|
25
25
|
import expo.modules.updates.selectionpolicy.SelectionPolicies
|
|
26
|
+
import expo.modules.updates.utils.AndroidResourceAssetUtils
|
|
26
27
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
|
27
28
|
import okhttp3.Cache
|
|
28
29
|
import okhttp3.Headers
|
|
@@ -51,6 +52,7 @@ import kotlin.math.min
|
|
|
51
52
|
|
|
52
53
|
private const val PATCH_TEMP_SUFFIX = ".patch"
|
|
53
54
|
private const val PATCHED_TEMP_SUFFIX = ".patched"
|
|
55
|
+
private const val PATCH_BASE_TEMP_SUFFIX = ".base"
|
|
54
56
|
private const val A_IM_HEADER = "A-IM"
|
|
55
57
|
private const val IM_HEADER = "im"
|
|
56
58
|
private const val EXPO_BASE_UPDATE_ID_RESPONSE_HEADER = "expo-base-update-id"
|
|
@@ -58,6 +60,8 @@ private const val EXPO_CURRENT_UPDATE_ID_HEADER = "Expo-Current-Update-ID"
|
|
|
58
60
|
private const val EXPO_REQUESTED_UPDATE_ID_HEADER = "Expo-Requested-Update-ID"
|
|
59
61
|
private const val EXPO_EMBEDDED_UPDATE_ID_HEADER = "Expo-Embedded-Update-ID"
|
|
60
62
|
|
|
63
|
+
internal typealias EmbeddedAssetExtractor = (AssetEntity, File) -> Unit
|
|
64
|
+
|
|
61
65
|
/**
|
|
62
66
|
* Utility class that holds all the logic for downloading data and files, such as update manifests
|
|
63
67
|
* and assets, using an instance of [OkHttpClient].
|
|
@@ -107,7 +111,8 @@ class FileDownloader(
|
|
|
107
111
|
progressListener: FileDownloadProgressListener? = null,
|
|
108
112
|
allowPatch: Boolean,
|
|
109
113
|
launchedUpdate: UpdateEntity? = null,
|
|
110
|
-
requestedUpdate: UpdateEntity? = null
|
|
114
|
+
requestedUpdate: UpdateEntity? = null,
|
|
115
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor? = null
|
|
111
116
|
): FileDownloadResult {
|
|
112
117
|
try {
|
|
113
118
|
val response = downloadData(request, progressListener)
|
|
@@ -176,7 +181,8 @@ class FileDownloader(
|
|
|
176
181
|
updatesDirectory = updatesDirectory,
|
|
177
182
|
launchedUpdate = launchedUpdate,
|
|
178
183
|
requestedUpdate = requestedUpdate,
|
|
179
|
-
expectedBase64URLEncodedSHA256Hash = expectedBase64URLEncodedSHA256Hash
|
|
184
|
+
expectedBase64URLEncodedSHA256Hash = expectedBase64URLEncodedSHA256Hash,
|
|
185
|
+
embeddedAssetExtractor = embeddedAssetExtractor
|
|
180
186
|
)
|
|
181
187
|
}.getOrElse {
|
|
182
188
|
logger.warn(
|
|
@@ -294,36 +300,47 @@ class FileDownloader(
|
|
|
294
300
|
updatesDirectory: File,
|
|
295
301
|
launchedUpdate: UpdateEntity,
|
|
296
302
|
requestedUpdate: UpdateEntity?,
|
|
297
|
-
expectedBase64URLEncodedSHA256Hash: String
|
|
303
|
+
expectedBase64URLEncodedSHA256Hash: String?,
|
|
304
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor? = null
|
|
298
305
|
): ByteArray {
|
|
299
306
|
val launchAssetContext = prepareAssetForDiff(
|
|
300
307
|
asset = asset,
|
|
301
308
|
responseBody = responseBody,
|
|
309
|
+
destination = destination,
|
|
302
310
|
updatesDirectory = updatesDirectory,
|
|
303
|
-
launchedUpdate = launchedUpdate
|
|
311
|
+
launchedUpdate = launchedUpdate,
|
|
312
|
+
embeddedAssetExtractor = embeddedAssetExtractor
|
|
304
313
|
)
|
|
305
314
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
315
|
+
try {
|
|
316
|
+
return applyHermesDiff(
|
|
317
|
+
baseFile = launchAssetContext.baseFile,
|
|
318
|
+
diffBody = responseBody,
|
|
319
|
+
destination = destination,
|
|
320
|
+
expectedBase64URLEncodedSHA256Hash = expectedBase64URLEncodedSHA256Hash,
|
|
321
|
+
asset = asset,
|
|
322
|
+
requestedUpdateId = requestedUpdate?.id?.toString()
|
|
323
|
+
)
|
|
324
|
+
} finally {
|
|
325
|
+
if (launchAssetContext.isTemporary) {
|
|
326
|
+
launchAssetContext.baseFile.delete()
|
|
327
|
+
}
|
|
328
|
+
}
|
|
314
329
|
}
|
|
315
330
|
|
|
316
|
-
internal data class LaunchAssetContext(val baseFile: File)
|
|
331
|
+
internal data class LaunchAssetContext(val baseFile: File, val isTemporary: Boolean = false)
|
|
317
332
|
|
|
318
333
|
@VisibleForTesting
|
|
319
334
|
internal fun prepareAssetForDiff(
|
|
320
335
|
asset: AssetEntity,
|
|
321
336
|
responseBody: ResponseBody,
|
|
337
|
+
destination: File,
|
|
322
338
|
updatesDirectory: File,
|
|
323
|
-
launchedUpdate: UpdateEntity
|
|
339
|
+
launchedUpdate: UpdateEntity,
|
|
340
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor? = null
|
|
324
341
|
): LaunchAssetContext {
|
|
325
342
|
return try {
|
|
326
|
-
preparePatchBaseAsset(asset, updatesDirectory, launchedUpdate)
|
|
343
|
+
preparePatchBaseAsset(asset, destination, updatesDirectory, launchedUpdate, embeddedAssetExtractor)
|
|
327
344
|
} catch (e: Exception) {
|
|
328
345
|
responseBody.close()
|
|
329
346
|
if (e is IOException) {
|
|
@@ -336,8 +353,10 @@ class FileDownloader(
|
|
|
336
353
|
|
|
337
354
|
private fun preparePatchBaseAsset(
|
|
338
355
|
asset: AssetEntity,
|
|
356
|
+
destination: File,
|
|
339
357
|
updatesDirectory: File,
|
|
340
|
-
launchedUpdate: UpdateEntity
|
|
358
|
+
launchedUpdate: UpdateEntity,
|
|
359
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor? = null
|
|
341
360
|
): LaunchAssetContext {
|
|
342
361
|
if (!asset.isLaunchAsset) {
|
|
343
362
|
throw IOException("Received patch for non-launch asset ${asset.key}")
|
|
@@ -351,29 +370,60 @@ class FileDownloader(
|
|
|
351
370
|
val launchAssetRelativePath = launchAssetEntity.relativePath
|
|
352
371
|
?: throw IOException("Launch asset for update $currentUpdateId is missing a relative path")
|
|
353
372
|
|
|
354
|
-
|
|
373
|
+
// BSPatch needs a real path, so an asset inside the APK is extracted first.
|
|
374
|
+
val isEmbeddedLaunchAsset = AndroidResourceAssetUtils.isAndroidResourceAsset(launchAssetRelativePath)
|
|
375
|
+
val baseFile = if (isEmbeddedLaunchAsset) {
|
|
376
|
+
extractEmbeddedPatchBaseAsset(launchAssetEntity, destination, embeddedAssetExtractor)
|
|
377
|
+
} else {
|
|
378
|
+
File(updatesDirectory, launchAssetRelativePath)
|
|
379
|
+
}
|
|
355
380
|
if (!baseFile.exists()) {
|
|
356
381
|
throw IOException("Base asset $baseFile is missing; cannot apply patch")
|
|
357
382
|
}
|
|
358
383
|
|
|
359
|
-
val
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
384
|
+
val expectedBaseHash = launchAssetEntity.expectedHash
|
|
385
|
+
if (expectedBaseHash != null) {
|
|
386
|
+
val actualBaseHash = try {
|
|
387
|
+
UpdatesUtils.toBase64Url(UpdatesUtils.sha256(baseFile))
|
|
388
|
+
} catch (_: Exception) {
|
|
389
|
+
null
|
|
390
|
+
}
|
|
391
|
+
if (actualBaseHash != null && expectedBaseHash != actualBaseHash) {
|
|
392
|
+
logger.warn(
|
|
393
|
+
"Asset hash mismatch for update $currentUpdateId; expected=$expectedBaseHash actual=$actualBaseHash",
|
|
394
|
+
UpdatesErrorCode.AssetsFailedToLoad,
|
|
395
|
+
currentUpdateId.toString(),
|
|
396
|
+
asset.key
|
|
397
|
+
)
|
|
398
|
+
if (isEmbeddedLaunchAsset) {
|
|
399
|
+
baseFile.delete()
|
|
400
|
+
}
|
|
401
|
+
throw IOException("Asset hash mismatch for update $currentUpdateId; expected=$expectedBaseHash actual=$actualBaseHash")
|
|
402
|
+
}
|
|
363
403
|
}
|
|
364
404
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
405
|
+
return LaunchAssetContext(baseFile, isTemporary = isEmbeddedLaunchAsset)
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
@Throws(IOException::class)
|
|
409
|
+
private fun extractEmbeddedPatchBaseAsset(
|
|
410
|
+
launchAssetEntity: AssetEntity,
|
|
411
|
+
destination: File,
|
|
412
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor?
|
|
413
|
+
): File {
|
|
414
|
+
if (embeddedAssetExtractor == null) {
|
|
415
|
+
throw IOException("The launch asset lives in the app binary and cannot be extracted without an extractor")
|
|
374
416
|
}
|
|
375
417
|
|
|
376
|
-
|
|
418
|
+
val baseFile = File(destination.absolutePath + PATCH_BASE_TEMP_SUFFIX)
|
|
419
|
+
try {
|
|
420
|
+
baseFile.parentFile?.mkdirs()
|
|
421
|
+
embeddedAssetExtractor(launchAssetEntity, baseFile)
|
|
422
|
+
} catch (e: Exception) {
|
|
423
|
+
baseFile.delete()
|
|
424
|
+
throw e as? IOException ?: IOException("Failed to extract the embedded launch asset", e)
|
|
425
|
+
}
|
|
426
|
+
return baseFile
|
|
377
427
|
}
|
|
378
428
|
|
|
379
429
|
@VisibleForTesting
|
|
@@ -678,7 +728,8 @@ class FileDownloader(
|
|
|
678
728
|
extraHeaders: JSONObject,
|
|
679
729
|
launchedUpdate: UpdateEntity?,
|
|
680
730
|
requestedUpdate: UpdateEntity?,
|
|
681
|
-
assetLoadProgressListener: ((Double) -> Unit)? = null
|
|
731
|
+
assetLoadProgressListener: ((Double) -> Unit)? = null,
|
|
732
|
+
embeddedAssetExtractor: EmbeddedAssetExtractor? = null
|
|
682
733
|
): AssetDownloadResult {
|
|
683
734
|
if (asset.url == null) {
|
|
684
735
|
val message = "Failed to download asset ${asset.key}"
|
|
@@ -722,7 +773,8 @@ class FileDownloader(
|
|
|
722
773
|
assetLoadProgressListener?.let { listener -> { listener.invoke(it) } },
|
|
723
774
|
allowPatch = canApplyPatch,
|
|
724
775
|
launchedUpdate = launchedUpdate,
|
|
725
|
-
requestedUpdate = requestedUpdate
|
|
776
|
+
requestedUpdate = requestedUpdate,
|
|
777
|
+
embeddedAssetExtractor = embeddedAssetExtractor
|
|
726
778
|
)
|
|
727
779
|
|
|
728
780
|
asset.downloadTime = Date()
|
|
@@ -14,6 +14,7 @@ import kotlinx.coroutines.CoroutineScope
|
|
|
14
14
|
import kotlinx.coroutines.Dispatchers
|
|
15
15
|
import kotlinx.coroutines.SupervisorJob
|
|
16
16
|
import java.io.File
|
|
17
|
+
import java.io.IOException
|
|
17
18
|
|
|
18
19
|
data class ProcessSuccessLoaderResult(
|
|
19
20
|
val availableUpdate: UpdateEntity?,
|
|
@@ -66,9 +67,28 @@ class RemoteLoader internal constructor(
|
|
|
66
67
|
embeddedUpdate: UpdateEntity?
|
|
67
68
|
): FileDownloader.AssetDownloadResult {
|
|
68
69
|
val extraHeaders = FileDownloader.getExtraHeadersForRemoteAssetRequest(launchedUpdate, embeddedUpdate, requestedUpdate)
|
|
69
|
-
return mFileDownloader.downloadAsset(
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
return mFileDownloader.downloadAsset(
|
|
71
|
+
asset = assetEntity,
|
|
72
|
+
destinationDirectory = updatesDirectory,
|
|
73
|
+
extraHeaders = extraHeaders,
|
|
74
|
+
launchedUpdate = launchedUpdate,
|
|
75
|
+
requestedUpdate = requestedUpdate,
|
|
76
|
+
embeddedAssetExtractor = { launchAsset, destination ->
|
|
77
|
+
// The stored path is not the APK asset name; resolve it through the embedded manifest by key.
|
|
78
|
+
val embeddedLaunchAsset = loaderFiles.readEmbeddedUpdate(context, configuration)
|
|
79
|
+
?.assetEntityList
|
|
80
|
+
?.find { it.key == launchAsset.key }
|
|
81
|
+
?: throw IOException("No embedded asset matches launch asset ${launchAsset.key}")
|
|
82
|
+
val assetName = embeddedLaunchAsset.embeddedAssetFilename
|
|
83
|
+
?: throw IOException("Embedded launch asset ${launchAsset.key} has no APK asset filename")
|
|
84
|
+
context.assets.open(assetName).use { input ->
|
|
85
|
+
destination.outputStream().use { output -> input.copyTo(output) }
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
assetLoadProgressListener = { progress ->
|
|
89
|
+
assetLoadProgressListener(assetEntity, progress)
|
|
90
|
+
}
|
|
91
|
+
)
|
|
72
92
|
}
|
|
73
93
|
|
|
74
94
|
companion object {
|
|
@@ -31,5 +31,5 @@ declare class ExpoUpdatesModule extends NativeModule<UpdatesEvents> implements U
|
|
|
31
31
|
clearLogEntriesAsync(): Promise<void>;
|
|
32
32
|
fetchUpdateAsync(): Promise<UpdateFetchResultFailure>;
|
|
33
33
|
}
|
|
34
|
-
declare const _default:
|
|
34
|
+
declare const _default: ExpoUpdatesModule;
|
|
35
35
|
export default _default;
|
|
Binary file
|
|
@@ -84,6 +84,12 @@ public final class FileDownloader {
|
|
|
84
84
|
private let updatesDirectory: URL
|
|
85
85
|
private let database: UpdatesDatabase
|
|
86
86
|
|
|
87
|
+
/// Overridable for testing, where the fixture is not in `updatesBundle`.
|
|
88
|
+
internal var embeddedLaunchAssetUrl: URL? = updatesBundle.url(
|
|
89
|
+
forResource: EmbeddedAppLoader.EXUpdatesBareEmbeddedBundleFilename,
|
|
90
|
+
withExtension: EmbeddedAppLoader.EXUpdatesBareEmbeddedBundleFileType
|
|
91
|
+
)
|
|
92
|
+
|
|
87
93
|
public convenience init(
|
|
88
94
|
config: UpdatesConfig,
|
|
89
95
|
logger: UpdatesLogger,
|
|
@@ -558,8 +564,7 @@ public final class FileDownloader {
|
|
|
558
564
|
throw DiffError.assetNotLaunch
|
|
559
565
|
}
|
|
560
566
|
|
|
561
|
-
let
|
|
562
|
-
let baseFileUrl = try loadAndVerifyAsset(baseAsset)
|
|
567
|
+
let baseFileUrl = try resolveBaseFileUrl(launchedUpdate: launchedUpdate)
|
|
563
568
|
let requestedUpdateId = requestedUpdate?.updateId.uuidString
|
|
564
569
|
|
|
565
570
|
return try createPatchedAsset(
|
|
@@ -572,6 +577,19 @@ public final class FileDownloader {
|
|
|
572
577
|
)
|
|
573
578
|
}
|
|
574
579
|
|
|
580
|
+
private func resolveBaseFileUrl(launchedUpdate: Update) throws -> URL {
|
|
581
|
+
if launchedUpdate.status == UpdateStatus.StatusEmbedded {
|
|
582
|
+
// StatusEmbedded only launches for this binary's embedded update.
|
|
583
|
+
guard let embeddedLaunchAssetUrl else {
|
|
584
|
+
throw DiffError.embeddedBaseAssetMissing
|
|
585
|
+
}
|
|
586
|
+
return embeddedLaunchAssetUrl
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
let baseAsset = try resolveLaunchAsset(launchedUpdate: launchedUpdate)
|
|
590
|
+
return try loadAndVerifyAsset(baseAsset)
|
|
591
|
+
}
|
|
592
|
+
|
|
575
593
|
private func resolveLaunchAsset(launchedUpdate: Update) throws -> UpdateAsset {
|
|
576
594
|
let currentUpdateId = launchedUpdate.updateId
|
|
577
595
|
var launchAsset: UpdateAsset?
|
|
@@ -1239,6 +1257,7 @@ extension FileDownloader {
|
|
|
1239
1257
|
case missingHeader(String)
|
|
1240
1258
|
case invalidHeader(String)
|
|
1241
1259
|
case launchAssetNotFound
|
|
1260
|
+
case embeddedBaseAssetMissing
|
|
1242
1261
|
case baseAssetMissing(path: String)
|
|
1243
1262
|
case failedToReadBaseAsset(cause: Error)
|
|
1244
1263
|
case failedToWritePatch(cause: Error, path: String)
|
|
@@ -1266,6 +1285,8 @@ extension FileDownloader.DiffError: CustomStringConvertible {
|
|
|
1266
1285
|
return "Invalid \(header) header"
|
|
1267
1286
|
case .launchAssetNotFound:
|
|
1268
1287
|
return "Launch asset not found for current update"
|
|
1288
|
+
case .embeddedBaseAssetMissing:
|
|
1289
|
+
return "Embedded bundle not found in the app binary"
|
|
1269
1290
|
case let .baseAssetMissing(path):
|
|
1270
1291
|
return "Base asset is missing at path \(path)"
|
|
1271
1292
|
case let .failedToReadBaseAsset(cause):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-updates",
|
|
3
|
-
"version": "58.0.
|
|
3
|
+
"version": "58.0.2",
|
|
4
4
|
"description": "Fetches and manages remotely-hosted assets and updates to your app's JS bundle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"expo",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"resolve-from": "^5.0.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@expo/metro-config": "58.0.
|
|
64
|
+
"@expo/metro-config": "58.0.1",
|
|
65
65
|
"@testing-library/react-native": "^13.3.0",
|
|
66
66
|
"@types/debug": "^4.1.7",
|
|
67
67
|
"@types/getenv": "^1.0.0",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@types/picomatch": "^4.0.0",
|
|
72
72
|
"@types/react": "~19.2.0",
|
|
73
73
|
"@vercel/ncc": "^0.38.3",
|
|
74
|
-
"expo-dev-client": "58.0.
|
|
74
|
+
"expo-dev-client": "58.0.1",
|
|
75
75
|
"expo-module-scripts": "56.0.3",
|
|
76
76
|
"express": "^5.1.0",
|
|
77
77
|
"form-data": "^4.0.4",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"optional": true
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
|
-
"gitHead": "
|
|
94
|
+
"gitHead": "4b28ee36f9b7a8d87a39892ca94a3fedea409517",
|
|
95
95
|
"scripts": {
|
|
96
96
|
"build": "pnpm run build:lib && pnpm run build:plugin && pnpm run build:utils && pnpm run build:cli",
|
|
97
97
|
"build:lib": "expo-build src",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|