@hot-updater/react-native 0.36.7 → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +357 -6
  2. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +268 -34
  3. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +75 -9
  4. package/android/src/main/java/com/hotupdater/NativeConfigUtils.kt +2 -16
  5. package/android/src/main/java/com/hotupdater/ReleaseCatalogCacheService.kt +166 -0
  6. package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +1 -2
  7. package/android/src/newarch/HotUpdater.kt +1 -1
  8. package/android/src/newarch/HotUpdaterModule.kt +116 -0
  9. package/android/src/oldarch/HotUpdater.kt +1 -1
  10. package/android/src/oldarch/HotUpdaterModule.kt +128 -0
  11. package/android/src/oldarch/HotUpdaterSpec.kt +38 -0
  12. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +280 -2
  13. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +57 -2
  14. package/android/src/test/java/com/hotupdater/ReleaseCatalogCacheServiceTest.kt +118 -0
  15. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +491 -30
  16. package/ios/HotUpdater/Internal/BundleMetadata.swift +229 -6
  17. package/ios/HotUpdater/Internal/HotUpdater.mm +122 -0
  18. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +176 -7
  19. package/ios/HotUpdater/Internal/ReleaseCatalogCacheService.swift +213 -0
  20. package/lib/commonjs/catalogCacheNative.js +44 -0
  21. package/lib/commonjs/catalogCacheNative.js.map +1 -0
  22. package/lib/commonjs/catalogCacheNative.spec.js +31 -0
  23. package/lib/commonjs/catalogCacheNative.spec.js.map +1 -0
  24. package/lib/commonjs/checkForUpdate.js +231 -60
  25. package/lib/commonjs/checkForUpdate.js.map +1 -1
  26. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +604 -0
  27. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +1 -0
  28. package/lib/commonjs/error.js +8 -1
  29. package/lib/commonjs/error.js.map +1 -1
  30. package/lib/commonjs/{fetchUpdateInfo.js → fetchJSON.js} +11 -14
  31. package/lib/commonjs/fetchJSON.js.map +1 -0
  32. package/lib/commonjs/httpClient.js +153 -0
  33. package/lib/commonjs/httpClient.js.map +1 -0
  34. package/lib/commonjs/httpClient.spec.js +102 -0
  35. package/lib/commonjs/httpClient.spec.js.map +1 -0
  36. package/lib/commonjs/index.js +47 -70
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/index.spec.js +115 -159
  39. package/lib/commonjs/index.spec.js.map +1 -1
  40. package/lib/commonjs/iosInterop.spec.js +18 -0
  41. package/lib/commonjs/iosInterop.spec.js.map +1 -0
  42. package/lib/commonjs/native.js +222 -53
  43. package/lib/commonjs/native.js.map +1 -1
  44. package/lib/commonjs/native.spec.js +226 -12
  45. package/lib/commonjs/native.spec.js.map +1 -1
  46. package/lib/commonjs/notifyAppReadyAnalytics.boundary.spec.js +218 -0
  47. package/lib/commonjs/notifyAppReadyAnalytics.boundary.spec.js.map +1 -0
  48. package/lib/commonjs/notifyAppReadyAnalytics.js +133 -0
  49. package/lib/commonjs/notifyAppReadyAnalytics.js.map +1 -0
  50. package/lib/commonjs/notifyAppReadyAnalytics.spec.js +246 -0
  51. package/lib/commonjs/notifyAppReadyAnalytics.spec.js.map +1 -0
  52. package/lib/commonjs/notifyAppReadyAnalytics.test-utils.js +24 -0
  53. package/lib/commonjs/notifyAppReadyAnalytics.test-utils.js.map +1 -0
  54. package/lib/commonjs/notifyAppReadyAnalytics.transport.spec.js +117 -0
  55. package/lib/commonjs/notifyAppReadyAnalytics.transport.spec.js.map +1 -0
  56. package/lib/commonjs/releaseCatalogCache.js +179 -0
  57. package/lib/commonjs/releaseCatalogCache.js.map +1 -0
  58. package/lib/commonjs/releaseCatalogCache.spec.js +195 -0
  59. package/lib/commonjs/releaseCatalogCache.spec.js.map +1 -0
  60. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js +64 -0
  61. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js.map +1 -0
  62. package/lib/commonjs/sdkVersion.js +1 -1
  63. package/lib/commonjs/sdkVersion.js.map +1 -1
  64. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  65. package/lib/commonjs/types.js +0 -12
  66. package/lib/commonjs/types.js.map +1 -1
  67. package/lib/commonjs/wrap.js +7 -82
  68. package/lib/commonjs/wrap.js.map +1 -1
  69. package/lib/commonjs/wrap.spec.js +203 -56
  70. package/lib/commonjs/wrap.spec.js.map +1 -1
  71. package/lib/commonjs/wrap.types.js +6 -0
  72. package/lib/commonjs/wrap.types.js.map +1 -0
  73. package/lib/module/catalogCacheNative.js +36 -0
  74. package/lib/module/catalogCacheNative.js.map +1 -0
  75. package/lib/module/catalogCacheNative.spec.js +31 -0
  76. package/lib/module/catalogCacheNative.spec.js.map +1 -0
  77. package/lib/module/checkForUpdate.js +233 -62
  78. package/lib/module/checkForUpdate.js.map +1 -1
  79. package/lib/module/checkForUpdate.releaseCatalog.spec.js +603 -0
  80. package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +1 -0
  81. package/lib/module/error.js +6 -0
  82. package/lib/module/error.js.map +1 -1
  83. package/lib/module/{fetchUpdateInfo.js → fetchJSON.js} +9 -12
  84. package/lib/module/fetchJSON.js.map +1 -0
  85. package/lib/module/httpClient.js +148 -0
  86. package/lib/module/httpClient.js.map +1 -0
  87. package/lib/module/httpClient.spec.js +102 -0
  88. package/lib/module/httpClient.spec.js.map +1 -0
  89. package/lib/module/index.js +48 -65
  90. package/lib/module/index.js.map +1 -1
  91. package/lib/module/index.spec.js +115 -159
  92. package/lib/module/index.spec.js.map +1 -1
  93. package/lib/module/iosInterop.spec.js +18 -0
  94. package/lib/module/iosInterop.spec.js.map +1 -0
  95. package/lib/module/native.js +206 -49
  96. package/lib/module/native.js.map +1 -1
  97. package/lib/module/native.spec.js +226 -12
  98. package/lib/module/native.spec.js.map +1 -1
  99. package/lib/module/notifyAppReadyAnalytics.boundary.spec.js +217 -0
  100. package/lib/module/notifyAppReadyAnalytics.boundary.spec.js.map +1 -0
  101. package/lib/module/notifyAppReadyAnalytics.js +128 -0
  102. package/lib/module/notifyAppReadyAnalytics.js.map +1 -0
  103. package/lib/module/notifyAppReadyAnalytics.spec.js +245 -0
  104. package/lib/module/notifyAppReadyAnalytics.spec.js.map +1 -0
  105. package/lib/module/notifyAppReadyAnalytics.test-utils.js +18 -0
  106. package/lib/module/notifyAppReadyAnalytics.test-utils.js.map +1 -0
  107. package/lib/module/notifyAppReadyAnalytics.transport.spec.js +116 -0
  108. package/lib/module/notifyAppReadyAnalytics.transport.spec.js.map +1 -0
  109. package/lib/module/releaseCatalogCache.js +171 -0
  110. package/lib/module/releaseCatalogCache.js.map +1 -0
  111. package/lib/module/releaseCatalogCache.spec.js +195 -0
  112. package/lib/module/releaseCatalogCache.spec.js.map +1 -0
  113. package/lib/module/releaseCatalogCacheNativeContract.spec.js +64 -0
  114. package/lib/module/releaseCatalogCacheNativeContract.spec.js.map +1 -0
  115. package/lib/module/sdkVersion.js +1 -1
  116. package/lib/module/sdkVersion.js.map +1 -1
  117. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  118. package/lib/module/types.js +0 -12
  119. package/lib/module/types.js.map +1 -1
  120. package/lib/module/wrap.js +6 -81
  121. package/lib/module/wrap.js.map +1 -1
  122. package/lib/module/wrap.spec.js +203 -56
  123. package/lib/module/wrap.spec.js.map +1 -1
  124. package/lib/module/wrap.types.js +4 -0
  125. package/lib/module/wrap.types.js.map +1 -0
  126. package/lib/typescript/commonjs/catalogCacheNative.d.ts +4 -0
  127. package/lib/typescript/commonjs/catalogCacheNative.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/checkForUpdate.d.ts +14 -4
  129. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  130. package/lib/typescript/commonjs/error.d.ts +3 -0
  131. package/lib/typescript/commonjs/error.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/fetchJSON.d.ts +6 -0
  133. package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/httpClient.d.ts +56 -0
  135. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/index.d.ts +31 -40
  137. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/native.d.ts +84 -17
  139. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  140. package/lib/typescript/commonjs/notifyAppReadyAnalytics.d.ts +13 -0
  141. package/lib/typescript/commonjs/notifyAppReadyAnalytics.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/notifyAppReadyAnalytics.test-utils.d.ts +8 -0
  143. package/lib/typescript/commonjs/notifyAppReadyAnalytics.test-utils.d.ts.map +1 -0
  144. package/lib/typescript/commonjs/releaseCatalogCache.d.ts +25 -0
  145. package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  147. package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +40 -5
  149. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  150. package/lib/typescript/commonjs/types.d.ts +0 -118
  151. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  152. package/lib/typescript/commonjs/wrap.d.ts +2 -191
  153. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  154. package/lib/typescript/commonjs/wrap.types.d.ts +65 -0
  155. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -0
  156. package/lib/typescript/module/catalogCacheNative.d.ts +4 -0
  157. package/lib/typescript/module/catalogCacheNative.d.ts.map +1 -0
  158. package/lib/typescript/module/checkForUpdate.d.ts +14 -4
  159. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  160. package/lib/typescript/module/error.d.ts +3 -0
  161. package/lib/typescript/module/error.d.ts.map +1 -1
  162. package/lib/typescript/module/fetchJSON.d.ts +6 -0
  163. package/lib/typescript/module/fetchJSON.d.ts.map +1 -0
  164. package/lib/typescript/module/httpClient.d.ts +56 -0
  165. package/lib/typescript/module/httpClient.d.ts.map +1 -0
  166. package/lib/typescript/module/index.d.ts +31 -40
  167. package/lib/typescript/module/index.d.ts.map +1 -1
  168. package/lib/typescript/module/native.d.ts +84 -17
  169. package/lib/typescript/module/native.d.ts.map +1 -1
  170. package/lib/typescript/module/notifyAppReadyAnalytics.d.ts +13 -0
  171. package/lib/typescript/module/notifyAppReadyAnalytics.d.ts.map +1 -0
  172. package/lib/typescript/module/notifyAppReadyAnalytics.test-utils.d.ts +8 -0
  173. package/lib/typescript/module/notifyAppReadyAnalytics.test-utils.d.ts.map +1 -0
  174. package/lib/typescript/module/releaseCatalogCache.d.ts +25 -0
  175. package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -0
  176. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  177. package/lib/typescript/module/sdkVersion.d.ts.map +1 -1
  178. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +40 -5
  179. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  180. package/lib/typescript/module/types.d.ts +0 -118
  181. package/lib/typescript/module/types.d.ts.map +1 -1
  182. package/lib/typescript/module/wrap.d.ts +2 -191
  183. package/lib/typescript/module/wrap.d.ts.map +1 -1
  184. package/lib/typescript/module/wrap.types.d.ts +65 -0
  185. package/lib/typescript/module/wrap.types.d.ts.map +1 -0
  186. package/package.json +6 -24
  187. package/src/catalogCacheNative.spec.ts +63 -0
  188. package/src/catalogCacheNative.ts +74 -0
  189. package/src/checkForUpdate.releaseCatalog.spec.ts +596 -0
  190. package/src/checkForUpdate.ts +367 -96
  191. package/src/error.ts +7 -0
  192. package/src/{fetchUpdateInfo.ts → fetchJSON.ts} +8 -15
  193. package/src/httpClient.spec.ts +132 -0
  194. package/src/httpClient.ts +261 -0
  195. package/src/index.spec.ts +108 -201
  196. package/src/index.ts +68 -91
  197. package/src/iosInterop.spec.ts +30 -0
  198. package/src/native.spec.ts +226 -10
  199. package/src/native.ts +385 -81
  200. package/src/notifyAppReadyAnalytics.boundary.spec.ts +234 -0
  201. package/src/notifyAppReadyAnalytics.spec.ts +243 -0
  202. package/src/notifyAppReadyAnalytics.test-utils.ts +31 -0
  203. package/src/notifyAppReadyAnalytics.transport.spec.ts +130 -0
  204. package/src/notifyAppReadyAnalytics.ts +194 -0
  205. package/src/releaseCatalogCache.spec.ts +282 -0
  206. package/src/releaseCatalogCache.ts +341 -0
  207. package/src/releaseCatalogCacheNativeContract.spec.ts +80 -0
  208. package/src/sdkVersion.ts +1 -1
  209. package/src/specs/NativeHotUpdater.ts +51 -5
  210. package/src/types.ts +0 -140
  211. package/src/wrap.spec.ts +251 -56
  212. package/src/wrap.tsx +23 -318
  213. package/src/wrap.types.ts +78 -0
  214. package/android/src/main/java/com/hotupdater/StringResourceUtils.kt +0 -45
  215. package/app.plugin.js +0 -1
  216. package/ios/HotUpdater/Internal/HotUpdaterCrashHandler.h +0 -7
  217. package/ios/HotUpdater/Internal/HotUpdaterCrashHandler.mm +0 -4
  218. package/lib/commonjs/DefaultResolver.js +0 -50
  219. package/lib/commonjs/DefaultResolver.js.map +0 -1
  220. package/lib/commonjs/DefaultResolver.spec.js +0 -144
  221. package/lib/commonjs/DefaultResolver.spec.js.map +0 -1
  222. package/lib/commonjs/fetchUpdateInfo.js.map +0 -1
  223. package/lib/module/DefaultResolver.js +0 -46
  224. package/lib/module/DefaultResolver.js.map +0 -1
  225. package/lib/module/DefaultResolver.spec.js +0 -144
  226. package/lib/module/DefaultResolver.spec.js.map +0 -1
  227. package/lib/module/fetchUpdateInfo.js.map +0 -1
  228. package/lib/typescript/commonjs/DefaultResolver.d.ts +0 -11
  229. package/lib/typescript/commonjs/DefaultResolver.d.ts.map +0 -1
  230. package/lib/typescript/commonjs/fetchUpdateInfo.d.ts +0 -7
  231. package/lib/typescript/commonjs/fetchUpdateInfo.d.ts.map +0 -1
  232. package/lib/typescript/module/DefaultResolver.d.ts +0 -11
  233. package/lib/typescript/module/DefaultResolver.d.ts.map +0 -1
  234. package/lib/typescript/module/fetchUpdateInfo.d.ts +0 -7
  235. package/lib/typescript/module/fetchUpdateInfo.d.ts.map +0 -1
  236. package/plugin/build/transformers.js +0 -314
  237. package/plugin/build/withHotUpdater.js +0 -228
  238. package/src/DefaultResolver.spec.ts +0 -193
  239. package/src/DefaultResolver.ts +0 -63
@@ -1,193 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { readFile } from "node:fs/promises";
3
- import { join } from "node:path";
4
-
5
- import { beforeEach, describe, expect, it, vi } from "vitest";
6
-
7
- import { createDefaultResolver } from "./DefaultResolver";
8
- import { HOT_UPDATER_SDK_VERSION } from "./sdkVersion";
9
- import type { ResolverCheckUpdateParams } from "./types";
10
-
11
- const mocks = vi.hoisted(() => {
12
- (
13
- globalThis as typeof globalThis & {
14
- HotUpdater: { SDK_VERSION: string };
15
- }
16
- ).HotUpdater = { SDK_VERSION: "test-sdk-version" };
17
-
18
- return {
19
- fetchUpdateInfo: vi.fn(),
20
- };
21
- });
22
-
23
- vi.mock("./fetchUpdateInfo", () => ({
24
- fetchUpdateInfo: mocks.fetchUpdateInfo,
25
- }));
26
-
27
- const createParams = (
28
- params?: Partial<ResolverCheckUpdateParams>,
29
- ): ResolverCheckUpdateParams => ({
30
- appVersion: "1.0.0",
31
- bundleId: "bundle-id",
32
- channel: "production",
33
- cohort: "cohort",
34
- fingerprintHash: null,
35
- minBundleId: "min-bundle-id",
36
- platform: "ios",
37
- updateStrategy: "appVersion",
38
- ...params,
39
- });
40
-
41
- describe("createDefaultResolver", () => {
42
- beforeEach(() => {
43
- mocks.fetchUpdateInfo.mockReset();
44
- mocks.fetchUpdateInfo.mockResolvedValue(null);
45
- });
46
-
47
- it("strips trailing slashes from baseURL for app-version requests", async () => {
48
- const resolver = createDefaultResolver(
49
- "http://localhost:3007/hot-updater/",
50
- );
51
-
52
- await resolver.checkUpdate?.(
53
- createParams({
54
- appVersion: "1.0",
55
- bundleId: "current-bundle",
56
- channel: "production",
57
- cohort: "730",
58
- minBundleId: "min-bundle",
59
- platform: "android",
60
- }),
61
- );
62
-
63
- expect(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
64
- requestHeaders: {
65
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
66
- },
67
- requestTimeout: undefined,
68
- url: "http://localhost:3007/hot-updater/app-version/android/1.0/production/min-bundle/current-bundle/730",
69
- });
70
- });
71
-
72
- it("strips trailing slashes from baseURL for fingerprint requests", async () => {
73
- const resolver = createDefaultResolver(
74
- "http://localhost:3007/hot-updater///",
75
- );
76
-
77
- await resolver.checkUpdate?.(
78
- createParams({
79
- appVersion: "1.0",
80
- bundleId: "current-bundle",
81
- channel: "beta",
82
- cohort: "qa",
83
- fingerprintHash: "fingerprint-hash",
84
- minBundleId: "min-bundle",
85
- platform: "ios",
86
- requestHeaders: { authorization: "Bearer token" },
87
- requestTimeout: 1500,
88
- updateStrategy: "fingerprint",
89
- }),
90
- );
91
-
92
- expect(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
93
- requestHeaders: {
94
- authorization: "Bearer token",
95
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
96
- },
97
- requestTimeout: 1500,
98
- url: "http://localhost:3007/hot-updater/fingerprint/ios/fingerprint-hash/beta/min-bundle/current-bundle/qa",
99
- });
100
- });
101
-
102
- it("keeps SDK version sync from leaving source changes behind", async () => {
103
- const sdkVersionPath = join(__dirname, "sdkVersion.ts");
104
- const before = await readFile(sdkVersionPath, "utf-8");
105
- const result = spawnSync(
106
- process.execPath,
107
- [join(__dirname, "../scripts/sync-sdk-version.mjs")],
108
- {
109
- cwd: join(__dirname, ".."),
110
- encoding: "utf-8",
111
- },
112
- );
113
-
114
- expect(result.status, result.stderr).toBe(0);
115
- await expect(readFile(sdkVersionPath, "utf-8")).resolves.toBe(before);
116
- });
117
-
118
- it("propagates fetchUpdateInfo errors", async () => {
119
- mocks.fetchUpdateInfo.mockRejectedValueOnce(new Error("Network failed"));
120
- const resolver = createDefaultResolver("http://localhost:3007/hot-updater");
121
-
122
- await expect(resolver.checkUpdate?.(createParams())).rejects.toThrow(
123
- "Network failed",
124
- );
125
- });
126
-
127
- it("resolves dynamic baseURL before checking for updates", async () => {
128
- const resolveBaseURL = vi.fn(async () => "https://updates.example.com");
129
- const resolver = createDefaultResolver(resolveBaseURL);
130
-
131
- await resolver.checkUpdate?.(createParams());
132
-
133
- expect(resolveBaseURL).toHaveBeenCalledWith();
134
- expect(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
135
- requestHeaders: {
136
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
137
- },
138
- requestTimeout: undefined,
139
- url: "https://updates.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort",
140
- });
141
- });
142
-
143
- it("calls dynamic baseURL for each update check", async () => {
144
- const resolveBaseURL = vi
145
- .fn<() => Promise<string>>()
146
- .mockResolvedValueOnce("https://one.example.com")
147
- .mockResolvedValueOnce("https://two.example.com");
148
- const resolver = createDefaultResolver(resolveBaseURL);
149
-
150
- await resolver.checkUpdate?.(createParams());
151
- await resolver.checkUpdate?.(createParams());
152
-
153
- expect(resolveBaseURL).toHaveBeenCalledTimes(2);
154
- expect(mocks.fetchUpdateInfo).toHaveBeenNthCalledWith(1, {
155
- requestHeaders: {
156
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
157
- },
158
- requestTimeout: undefined,
159
- url: "https://one.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort",
160
- });
161
- expect(mocks.fetchUpdateInfo).toHaveBeenNthCalledWith(2, {
162
- requestHeaders: {
163
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
164
- },
165
- requestTimeout: undefined,
166
- url: "https://two.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort",
167
- });
168
- });
169
-
170
- it("strips trailing slashes from dynamic baseURL results", async () => {
171
- const resolver = createDefaultResolver(
172
- () => "https://updates.example.com/",
173
- );
174
-
175
- await resolver.checkUpdate?.(createParams());
176
-
177
- expect(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
178
- requestHeaders: {
179
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
180
- },
181
- requestTimeout: undefined,
182
- url: "https://updates.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort",
183
- });
184
- });
185
-
186
- it("rejects an empty dynamic baseURL", async () => {
187
- const resolver = createDefaultResolver(() => "");
188
-
189
- await expect(resolver.checkUpdate?.(createParams())).rejects.toThrow(
190
- "baseURL resolver must return a non-empty string",
191
- );
192
- });
193
- });
@@ -1,63 +0,0 @@
1
- import type { AppUpdateInfo } from "@hot-updater/core";
2
-
3
- import { fetchUpdateInfo } from "./fetchUpdateInfo";
4
- import { HOT_UPDATER_SDK_VERSION } from "./sdkVersion";
5
- import type {
6
- HotUpdaterBaseURL,
7
- HotUpdaterResolver,
8
- ResolverCheckUpdateParams,
9
- } from "./types";
10
-
11
- const resolveBaseURL = async (baseURL: HotUpdaterBaseURL): Promise<string> => {
12
- const resolvedBaseURL =
13
- typeof baseURL === "function" ? await baseURL() : baseURL;
14
-
15
- if (!resolvedBaseURL) {
16
- throw new Error("baseURL resolver must return a non-empty string");
17
- }
18
-
19
- return resolvedBaseURL;
20
- };
21
-
22
- /**
23
- * Creates a default resolver that uses baseURL for network operations.
24
- * This encapsulates the existing baseURL logic into a resolver.
25
- *
26
- * @param baseURL - The base URL for the update server, or a function that
27
- * resolves it before each update check.
28
- * @returns A HotUpdaterResolver that uses the baseURL
29
- */
30
- export function createDefaultResolver(
31
- baseURL: HotUpdaterBaseURL,
32
- ): HotUpdaterResolver {
33
- return {
34
- checkUpdate: async (
35
- params: ResolverCheckUpdateParams,
36
- ): Promise<AppUpdateInfo | null> => {
37
- const resolvedBaseURL = (await resolveBaseURL(baseURL)).replace(
38
- /\/+$/,
39
- "",
40
- );
41
- let url: string;
42
- const cohortPath = `/${encodeURIComponent(params.cohort)}`;
43
-
44
- if (params.updateStrategy === "fingerprint") {
45
- if (!params.fingerprintHash) {
46
- throw new Error("Fingerprint hash is required");
47
- }
48
- url = `${resolvedBaseURL}/fingerprint/${params.platform}/${params.fingerprintHash}/${params.channel}/${params.minBundleId}/${params.bundleId}${cohortPath}`;
49
- } else {
50
- url = `${resolvedBaseURL}/app-version/${params.platform}/${params.appVersion}/${params.channel}/${params.minBundleId}/${params.bundleId}${cohortPath}`;
51
- }
52
-
53
- return fetchUpdateInfo({
54
- url,
55
- requestHeaders: {
56
- ...params.requestHeaders,
57
- "Hot-Updater-SDK-Version": HOT_UPDATER_SDK_VERSION,
58
- },
59
- requestTimeout: params.requestTimeout,
60
- });
61
- },
62
- };
63
- }