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

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 +48 -71
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/index.spec.js +117 -161
  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 -55
  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 +49 -66
  90. package/lib/module/index.js.map +1 -1
  91. package/lib/module/index.spec.js +117 -161
  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 -51
  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 +32 -41
  137. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/native.d.ts +83 -18
  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 +32 -41
  167. package/lib/typescript/module/index.d.ts.map +1 -1
  168. package/lib/typescript/module/native.d.ts +83 -18
  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 +368 -97
  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 +110 -203
  196. package/src/index.ts +70 -93
  197. package/src/iosInterop.spec.ts +30 -0
  198. package/src/native.spec.ts +226 -10
  199. package/src/native.ts +385 -83
  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
@@ -0,0 +1,261 @@
1
+ import {
2
+ encodeChannelKey,
3
+ type ArtifactInfo,
4
+ type ReleaseCatalog,
5
+ } from "@hot-updater/core";
6
+ import { canonicalizeAppVersion } from "@hot-updater/plugin-core";
7
+
8
+ import { fetchJSON } from "./fetchJSON";
9
+ import { fetchReleaseCatalogWithCache } from "./releaseCatalogCache";
10
+ import { HOT_UPDATER_SDK_VERSION } from "./sdkVersion";
11
+ import type { HotUpdaterBaseURL } from "./types";
12
+
13
+ export interface ReleaseCatalogRequest {
14
+ readonly platform: "ios" | "android";
15
+ readonly channel: string;
16
+ readonly updateStrategy: "fingerprint" | "appVersion";
17
+ readonly appVersion: string;
18
+ readonly fingerprintHash: string | null;
19
+ readonly requestHeaders?: Record<string, string>;
20
+ readonly requestTimeout?: number;
21
+ }
22
+
23
+ export interface ArtifactRequest {
24
+ readonly targetBundleId: string;
25
+ readonly currentBundleId: string;
26
+ readonly requestHeaders?: Record<string, string>;
27
+ readonly requestTimeout?: number;
28
+ }
29
+
30
+ interface AnalyticsEventCommonParams {
31
+ readonly installId: string;
32
+ readonly userId?: string;
33
+ readonly username?: string;
34
+ readonly platform: "ios" | "android";
35
+ readonly appVersion: string;
36
+ readonly channel: string;
37
+ readonly cohort: string;
38
+ readonly fingerprintHash: string | null;
39
+ readonly fromReleaseId?: string | null;
40
+ readonly toReleaseId?: string | null;
41
+ readonly requestHeaders?: Record<string, string>;
42
+ readonly requestTimeout?: number;
43
+ }
44
+
45
+ type AnalyticsTransitionEventParams = AnalyticsEventCommonParams & {
46
+ readonly type: "UPDATE_APPLIED" | "RECOVERED" | "RELEASE_ADOPTED";
47
+ readonly fromBundleId: string;
48
+ readonly toBundleId: string;
49
+ readonly updateStrategy: "fingerprint" | "appVersion";
50
+ };
51
+
52
+ type AnalyticsUnchangedEventParams = AnalyticsEventCommonParams & {
53
+ readonly type: "UNCHANGED";
54
+ readonly fromBundleId: null;
55
+ readonly toBundleId: string;
56
+ readonly updateStrategy: null;
57
+ };
58
+
59
+ export type AnalyticsEventParams =
60
+ | AnalyticsTransitionEventParams
61
+ | AnalyticsUnchangedEventParams;
62
+
63
+ export interface HotUpdaterHttpSession {
64
+ fetchReleaseCatalog: (
65
+ params: ReleaseCatalogRequest,
66
+ ) => Promise<ReleaseCatalog>;
67
+ resolveArtifact: (params: ArtifactRequest) => Promise<ArtifactInfo>;
68
+ sendAnalyticsEvent: (params: AnalyticsEventParams) => Promise<void>;
69
+ }
70
+
71
+ export interface HotUpdaterHttpClient {
72
+ createSession: () => Promise<HotUpdaterHttpSession>;
73
+ }
74
+
75
+ const resolveBaseURL = async (baseURL: HotUpdaterBaseURL): Promise<string> => {
76
+ const resolvedBaseURL =
77
+ typeof baseURL === "function" ? await baseURL() : baseURL;
78
+
79
+ if (!resolvedBaseURL) {
80
+ throw new Error("baseURL function must return a non-empty string");
81
+ }
82
+
83
+ return resolvedBaseURL.replace(/\/+$/, "");
84
+ };
85
+
86
+ const resolveArtifactUrl = (baseURL: string, value: string): string => {
87
+ if (/^https?:\/\//i.test(value)) {
88
+ new URL(value);
89
+ return value;
90
+ }
91
+ if (!value.startsWith("/storage/")) {
92
+ throw new Error(
93
+ "Artifact URLs must be absolute HTTP(S) URLs or client-relative storage paths.",
94
+ );
95
+ }
96
+ return `${baseURL}/${value.slice(1)}`;
97
+ };
98
+
99
+ const resolveArtifactUrls = (
100
+ baseURL: string,
101
+ info: ArtifactInfo,
102
+ ): ArtifactInfo => ({
103
+ ...info,
104
+ fileUrl:
105
+ info.fileUrl === null ? null : resolveArtifactUrl(baseURL, info.fileUrl),
106
+ ...(info.manifestUrl === undefined
107
+ ? {}
108
+ : {
109
+ manifestUrl:
110
+ info.manifestUrl === null
111
+ ? null
112
+ : resolveArtifactUrl(baseURL, info.manifestUrl),
113
+ }),
114
+ ...(info.changedAssets === undefined
115
+ ? {}
116
+ : {
117
+ changedAssets:
118
+ info.changedAssets === null
119
+ ? null
120
+ : Object.fromEntries(
121
+ Object.entries(info.changedAssets).map(([path, asset]) => [
122
+ path,
123
+ {
124
+ ...asset,
125
+ ...(asset.file
126
+ ? {
127
+ file: {
128
+ ...asset.file,
129
+ url: resolveArtifactUrl(baseURL, asset.file.url),
130
+ },
131
+ }
132
+ : {}),
133
+ ...(asset.patch
134
+ ? {
135
+ patch: {
136
+ ...asset.patch,
137
+ patchUrl: resolveArtifactUrl(
138
+ baseURL,
139
+ asset.patch.patchUrl,
140
+ ),
141
+ },
142
+ }
143
+ : {}),
144
+ },
145
+ ]),
146
+ ),
147
+ }),
148
+ });
149
+
150
+ const sendAnalyticsEvent = async (
151
+ baseURL: string,
152
+ params: AnalyticsEventParams,
153
+ ): Promise<void> => {
154
+ const controller = new AbortController();
155
+ const timeoutId = setTimeout(() => {
156
+ controller.abort();
157
+ }, params.requestTimeout ?? 5000);
158
+
159
+ try {
160
+ const response = await fetch(`${baseURL}/events`, {
161
+ body: JSON.stringify({
162
+ appVersion: params.appVersion,
163
+ channel: params.channel,
164
+ cohort: params.cohort,
165
+ fingerprintHash: params.fingerprintHash,
166
+ fromBundleId: params.fromBundleId,
167
+ ...(params.fromReleaseId === undefined
168
+ ? {}
169
+ : { fromReleaseId: params.fromReleaseId }),
170
+ installId: params.installId,
171
+ platform: params.platform,
172
+ sdkVersion: HOT_UPDATER_SDK_VERSION,
173
+ toBundleId: params.toBundleId,
174
+ ...(params.toReleaseId === undefined
175
+ ? {}
176
+ : { toReleaseId: params.toReleaseId }),
177
+ type: params.type,
178
+ updateStrategy: params.updateStrategy,
179
+ ...(params.userId != null ? { userId: params.userId } : {}),
180
+ ...(params.username != null ? { username: params.username } : {}),
181
+ }),
182
+ headers: {
183
+ "Content-Type": "application/json",
184
+ ...params.requestHeaders,
185
+ },
186
+ method: "POST",
187
+ signal: controller.signal,
188
+ });
189
+
190
+ if (response.status !== 204) {
191
+ throw new Error(
192
+ `Expected HTTP 204 from /events, received ${response.status}`,
193
+ );
194
+ }
195
+ } catch (error: unknown) {
196
+ if (error instanceof Error && error.name === "AbortError") {
197
+ throw new Error("Request timed out");
198
+ }
199
+ throw error;
200
+ } finally {
201
+ clearTimeout(timeoutId);
202
+ }
203
+ };
204
+
205
+ const createSession = (baseURL: string): HotUpdaterHttpSession => ({
206
+ fetchReleaseCatalog: async (params): Promise<ReleaseCatalog> => {
207
+ const channelKey = encodeChannelKey(params.channel);
208
+ let strategyValue: string;
209
+ if (params.updateStrategy === "fingerprint") {
210
+ if (!params.fingerprintHash) {
211
+ throw new Error("Fingerprint hash is required");
212
+ }
213
+ strategyValue = params.fingerprintHash;
214
+ } else {
215
+ const appVersion = canonicalizeAppVersion(params.appVersion);
216
+ if (appVersion === null) throw new Error("Invalid app version");
217
+ strategyValue = appVersion;
218
+ }
219
+ const strategyPath =
220
+ params.updateStrategy === "fingerprint" ? "fingerprint" : "app-version";
221
+ const url = `${baseURL}/release-catalogs/${strategyPath}/${params.platform}/${channelKey}/${encodeURIComponent(strategyValue)}`;
222
+
223
+ return fetchReleaseCatalogWithCache({
224
+ baseURL,
225
+ expectedScope:
226
+ params.updateStrategy === "fingerprint"
227
+ ? {
228
+ channelKey,
229
+ fingerprintHash: strategyValue,
230
+ platform: params.platform,
231
+ strategy: "FINGERPRINT",
232
+ }
233
+ : {
234
+ channelKey,
235
+ platform: params.platform,
236
+ strategy: "APP_VERSION",
237
+ },
238
+ requestHeaders: params.requestHeaders,
239
+ requestTimeout: params.requestTimeout,
240
+ url,
241
+ });
242
+ },
243
+ resolveArtifact: async (params): Promise<ArtifactInfo> => {
244
+ const info = await fetchJSON<ArtifactInfo>({
245
+ requestHeaders: params.requestHeaders,
246
+ requestTimeout: params.requestTimeout,
247
+ url: `${baseURL}/artifacts/${encodeURIComponent(
248
+ params.targetBundleId,
249
+ )}/from/${encodeURIComponent(params.currentBundleId)}`,
250
+ });
251
+ return resolveArtifactUrls(baseURL, info);
252
+ },
253
+ sendAnalyticsEvent: (params) => sendAnalyticsEvent(baseURL, params),
254
+ });
255
+
256
+ /** Creates the private HTTP client used by HotUpdater.init and HotUpdater.wrap. */
257
+ export const createHttpClient = (
258
+ baseURL: HotUpdaterBaseURL,
259
+ ): HotUpdaterHttpClient => ({
260
+ createSession: async () => createSession(await resolveBaseURL(baseURL)),
261
+ });