expo-updates 56.0.15 → 56.0.17

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/CHANGELOG.md CHANGED
@@ -10,6 +10,14 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 56.0.17 — 2026-05-26
14
+
15
+ _This version does not introduce any user-facing changes._
16
+
17
+ ## 56.0.16 — 2026-05-23
18
+
19
+ _This version does not introduce any user-facing changes._
20
+
13
21
  ## 56.0.15 — 2026-05-21
14
22
 
15
23
  ### 🐛 Bug fixes
@@ -21,6 +29,7 @@
21
29
  ### 💡 Others
22
30
 
23
31
  - Bump to `@expo/spawn-async@^1.8.0` ([#45999](https://github.com/expo/expo/pull/45999) by [@kitten](https://github.com/kitten))
32
+ - Added `zstd` decompression support for the `FileDownloader` on Android. ([#46052](https://github.com/expo/expo/pull/46052) by [@kudo](https://github.com/kudo))
24
33
 
25
34
  ## 56.0.13 — 2026-05-19
26
35
 
@@ -42,7 +42,7 @@ expoModule {
42
42
  }
43
43
 
44
44
  group = 'host.exp.exponent'
45
- version = '56.0.15'
45
+ version = '56.0.17'
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
@@ -89,7 +89,7 @@ android {
89
89
  namespace "expo.modules.updates"
90
90
  defaultConfig {
91
91
  versionCode 31
92
- versionName '56.0.15'
92
+ versionName '56.0.17'
93
93
  consumerProguardFiles("proguard-rules.pro")
94
94
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
95
95
 
@@ -158,7 +158,8 @@ dependencies {
158
158
 
159
159
  implementation("com.squareup.okhttp3:okhttp:4.9.2")
160
160
  implementation("com.squareup.okhttp3:okhttp-urlconnection:4.9.2")
161
- implementation("com.squareup.okhttp3:okhttp-brotli:4.9.2")
161
+ implementation("com.squareup.zstd:zstd-kmp-okio:0.4.0")
162
+ implementation("org.brotli:dec:0.1.2")
162
163
  implementation("org.bouncycastle:bcutil-jdk15to18:1.81")
163
164
 
164
165
  compileOnly 'com.facebook.fbjni:fbjni:0.3.0'
@@ -5,3 +5,6 @@
5
5
  -keepclassmembers class com.facebook.react.devsupport.ReleaseDevSupportManager {
6
6
  private final com.facebook.react.bridge.JSExceptionHandler defaultJSExceptionHandler;
7
7
  }
8
+
9
+ # Workaround zstd-kmp R8 issue - https://github.com/square/zstd-kmp/issues/108
10
+ -keep class com.squareup.zstd.** { *; }
@@ -0,0 +1,75 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+ /*
3
+ * Copyright (C) 2025 Square, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ package expo.modules.updates.loader
19
+
20
+ import com.squareup.zstd.okio.zstdDecompress
21
+ import okhttp3.Interceptor
22
+ import okhttp3.Response
23
+ import okhttp3.ResponseBody.Companion.asResponseBody
24
+ import okhttp3.internal.http.promisesBody
25
+ import okio.GzipSource
26
+ import okio.buffer
27
+ import okio.source
28
+ import org.brotli.dec.BrotliInputStream
29
+
30
+ /**
31
+ * Transparent compressed response support for Zstandard, Brotli and Gzip.
32
+ *
33
+ * Adds `Accept-Encoding: zstd, br, gzip` to outgoing requests when the caller has not set the
34
+ * header, and decompresses (and strips `Content-Encoding`/`Content-Length` from) responses
35
+ * encoded with any of the three.
36
+ *
37
+ * Modeled after `okhttp3.brotli.BrotliInterceptor`; this replaces the transparent gzip
38
+ * compression in okhttp's `BridgeInterceptor`. Callers who set their own `Accept-Encoding`
39
+ * opt out of automatic decompression.
40
+ */
41
+ object CompressionInterceptor : Interceptor {
42
+ override fun intercept(chain: Interceptor.Chain): Response =
43
+ if (chain.request().header("Accept-Encoding") == null) {
44
+ val request = chain.request().newBuilder()
45
+ .header("Accept-Encoding", "zstd, br, gzip")
46
+ .build()
47
+
48
+ val response = chain.proceed(request)
49
+
50
+ uncompress(response)
51
+ } else {
52
+ chain.proceed(chain.request())
53
+ }
54
+
55
+ internal fun uncompress(response: Response): Response {
56
+ if (!response.promisesBody()) {
57
+ return response
58
+ }
59
+ val body = response.body ?: return response
60
+ val encoding = response.header("Content-Encoding") ?: return response
61
+
62
+ val decompressedSource = when (encoding.lowercase()) {
63
+ "zstd" -> body.source().zstdDecompress().buffer()
64
+ "br" -> BrotliInputStream(body.source().inputStream()).source().buffer()
65
+ "gzip" -> GzipSource(body.source()).buffer()
66
+ else -> return response
67
+ }
68
+
69
+ return response.newBuilder()
70
+ .removeHeader("Content-Encoding")
71
+ .removeHeader("Content-Length")
72
+ .body(decompressedSource.asResponseBody(body.contentType(), -1))
73
+ .build()
74
+ }
75
+ }
@@ -31,7 +31,6 @@ import okhttp3.OkHttpClient
31
31
  import okhttp3.Request
32
32
  import okhttp3.Response
33
33
  import okhttp3.ResponseBody
34
- import okhttp3.brotli.BrotliInterceptor
35
34
  import okio.Buffer
36
35
  import okio.BufferedSource
37
36
  import okio.ForwardingSource
@@ -76,7 +75,7 @@ class FileDownloader(
76
75
  .cache(getCache())
77
76
  .connectTimeout(max(configuration.launchWaitMs.toLong(), 10_000L), TimeUnit.MILLISECONDS)
78
77
  .readTimeout(max(configuration.launchWaitMs.toLong(), 10_000L), TimeUnit.MILLISECONDS)
79
- .addInterceptor(BrotliInterceptor)
78
+ .addInterceptor(CompressionInterceptor)
80
79
  .build()
81
80
 
82
81
  /**
@@ -0,0 +1 @@
1
+ {"root":["./src/assetsverify.ts","./src/assetsverifyasync.ts","./src/assetsverifytypes.ts","./src/cli.ts","./src/configurecodesigning.ts","./src/configurecodesigningasync.ts","./src/generatecodesigning.ts","./src/generatecodesigningasync.ts","./src/generatefingerprint.ts","./src/resolveruntimeversion.ts","./src/syncconfigurationtonative.ts","./src/syncconfigurationtonativeasync.ts","./src/utils/args.ts","./src/utils/dir.ts","./src/utils/errors.ts","./src/utils/log.ts","./src/utils/modifyconfigasync.ts","./src/utils/withconsoledisabledasync.ts"],"version":"5.9.2"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-updates",
3
- "version": "56.0.15",
3
+ "version": "56.0.17",
4
4
  "description": "Fetches and manages remotely-hosted assets and updates to your app's JS bundle.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -60,10 +60,10 @@
60
60
  "picomatch": "^4.0.4",
61
61
  "ts-node": "^10.9.2",
62
62
  "xstate": "^4.37.2",
63
- "@expo/metro-config": "56.0.11",
64
- "expo-module-scripts": "56.0.2",
65
- "expo": "56.0.3",
66
- "expo-dev-client": "56.0.14"
63
+ "expo-dev-client": "56.0.16",
64
+ "expo": "56.0.5",
65
+ "@expo/metro-config": "56.0.13",
66
+ "expo-module-scripts": "56.0.2"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "expo": "*",
@@ -82,7 +82,7 @@
82
82
  "./scripts/with-node.sh"
83
83
  ]
84
84
  },
85
- "gitHead": "125e8225bf36a4b9b2a159441d9ea724bcf1110f",
85
+ "gitHead": "f67a101bcbe56114e982184834b93da7bbed00af",
86
86
  "scripts": {
87
87
  "build": "expo-module build",
88
88
  "clean": "expo-module clean",
@@ -0,0 +1 @@
1
+ {"root":["./src/withupdates.ts"],"version":"5.9.2"}
@@ -0,0 +1 @@
1
+ {"root":["./src/createfingerprintasync.ts","./src/createfingerprintforbuildasync.ts","./src/createmanifestforbuildasync.ts","./src/createupdatesresources.ts","./src/filterplatformassetscales.ts","./src/findupprojectroot.ts","./src/resolveruntimeversionasync.ts","./src/vcs.ts","./src/workflow.ts"],"version":"5.9.2"}