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.
Files changed (253) hide show
  1. package/.npmignore +5 -0
  2. package/CHANGELOG.md +11 -0
  3. package/android/build.gradle +2 -2
  4. package/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt +85 -33
  5. package/android/src/main/java/expo/modules/updates/loader/RemoteLoader.kt +23 -3
  6. package/build/ExpoUpdates.web.d.ts +1 -1
  7. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/last-build.bin +0 -0
  8. package/ios/EXUpdates/AppLoader/FileDownloader.swift +23 -2
  9. package/package.json +4 -4
  10. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  11. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  12. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  13. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cache-v2-f7b3549f78edcf21e703.json +0 -1419
  14. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-e040f6d6310b1c8d7d75.json +0 -194
  15. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-4a567ed04919744ae26e.json +0 -69
  16. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  17. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/index-2026-09-10T12-41-06-0016.json +0 -92
  18. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
  19. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-expo-updates-Debug-d55207f1a077a90f2056.json +0 -235
  20. package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_deps +0 -0
  21. package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_log +0 -17
  22. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeCache.txt +0 -422
  23. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  24. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  25. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  26. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  27. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  28. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  29. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  30. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  31. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  32. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
  33. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -4
  34. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  35. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  36. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  37. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  38. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  39. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  40. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  41. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
  42. 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
  43. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  44. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  45. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/rules.ninja +0 -93
  46. package/android/.cxx/Debug/38204d1n/arm64-v8a/additional_project_files.txt +0 -0
  47. package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build.json +0 -50
  48. package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build_mini.json +0 -37
  49. package/android/.cxx/Debug/38204d1n/arm64-v8a/build.ninja +0 -245
  50. package/android/.cxx/Debug/38204d1n/arm64-v8a/build_file_index.txt +0 -3
  51. package/android/.cxx/Debug/38204d1n/arm64-v8a/cmake_install.cmake +0 -54
  52. package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json +0 -52
  53. package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json.bin +0 -0
  54. package/android/.cxx/Debug/38204d1n/arm64-v8a/configure_fingerprint.bin +0 -39
  55. package/android/.cxx/Debug/38204d1n/arm64-v8a/libbzip2.a +0 -0
  56. package/android/.cxx/Debug/38204d1n/arm64-v8a/metadata_generation_command.txt +0 -22
  57. package/android/.cxx/Debug/38204d1n/arm64-v8a/prefab_config.json +0 -9
  58. package/android/.cxx/Debug/38204d1n/arm64-v8a/symbol_folder_index.txt +0 -1
  59. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  60. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  61. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  62. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/cache-v2-ae8b6f60c7f134daa03e.json +0 -1419
  63. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-59c7020eed69ef2bfe3e.json +0 -194
  64. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-63f4a3075f1b4457c584.json +0 -69
  65. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  66. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/index-2026-09-07T15-55-40-0729.json +0 -92
  67. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/target-bzip2-Debug-7ee22a1a3974c001a017.json +0 -143
  68. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.cmake/api/v1/reply/target-expo-updates-Debug-0c1cd82b629aa1da43d3.json +0 -235
  69. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.ninja_deps +0 -0
  70. package/android/.cxx/Debug/38204d1n/armeabi-v7a/.ninja_log +0 -17
  71. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeCache.txt +0 -422
  72. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  73. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  74. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  75. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  76. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  77. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  78. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  79. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  80. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  81. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/CMakeOutput.log +0 -266
  82. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/TargetDirectories.txt +0 -4
  83. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  84. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  85. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  86. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  87. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  88. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  89. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  90. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/cmake.check_cache +0 -1
  91. 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
  92. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  93. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  94. package/android/.cxx/Debug/38204d1n/armeabi-v7a/CMakeFiles/rules.ninja +0 -93
  95. package/android/.cxx/Debug/38204d1n/armeabi-v7a/additional_project_files.txt +0 -0
  96. package/android/.cxx/Debug/38204d1n/armeabi-v7a/android_gradle_build.json +0 -50
  97. package/android/.cxx/Debug/38204d1n/armeabi-v7a/android_gradle_build_mini.json +0 -37
  98. package/android/.cxx/Debug/38204d1n/armeabi-v7a/build.ninja +0 -245
  99. package/android/.cxx/Debug/38204d1n/armeabi-v7a/build_file_index.txt +0 -3
  100. package/android/.cxx/Debug/38204d1n/armeabi-v7a/cmake_install.cmake +0 -54
  101. package/android/.cxx/Debug/38204d1n/armeabi-v7a/compile_commands.json +0 -52
  102. package/android/.cxx/Debug/38204d1n/armeabi-v7a/compile_commands.json.bin +0 -0
  103. package/android/.cxx/Debug/38204d1n/armeabi-v7a/configure_fingerprint.bin +0 -33
  104. package/android/.cxx/Debug/38204d1n/armeabi-v7a/libbzip2.a +0 -0
  105. package/android/.cxx/Debug/38204d1n/armeabi-v7a/metadata_generation_command.txt +0 -22
  106. package/android/.cxx/Debug/38204d1n/armeabi-v7a/prefab_config.json +0 -9
  107. package/android/.cxx/Debug/38204d1n/armeabi-v7a/symbol_folder_index.txt +0 -1
  108. package/android/.cxx/Debug/38204d1n/hash_key.txt +0 -29
  109. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  110. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  111. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  112. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  113. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  114. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  115. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  116. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  117. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/fbjni/fbjniConfig.cmake +0 -9
  118. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  119. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  120. package/android/.cxx/Debug/38204d1n/prefab/armeabi-v7a/prefab/lib/arm-linux-androideabi/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  121. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  122. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  123. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  124. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  125. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  126. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  127. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  128. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  129. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  130. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  131. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  132. package/android/.cxx/Debug/38204d1n/prefab/x86_64/prefab/lib/x86_64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  133. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  134. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  135. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  136. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cache-v2-d7a10dd1f6d3df4d8ab3.json +0 -1419
  137. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cmakeFiles-v1-6dee4bf659a7f2e2f5f6.json +0 -194
  138. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/codemodel-v2-40de86b6f126d82f5ee9.json +0 -69
  139. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  140. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/index-2026-09-10T12-40-19-0488.json +0 -92
  141. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
  142. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-expo-updates-Debug-9cbe107985289ffd0553.json +0 -235
  143. package/android/.cxx/Debug/38204d1n/x86/.ninja_deps +0 -0
  144. package/android/.cxx/Debug/38204d1n/x86/.ninja_log +0 -13
  145. package/android/.cxx/Debug/38204d1n/x86/CMakeCache.txt +0 -422
  146. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  147. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  148. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  149. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  150. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  151. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  152. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  153. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  154. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  155. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/CMakeOutput.log +0 -256
  156. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/TargetDirectories.txt +0 -4
  157. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  158. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  159. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  160. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  161. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  162. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  163. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  164. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/cmake.check_cache +0 -1
  165. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
  166. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  167. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  168. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/rules.ninja +0 -93
  169. package/android/.cxx/Debug/38204d1n/x86/additional_project_files.txt +0 -0
  170. package/android/.cxx/Debug/38204d1n/x86/android_gradle_build.json +0 -50
  171. package/android/.cxx/Debug/38204d1n/x86/android_gradle_build_mini.json +0 -37
  172. package/android/.cxx/Debug/38204d1n/x86/build.ninja +0 -245
  173. package/android/.cxx/Debug/38204d1n/x86/build_file_index.txt +0 -3
  174. package/android/.cxx/Debug/38204d1n/x86/cmake_install.cmake +0 -54
  175. package/android/.cxx/Debug/38204d1n/x86/compile_commands.json +0 -52
  176. package/android/.cxx/Debug/38204d1n/x86/compile_commands.json.bin +0 -0
  177. package/android/.cxx/Debug/38204d1n/x86/configure_fingerprint.bin +0 -39
  178. package/android/.cxx/Debug/38204d1n/x86/libbzip2.a +0 -0
  179. package/android/.cxx/Debug/38204d1n/x86/metadata_generation_command.txt +0 -22
  180. package/android/.cxx/Debug/38204d1n/x86/prefab_config.json +0 -9
  181. package/android/.cxx/Debug/38204d1n/x86/symbol_folder_index.txt +0 -1
  182. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  183. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  184. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  185. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/cache-v2-9126117537263988081d.json +0 -1419
  186. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-8eafaadcce9c4bc5c9ea.json +0 -194
  187. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/codemodel-v2-d82f541213b24e47c2e2.json +0 -69
  188. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  189. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/index-2026-09-07T15-55-41-0613.json +0 -92
  190. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
  191. package/android/.cxx/Debug/38204d1n/x86_64/.cmake/api/v1/reply/target-expo-updates-Debug-f0f846e7c91ce5a671f5.json +0 -235
  192. package/android/.cxx/Debug/38204d1n/x86_64/.ninja_deps +0 -0
  193. package/android/.cxx/Debug/38204d1n/x86_64/.ninja_log +0 -17
  194. package/android/.cxx/Debug/38204d1n/x86_64/CMakeCache.txt +0 -422
  195. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  196. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  197. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  198. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  199. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  200. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  201. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  202. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  203. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  204. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/CMakeOutput.log +0 -258
  205. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/TargetDirectories.txt +0 -4
  206. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  207. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  208. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  209. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  210. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  211. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  212. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  213. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/cmake.check_cache +0 -1
  214. 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
  215. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  216. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  217. package/android/.cxx/Debug/38204d1n/x86_64/CMakeFiles/rules.ninja +0 -93
  218. package/android/.cxx/Debug/38204d1n/x86_64/additional_project_files.txt +0 -0
  219. package/android/.cxx/Debug/38204d1n/x86_64/android_gradle_build.json +0 -50
  220. package/android/.cxx/Debug/38204d1n/x86_64/android_gradle_build_mini.json +0 -37
  221. package/android/.cxx/Debug/38204d1n/x86_64/build.ninja +0 -245
  222. package/android/.cxx/Debug/38204d1n/x86_64/build_file_index.txt +0 -3
  223. package/android/.cxx/Debug/38204d1n/x86_64/cmake_install.cmake +0 -54
  224. package/android/.cxx/Debug/38204d1n/x86_64/compile_commands.json +0 -52
  225. package/android/.cxx/Debug/38204d1n/x86_64/compile_commands.json.bin +0 -0
  226. package/android/.cxx/Debug/38204d1n/x86_64/configure_fingerprint.bin +0 -33
  227. package/android/.cxx/Debug/38204d1n/x86_64/libbzip2.a +0 -0
  228. package/android/.cxx/Debug/38204d1n/x86_64/metadata_generation_command.txt +0 -22
  229. package/android/.cxx/Debug/38204d1n/x86_64/prefab_config.json +0 -9
  230. package/android/.cxx/Debug/38204d1n/x86_64/symbol_folder_index.txt +0 -1
  231. package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +0 -52
  232. package/android/.cxx/tools/debug/armeabi-v7a/compile_commands.json +0 -52
  233. package/android/.cxx/tools/debug/x86/compile_commands.json +0 -52
  234. package/android/.cxx/tools/debug/x86_64/compile_commands.json +0 -52
  235. package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.bin +0 -0
  236. package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.lock +0 -0
  237. package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.bin +0 -0
  238. package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.lock +0 -0
  239. package/expo-updates-gradle-plugin/.gradle/9.3.0/checksums/checksums.lock +0 -0
  240. package/expo-updates-gradle-plugin/.gradle/9.3.0/executionHistory/executionHistory.lock +0 -0
  241. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileChanges/last-build.bin +0 -0
  242. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.bin +0 -0
  243. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.lock +0 -0
  244. package/expo-updates-gradle-plugin/.gradle/9.3.0/gc.properties +0 -0
  245. package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.bin +0 -0
  246. package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.lock +0 -0
  247. package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.bin +0 -0
  248. package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.lock +0 -0
  249. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  250. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/cache.properties +0 -2
  251. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  252. package/expo-updates-gradle-plugin/.gradle/file-system.probe +0 -0
  253. package/expo-updates-gradle-plugin/.gradle/vcs-1/gc.properties +0 -0
package/.npmignore CHANGED
@@ -17,3 +17,8 @@ __rsc_tests__
17
17
  /android/src/androidTest/
18
18
  /android/src/test/
19
19
  /ios/Tests
20
+
21
+ # Exclude native build output (pnpm pack ignores nested .gitignore files)
22
+ .cxx/
23
+ .gradle/
24
+ /android/build/
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
@@ -42,7 +42,7 @@ expoModule {
42
42
  }
43
43
 
44
44
  group = 'host.exp.exponent'
45
- version = '58.0.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.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
- return applyHermesDiff(
307
- baseFile = launchAssetContext.baseFile,
308
- diffBody = responseBody,
309
- destination = destination,
310
- expectedBase64URLEncodedSHA256Hash = expectedBase64URLEncodedSHA256Hash,
311
- asset = asset,
312
- requestedUpdateId = requestedUpdate?.id?.toString()
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
- val baseFile = File(updatesDirectory, launchAssetRelativePath)
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 actualBaseHash = try {
360
- UpdatesUtils.toBase64Url(UpdatesUtils.sha256(baseFile))
361
- } catch (_: Exception) {
362
- null
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
- val expectedBaseHash = launchAssetEntity.expectedHash
366
- if (expectedBaseHash != null && actualBaseHash != null && expectedBaseHash != actualBaseHash) {
367
- logger.warn(
368
- "Asset hash mismatch for update $currentUpdateId; expected=$expectedBaseHash actual=$actualBaseHash",
369
- UpdatesErrorCode.AssetsFailedToLoad,
370
- currentUpdateId.toString(),
371
- asset.key
372
- )
373
- throw IOException("Asset hash mismatch for update $currentUpdateId; expected=$expectedBaseHash actual=$actualBaseHash")
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
- return LaunchAssetContext(baseFile)
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(assetEntity, updatesDirectory, extraHeaders, launchedUpdate, requestedUpdate) { progress ->
70
- assetLoadProgressListener(assetEntity, progress)
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: typeof ExpoUpdatesModule;
34
+ declare const _default: ExpoUpdatesModule;
35
35
  export default _default;
@@ -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 baseAsset = try resolveLaunchAsset(launchedUpdate: launchedUpdate)
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.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.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.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": "c543a7181fc32e14f42d89550087b80ac5c490f2",
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",