@hot-updater/react-native 0.36.6 → 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.
- package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +357 -6
- package/android/src/main/java/com/hotupdater/BundleMetadata.kt +268 -34
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +75 -9
- package/android/src/main/java/com/hotupdater/NativeConfigUtils.kt +2 -16
- package/android/src/main/java/com/hotupdater/ReleaseCatalogCacheService.kt +166 -0
- package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +1 -2
- package/android/src/newarch/HotUpdater.kt +1 -1
- package/android/src/newarch/HotUpdaterModule.kt +116 -0
- package/android/src/oldarch/HotUpdater.kt +1 -1
- package/android/src/oldarch/HotUpdaterModule.kt +128 -0
- package/android/src/oldarch/HotUpdaterSpec.kt +38 -0
- package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +280 -2
- package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +57 -2
- package/android/src/test/java/com/hotupdater/ReleaseCatalogCacheServiceTest.kt +118 -0
- package/ios/HotUpdater/Internal/BundleFileStorageService.swift +491 -30
- package/ios/HotUpdater/Internal/BundleMetadata.swift +229 -6
- package/ios/HotUpdater/Internal/HotUpdater.mm +122 -0
- package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +176 -7
- package/ios/HotUpdater/Internal/ReleaseCatalogCacheService.swift +213 -0
- package/lib/commonjs/catalogCacheNative.js +44 -0
- package/lib/commonjs/catalogCacheNative.js.map +1 -0
- package/lib/commonjs/catalogCacheNative.spec.js +31 -0
- package/lib/commonjs/catalogCacheNative.spec.js.map +1 -0
- package/lib/commonjs/checkForUpdate.js +231 -60
- package/lib/commonjs/checkForUpdate.js.map +1 -1
- package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +604 -0
- package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +1 -0
- package/lib/commonjs/error.js +8 -1
- package/lib/commonjs/error.js.map +1 -1
- package/lib/commonjs/{fetchUpdateInfo.js → fetchJSON.js} +11 -14
- package/lib/commonjs/fetchJSON.js.map +1 -0
- package/lib/commonjs/httpClient.js +153 -0
- package/lib/commonjs/httpClient.js.map +1 -0
- package/lib/commonjs/httpClient.spec.js +102 -0
- package/lib/commonjs/httpClient.spec.js.map +1 -0
- package/lib/commonjs/index.js +48 -71
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.spec.js +117 -161
- package/lib/commonjs/index.spec.js.map +1 -1
- package/lib/commonjs/iosInterop.spec.js +18 -0
- package/lib/commonjs/iosInterop.spec.js.map +1 -0
- package/lib/commonjs/native.js +222 -55
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.spec.js +226 -12
- package/lib/commonjs/native.spec.js.map +1 -1
- package/lib/commonjs/notifyAppReadyAnalytics.boundary.spec.js +218 -0
- package/lib/commonjs/notifyAppReadyAnalytics.boundary.spec.js.map +1 -0
- package/lib/commonjs/notifyAppReadyAnalytics.js +133 -0
- package/lib/commonjs/notifyAppReadyAnalytics.js.map +1 -0
- package/lib/commonjs/notifyAppReadyAnalytics.spec.js +246 -0
- package/lib/commonjs/notifyAppReadyAnalytics.spec.js.map +1 -0
- package/lib/commonjs/notifyAppReadyAnalytics.test-utils.js +24 -0
- package/lib/commonjs/notifyAppReadyAnalytics.test-utils.js.map +1 -0
- package/lib/commonjs/notifyAppReadyAnalytics.transport.spec.js +117 -0
- package/lib/commonjs/notifyAppReadyAnalytics.transport.spec.js.map +1 -0
- package/lib/commonjs/releaseCatalogCache.js +179 -0
- package/lib/commonjs/releaseCatalogCache.js.map +1 -0
- package/lib/commonjs/releaseCatalogCache.spec.js +195 -0
- package/lib/commonjs/releaseCatalogCache.spec.js.map +1 -0
- package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js +64 -0
- package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js.map +1 -0
- package/lib/commonjs/sdkVersion.js +1 -1
- package/lib/commonjs/sdkVersion.js.map +1 -1
- package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
- package/lib/commonjs/types.js +0 -12
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/wrap.js +7 -82
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/commonjs/wrap.spec.js +203 -56
- package/lib/commonjs/wrap.spec.js.map +1 -1
- package/lib/commonjs/wrap.types.js +6 -0
- package/lib/commonjs/wrap.types.js.map +1 -0
- package/lib/module/catalogCacheNative.js +36 -0
- package/lib/module/catalogCacheNative.js.map +1 -0
- package/lib/module/catalogCacheNative.spec.js +31 -0
- package/lib/module/catalogCacheNative.spec.js.map +1 -0
- package/lib/module/checkForUpdate.js +233 -62
- package/lib/module/checkForUpdate.js.map +1 -1
- package/lib/module/checkForUpdate.releaseCatalog.spec.js +603 -0
- package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +1 -0
- package/lib/module/error.js +6 -0
- package/lib/module/error.js.map +1 -1
- package/lib/module/{fetchUpdateInfo.js → fetchJSON.js} +9 -12
- package/lib/module/fetchJSON.js.map +1 -0
- package/lib/module/httpClient.js +148 -0
- package/lib/module/httpClient.js.map +1 -0
- package/lib/module/httpClient.spec.js +102 -0
- package/lib/module/httpClient.spec.js.map +1 -0
- package/lib/module/index.js +49 -66
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.spec.js +117 -161
- package/lib/module/index.spec.js.map +1 -1
- package/lib/module/iosInterop.spec.js +18 -0
- package/lib/module/iosInterop.spec.js.map +1 -0
- package/lib/module/native.js +206 -51
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.spec.js +226 -12
- package/lib/module/native.spec.js.map +1 -1
- package/lib/module/notifyAppReadyAnalytics.boundary.spec.js +217 -0
- package/lib/module/notifyAppReadyAnalytics.boundary.spec.js.map +1 -0
- package/lib/module/notifyAppReadyAnalytics.js +128 -0
- package/lib/module/notifyAppReadyAnalytics.js.map +1 -0
- package/lib/module/notifyAppReadyAnalytics.spec.js +245 -0
- package/lib/module/notifyAppReadyAnalytics.spec.js.map +1 -0
- package/lib/module/notifyAppReadyAnalytics.test-utils.js +18 -0
- package/lib/module/notifyAppReadyAnalytics.test-utils.js.map +1 -0
- package/lib/module/notifyAppReadyAnalytics.transport.spec.js +116 -0
- package/lib/module/notifyAppReadyAnalytics.transport.spec.js.map +1 -0
- package/lib/module/releaseCatalogCache.js +171 -0
- package/lib/module/releaseCatalogCache.js.map +1 -0
- package/lib/module/releaseCatalogCache.spec.js +195 -0
- package/lib/module/releaseCatalogCache.spec.js.map +1 -0
- package/lib/module/releaseCatalogCacheNativeContract.spec.js +64 -0
- package/lib/module/releaseCatalogCacheNativeContract.spec.js.map +1 -0
- package/lib/module/sdkVersion.js +1 -1
- package/lib/module/sdkVersion.js.map +1 -1
- package/lib/module/specs/NativeHotUpdater.js.map +1 -1
- package/lib/module/types.js +0 -12
- package/lib/module/types.js.map +1 -1
- package/lib/module/wrap.js +6 -81
- package/lib/module/wrap.js.map +1 -1
- package/lib/module/wrap.spec.js +203 -56
- package/lib/module/wrap.spec.js.map +1 -1
- package/lib/module/wrap.types.js +4 -0
- package/lib/module/wrap.types.js.map +1 -0
- package/lib/typescript/commonjs/catalogCacheNative.d.ts +4 -0
- package/lib/typescript/commonjs/catalogCacheNative.d.ts.map +1 -0
- package/lib/typescript/commonjs/checkForUpdate.d.ts +14 -4
- package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/error.d.ts +3 -0
- package/lib/typescript/commonjs/error.d.ts.map +1 -1
- package/lib/typescript/commonjs/fetchJSON.d.ts +6 -0
- package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -0
- package/lib/typescript/commonjs/httpClient.d.ts +56 -0
- package/lib/typescript/commonjs/httpClient.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +32 -41
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +83 -18
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/notifyAppReadyAnalytics.d.ts +13 -0
- package/lib/typescript/commonjs/notifyAppReadyAnalytics.d.ts.map +1 -0
- package/lib/typescript/commonjs/notifyAppReadyAnalytics.test-utils.d.ts +8 -0
- package/lib/typescript/commonjs/notifyAppReadyAnalytics.test-utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/releaseCatalogCache.d.ts +25 -0
- package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -0
- package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
- package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +40 -5
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +0 -118
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.d.ts +2 -191
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.types.d.ts +65 -0
- package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -0
- package/lib/typescript/module/catalogCacheNative.d.ts +4 -0
- package/lib/typescript/module/catalogCacheNative.d.ts.map +1 -0
- package/lib/typescript/module/checkForUpdate.d.ts +14 -4
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/error.d.ts +3 -0
- package/lib/typescript/module/error.d.ts.map +1 -1
- package/lib/typescript/module/fetchJSON.d.ts +6 -0
- package/lib/typescript/module/fetchJSON.d.ts.map +1 -0
- package/lib/typescript/module/httpClient.d.ts +56 -0
- package/lib/typescript/module/httpClient.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +32 -41
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +83 -18
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/notifyAppReadyAnalytics.d.ts +13 -0
- package/lib/typescript/module/notifyAppReadyAnalytics.d.ts.map +1 -0
- package/lib/typescript/module/notifyAppReadyAnalytics.test-utils.d.ts +8 -0
- package/lib/typescript/module/notifyAppReadyAnalytics.test-utils.d.ts.map +1 -0
- package/lib/typescript/module/releaseCatalogCache.d.ts +25 -0
- package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -0
- package/lib/typescript/module/sdkVersion.d.ts +1 -1
- package/lib/typescript/module/sdkVersion.d.ts.map +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +40 -5
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +0 -118
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/wrap.d.ts +2 -191
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/lib/typescript/module/wrap.types.d.ts +65 -0
- package/lib/typescript/module/wrap.types.d.ts.map +1 -0
- package/package.json +6 -24
- package/src/catalogCacheNative.spec.ts +63 -0
- package/src/catalogCacheNative.ts +74 -0
- package/src/checkForUpdate.releaseCatalog.spec.ts +596 -0
- package/src/checkForUpdate.ts +368 -97
- package/src/error.ts +7 -0
- package/src/{fetchUpdateInfo.ts → fetchJSON.ts} +8 -15
- package/src/httpClient.spec.ts +132 -0
- package/src/httpClient.ts +261 -0
- package/src/index.spec.ts +110 -203
- package/src/index.ts +70 -93
- package/src/iosInterop.spec.ts +30 -0
- package/src/native.spec.ts +226 -10
- package/src/native.ts +385 -83
- package/src/notifyAppReadyAnalytics.boundary.spec.ts +234 -0
- package/src/notifyAppReadyAnalytics.spec.ts +243 -0
- package/src/notifyAppReadyAnalytics.test-utils.ts +31 -0
- package/src/notifyAppReadyAnalytics.transport.spec.ts +130 -0
- package/src/notifyAppReadyAnalytics.ts +194 -0
- package/src/releaseCatalogCache.spec.ts +282 -0
- package/src/releaseCatalogCache.ts +341 -0
- package/src/releaseCatalogCacheNativeContract.spec.ts +80 -0
- package/src/sdkVersion.ts +1 -1
- package/src/specs/NativeHotUpdater.ts +51 -5
- package/src/types.ts +0 -140
- package/src/wrap.spec.ts +251 -56
- package/src/wrap.tsx +23 -318
- package/src/wrap.types.ts +78 -0
- package/android/src/main/java/com/hotupdater/StringResourceUtils.kt +0 -45
- package/app.plugin.js +0 -1
- package/ios/HotUpdater/Internal/HotUpdaterCrashHandler.h +0 -7
- package/ios/HotUpdater/Internal/HotUpdaterCrashHandler.mm +0 -4
- package/lib/commonjs/DefaultResolver.js +0 -50
- package/lib/commonjs/DefaultResolver.js.map +0 -1
- package/lib/commonjs/DefaultResolver.spec.js +0 -144
- package/lib/commonjs/DefaultResolver.spec.js.map +0 -1
- package/lib/commonjs/fetchUpdateInfo.js.map +0 -1
- package/lib/module/DefaultResolver.js +0 -46
- package/lib/module/DefaultResolver.js.map +0 -1
- package/lib/module/DefaultResolver.spec.js +0 -144
- package/lib/module/DefaultResolver.spec.js.map +0 -1
- package/lib/module/fetchUpdateInfo.js.map +0 -1
- package/lib/typescript/commonjs/DefaultResolver.d.ts +0 -11
- package/lib/typescript/commonjs/DefaultResolver.d.ts.map +0 -1
- package/lib/typescript/commonjs/fetchUpdateInfo.d.ts +0 -7
- package/lib/typescript/commonjs/fetchUpdateInfo.d.ts.map +0 -1
- package/lib/typescript/module/DefaultResolver.d.ts +0 -11
- package/lib/typescript/module/DefaultResolver.d.ts.map +0 -1
- package/lib/typescript/module/fetchUpdateInfo.d.ts +0 -7
- package/lib/typescript/module/fetchUpdateInfo.d.ts.map +0 -1
- package/plugin/build/transformers.js +0 -314
- package/plugin/build/withHotUpdater.js +0 -228
- package/src/DefaultResolver.spec.ts +0 -193
- package/src/DefaultResolver.ts +0 -63
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const fetchJSON = async ({
|
|
4
4
|
url,
|
|
5
5
|
requestHeaders,
|
|
6
6
|
requestTimeout = 5000
|
|
7
7
|
}) => {
|
|
8
8
|
const controller = new AbortController();
|
|
9
|
-
const timeoutId = setTimeout(() =>
|
|
10
|
-
controller.abort();
|
|
11
|
-
}, requestTimeout);
|
|
9
|
+
const timeoutId = setTimeout(() => controller.abort(), requestTimeout);
|
|
12
10
|
try {
|
|
13
|
-
const headers = {
|
|
14
|
-
"Content-Type": "application/json",
|
|
15
|
-
...requestHeaders
|
|
16
|
-
};
|
|
17
11
|
const response = await fetch(url, {
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
headers: {
|
|
13
|
+
Accept: "application/json",
|
|
14
|
+
...requestHeaders
|
|
15
|
+
},
|
|
16
|
+
signal: controller.signal
|
|
20
17
|
});
|
|
21
18
|
if (response.status !== 200) {
|
|
22
19
|
throw new Error(response.statusText);
|
|
23
20
|
}
|
|
24
|
-
return response.json();
|
|
21
|
+
return await response.json();
|
|
25
22
|
} catch (error) {
|
|
26
23
|
if (error instanceof Error && error.name === "AbortError") {
|
|
27
24
|
throw new Error("Request timed out");
|
|
@@ -31,4 +28,4 @@ export const fetchUpdateInfo = async ({
|
|
|
31
28
|
clearTimeout(timeoutId);
|
|
32
29
|
}
|
|
33
30
|
};
|
|
34
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=fetchJSON.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fetchJSON","url","requestHeaders","requestTimeout","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","headers","Accept","signal","status","Error","statusText","json","error","name","clearTimeout"],"sourceRoot":"../../src","sources":["fetchJSON.ts"],"mappings":";;AAAA,OAAO,MAAMA,SAAS,GAAG,MAAAA,CAAU;EACjCC,GAAG;EACHC,cAAc;EACdC,cAAc,GAAG;AAKnB,CAAC,KAAiB;EAChB,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;EACxC,MAAMC,SAAS,GAAGC,UAAU,CAAC,MAAMH,UAAU,CAACI,KAAK,CAAC,CAAC,EAAEL,cAAc,CAAC;EAEtE,IAAI;IACF,MAAMM,QAAQ,GAAG,MAAMC,KAAK,CAACT,GAAG,EAAE;MAChCU,OAAO,EAAE;QACPC,MAAM,EAAE,kBAAkB;QAC1B,GAAGV;MACL,CAAC;MACDW,MAAM,EAAET,UAAU,CAACS;IACrB,CAAC,CAAC;IACF,IAAIJ,QAAQ,CAACK,MAAM,KAAK,GAAG,EAAE;MAC3B,MAAM,IAAIC,KAAK,CAACN,QAAQ,CAACO,UAAU,CAAC;IACtC;IACA,OAAQ,MAAMP,QAAQ,CAACQ,IAAI,CAAC,CAAC;EAC/B,CAAC,CAAC,OAAOC,KAAc,EAAE;IACvB,IAAIA,KAAK,YAAYH,KAAK,IAAIG,KAAK,CAACC,IAAI,KAAK,YAAY,EAAE;MACzD,MAAM,IAAIJ,KAAK,CAAC,mBAAmB,CAAC;IACtC;IACA,MAAMG,KAAK;EACb,CAAC,SAAS;IACRE,YAAY,CAACd,SAAS,CAAC;EACzB;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { encodeChannelKey } from "@hot-updater/core";
|
|
4
|
+
import { canonicalizeAppVersion } from "@hot-updater/plugin-core";
|
|
5
|
+
import { fetchJSON } from "./fetchJSON.js";
|
|
6
|
+
import { fetchReleaseCatalogWithCache } from "./releaseCatalogCache.js";
|
|
7
|
+
import { HOT_UPDATER_SDK_VERSION } from "./sdkVersion.js";
|
|
8
|
+
const resolveBaseURL = async baseURL => {
|
|
9
|
+
const resolvedBaseURL = typeof baseURL === "function" ? await baseURL() : baseURL;
|
|
10
|
+
if (!resolvedBaseURL) {
|
|
11
|
+
throw new Error("baseURL function must return a non-empty string");
|
|
12
|
+
}
|
|
13
|
+
return resolvedBaseURL.replace(/\/+$/, "");
|
|
14
|
+
};
|
|
15
|
+
const resolveArtifactUrl = (baseURL, value) => {
|
|
16
|
+
if (/^https?:\/\//i.test(value)) {
|
|
17
|
+
new URL(value);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
if (!value.startsWith("/storage/")) {
|
|
21
|
+
throw new Error("Artifact URLs must be absolute HTTP(S) URLs or client-relative storage paths.");
|
|
22
|
+
}
|
|
23
|
+
return `${baseURL}/${value.slice(1)}`;
|
|
24
|
+
};
|
|
25
|
+
const resolveArtifactUrls = (baseURL, info) => ({
|
|
26
|
+
...info,
|
|
27
|
+
fileUrl: info.fileUrl === null ? null : resolveArtifactUrl(baseURL, info.fileUrl),
|
|
28
|
+
...(info.manifestUrl === undefined ? {} : {
|
|
29
|
+
manifestUrl: info.manifestUrl === null ? null : resolveArtifactUrl(baseURL, info.manifestUrl)
|
|
30
|
+
}),
|
|
31
|
+
...(info.changedAssets === undefined ? {} : {
|
|
32
|
+
changedAssets: info.changedAssets === null ? null : Object.fromEntries(Object.entries(info.changedAssets).map(([path, asset]) => [path, {
|
|
33
|
+
...asset,
|
|
34
|
+
...(asset.file ? {
|
|
35
|
+
file: {
|
|
36
|
+
...asset.file,
|
|
37
|
+
url: resolveArtifactUrl(baseURL, asset.file.url)
|
|
38
|
+
}
|
|
39
|
+
} : {}),
|
|
40
|
+
...(asset.patch ? {
|
|
41
|
+
patch: {
|
|
42
|
+
...asset.patch,
|
|
43
|
+
patchUrl: resolveArtifactUrl(baseURL, asset.patch.patchUrl)
|
|
44
|
+
}
|
|
45
|
+
} : {})
|
|
46
|
+
}]))
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
const sendAnalyticsEvent = async (baseURL, params) => {
|
|
50
|
+
const controller = new AbortController();
|
|
51
|
+
const timeoutId = setTimeout(() => {
|
|
52
|
+
controller.abort();
|
|
53
|
+
}, params.requestTimeout ?? 5000);
|
|
54
|
+
try {
|
|
55
|
+
const response = await fetch(`${baseURL}/events`, {
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
appVersion: params.appVersion,
|
|
58
|
+
channel: params.channel,
|
|
59
|
+
cohort: params.cohort,
|
|
60
|
+
fingerprintHash: params.fingerprintHash,
|
|
61
|
+
fromBundleId: params.fromBundleId,
|
|
62
|
+
...(params.fromReleaseId === undefined ? {} : {
|
|
63
|
+
fromReleaseId: params.fromReleaseId
|
|
64
|
+
}),
|
|
65
|
+
installId: params.installId,
|
|
66
|
+
platform: params.platform,
|
|
67
|
+
sdkVersion: HOT_UPDATER_SDK_VERSION,
|
|
68
|
+
toBundleId: params.toBundleId,
|
|
69
|
+
...(params.toReleaseId === undefined ? {} : {
|
|
70
|
+
toReleaseId: params.toReleaseId
|
|
71
|
+
}),
|
|
72
|
+
type: params.type,
|
|
73
|
+
updateStrategy: params.updateStrategy,
|
|
74
|
+
...(params.userId != null ? {
|
|
75
|
+
userId: params.userId
|
|
76
|
+
} : {}),
|
|
77
|
+
...(params.username != null ? {
|
|
78
|
+
username: params.username
|
|
79
|
+
} : {})
|
|
80
|
+
}),
|
|
81
|
+
headers: {
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
...params.requestHeaders
|
|
84
|
+
},
|
|
85
|
+
method: "POST",
|
|
86
|
+
signal: controller.signal
|
|
87
|
+
});
|
|
88
|
+
if (response.status !== 204) {
|
|
89
|
+
throw new Error(`Expected HTTP 204 from /events, received ${response.status}`);
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
93
|
+
throw new Error("Request timed out");
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
} finally {
|
|
97
|
+
clearTimeout(timeoutId);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const createSession = baseURL => ({
|
|
101
|
+
fetchReleaseCatalog: async params => {
|
|
102
|
+
const channelKey = encodeChannelKey(params.channel);
|
|
103
|
+
let strategyValue;
|
|
104
|
+
if (params.updateStrategy === "fingerprint") {
|
|
105
|
+
if (!params.fingerprintHash) {
|
|
106
|
+
throw new Error("Fingerprint hash is required");
|
|
107
|
+
}
|
|
108
|
+
strategyValue = params.fingerprintHash;
|
|
109
|
+
} else {
|
|
110
|
+
const appVersion = canonicalizeAppVersion(params.appVersion);
|
|
111
|
+
if (appVersion === null) throw new Error("Invalid app version");
|
|
112
|
+
strategyValue = appVersion;
|
|
113
|
+
}
|
|
114
|
+
const strategyPath = params.updateStrategy === "fingerprint" ? "fingerprint" : "app-version";
|
|
115
|
+
const url = `${baseURL}/release-catalogs/${strategyPath}/${params.platform}/${channelKey}/${encodeURIComponent(strategyValue)}`;
|
|
116
|
+
return fetchReleaseCatalogWithCache({
|
|
117
|
+
baseURL,
|
|
118
|
+
expectedScope: params.updateStrategy === "fingerprint" ? {
|
|
119
|
+
channelKey,
|
|
120
|
+
fingerprintHash: strategyValue,
|
|
121
|
+
platform: params.platform,
|
|
122
|
+
strategy: "FINGERPRINT"
|
|
123
|
+
} : {
|
|
124
|
+
channelKey,
|
|
125
|
+
platform: params.platform,
|
|
126
|
+
strategy: "APP_VERSION"
|
|
127
|
+
},
|
|
128
|
+
requestHeaders: params.requestHeaders,
|
|
129
|
+
requestTimeout: params.requestTimeout,
|
|
130
|
+
url
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
resolveArtifact: async params => {
|
|
134
|
+
const info = await fetchJSON({
|
|
135
|
+
requestHeaders: params.requestHeaders,
|
|
136
|
+
requestTimeout: params.requestTimeout,
|
|
137
|
+
url: `${baseURL}/artifacts/${encodeURIComponent(params.targetBundleId)}/from/${encodeURIComponent(params.currentBundleId)}`
|
|
138
|
+
});
|
|
139
|
+
return resolveArtifactUrls(baseURL, info);
|
|
140
|
+
},
|
|
141
|
+
sendAnalyticsEvent: params => sendAnalyticsEvent(baseURL, params)
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
/** Creates the private HTTP client used by HotUpdater.init and HotUpdater.wrap. */
|
|
145
|
+
export const createHttpClient = baseURL => ({
|
|
146
|
+
createSession: async () => createSession(await resolveBaseURL(baseURL))
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=httpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["encodeChannelKey","canonicalizeAppVersion","fetchJSON","fetchReleaseCatalogWithCache","HOT_UPDATER_SDK_VERSION","resolveBaseURL","baseURL","resolvedBaseURL","Error","replace","resolveArtifactUrl","value","test","URL","startsWith","slice","resolveArtifactUrls","info","fileUrl","manifestUrl","undefined","changedAssets","Object","fromEntries","entries","map","path","asset","file","url","patch","patchUrl","sendAnalyticsEvent","params","controller","AbortController","timeoutId","setTimeout","abort","requestTimeout","response","fetch","body","JSON","stringify","appVersion","channel","cohort","fingerprintHash","fromBundleId","fromReleaseId","installId","platform","sdkVersion","toBundleId","toReleaseId","type","updateStrategy","userId","username","headers","requestHeaders","method","signal","status","error","name","clearTimeout","createSession","fetchReleaseCatalog","channelKey","strategyValue","strategyPath","encodeURIComponent","expectedScope","strategy","resolveArtifact","targetBundleId","currentBundleId","createHttpClient"],"sourceRoot":"../../src","sources":["httpClient.ts"],"mappings":";;AAAA,SACEA,gBAAgB,QAGX,mBAAmB;AAC1B,SAASC,sBAAsB,QAAQ,0BAA0B;AAEjE,SAASC,SAAS,QAAQ,gBAAa;AACvC,SAASC,4BAA4B,QAAQ,0BAAuB;AACpE,SAASC,uBAAuB,QAAQ,iBAAc;AAiEtD,MAAMC,cAAc,GAAG,MAAOC,OAA0B,IAAsB;EAC5E,MAAMC,eAAe,GACnB,OAAOD,OAAO,KAAK,UAAU,GAAG,MAAMA,OAAO,CAAC,CAAC,GAAGA,OAAO;EAE3D,IAAI,CAACC,eAAe,EAAE;IACpB,MAAM,IAAIC,KAAK,CAAC,iDAAiD,CAAC;EACpE;EAEA,OAAOD,eAAe,CAACE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,MAAMC,kBAAkB,GAAGA,CAACJ,OAAe,EAAEK,KAAa,KAAa;EACrE,IAAI,eAAe,CAACC,IAAI,CAACD,KAAK,CAAC,EAAE;IAC/B,IAAIE,GAAG,CAACF,KAAK,CAAC;IACd,OAAOA,KAAK;EACd;EACA,IAAI,CAACA,KAAK,CAACG,UAAU,CAAC,WAAW,CAAC,EAAE;IAClC,MAAM,IAAIN,KAAK,CACb,+EACF,CAAC;EACH;EACA,OAAO,GAAGF,OAAO,IAAIK,KAAK,CAACI,KAAK,CAAC,CAAC,CAAC,EAAE;AACvC,CAAC;AAED,MAAMC,mBAAmB,GAAGA,CAC1BV,OAAe,EACfW,IAAkB,MACA;EAClB,GAAGA,IAAI;EACPC,OAAO,EACLD,IAAI,CAACC,OAAO,KAAK,IAAI,GAAG,IAAI,GAAGR,kBAAkB,CAACJ,OAAO,EAAEW,IAAI,CAACC,OAAO,CAAC;EAC1E,IAAID,IAAI,CAACE,WAAW,KAAKC,SAAS,GAC9B,CAAC,CAAC,GACF;IACED,WAAW,EACTF,IAAI,CAACE,WAAW,KAAK,IAAI,GACrB,IAAI,GACJT,kBAAkB,CAACJ,OAAO,EAAEW,IAAI,CAACE,WAAW;EACpD,CAAC,CAAC;EACN,IAAIF,IAAI,CAACI,aAAa,KAAKD,SAAS,GAChC,CAAC,CAAC,GACF;IACEC,aAAa,EACXJ,IAAI,CAACI,aAAa,KAAK,IAAI,GACvB,IAAI,GACJC,MAAM,CAACC,WAAW,CAChBD,MAAM,CAACE,OAAO,CAACP,IAAI,CAACI,aAAa,CAAC,CAACI,GAAG,CAAC,CAAC,CAACC,IAAI,EAAEC,KAAK,CAAC,KAAK,CACxDD,IAAI,EACJ;MACE,GAAGC,KAAK;MACR,IAAIA,KAAK,CAACC,IAAI,GACV;QACEA,IAAI,EAAE;UACJ,GAAGD,KAAK,CAACC,IAAI;UACbC,GAAG,EAAEnB,kBAAkB,CAACJ,OAAO,EAAEqB,KAAK,CAACC,IAAI,CAACC,GAAG;QACjD;MACF,CAAC,GACD,CAAC,CAAC,CAAC;MACP,IAAIF,KAAK,CAACG,KAAK,GACX;QACEA,KAAK,EAAE;UACL,GAAGH,KAAK,CAACG,KAAK;UACdC,QAAQ,EAAErB,kBAAkB,CAC1BJ,OAAO,EACPqB,KAAK,CAACG,KAAK,CAACC,QACd;QACF;MACF,CAAC,GACD,CAAC,CAAC;IACR,CAAC,CACF,CACH;EACR,CAAC;AACP,CAAC,CAAC;AAEF,MAAMC,kBAAkB,GAAG,MAAAA,CACzB1B,OAAe,EACf2B,MAA4B,KACV;EAClB,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;EACxC,MAAMC,SAAS,GAAGC,UAAU,CAAC,MAAM;IACjCH,UAAU,CAACI,KAAK,CAAC,CAAC;EACpB,CAAC,EAAEL,MAAM,CAACM,cAAc,IAAI,IAAI,CAAC;EAEjC,IAAI;IACF,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGnC,OAAO,SAAS,EAAE;MAChDoC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnBC,UAAU,EAAEZ,MAAM,CAACY,UAAU;QAC7BC,OAAO,EAAEb,MAAM,CAACa,OAAO;QACvBC,MAAM,EAAEd,MAAM,CAACc,MAAM;QACrBC,eAAe,EAAEf,MAAM,CAACe,eAAe;QACvCC,YAAY,EAAEhB,MAAM,CAACgB,YAAY;QACjC,IAAIhB,MAAM,CAACiB,aAAa,KAAK9B,SAAS,GAClC,CAAC,CAAC,GACF;UAAE8B,aAAa,EAAEjB,MAAM,CAACiB;QAAc,CAAC,CAAC;QAC5CC,SAAS,EAAElB,MAAM,CAACkB,SAAS;QAC3BC,QAAQ,EAAEnB,MAAM,CAACmB,QAAQ;QACzBC,UAAU,EAAEjD,uBAAuB;QACnCkD,UAAU,EAAErB,MAAM,CAACqB,UAAU;QAC7B,IAAIrB,MAAM,CAACsB,WAAW,KAAKnC,SAAS,GAChC,CAAC,CAAC,GACF;UAAEmC,WAAW,EAAEtB,MAAM,CAACsB;QAAY,CAAC,CAAC;QACxCC,IAAI,EAAEvB,MAAM,CAACuB,IAAI;QACjBC,cAAc,EAAExB,MAAM,CAACwB,cAAc;QACrC,IAAIxB,MAAM,CAACyB,MAAM,IAAI,IAAI,GAAG;UAAEA,MAAM,EAAEzB,MAAM,CAACyB;QAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAIzB,MAAM,CAAC0B,QAAQ,IAAI,IAAI,GAAG;UAAEA,QAAQ,EAAE1B,MAAM,CAAC0B;QAAS,CAAC,GAAG,CAAC,CAAC;MAClE,CAAC,CAAC;MACFC,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClC,GAAG3B,MAAM,CAAC4B;MACZ,CAAC;MACDC,MAAM,EAAE,MAAM;MACdC,MAAM,EAAE7B,UAAU,CAAC6B;IACrB,CAAC,CAAC;IAEF,IAAIvB,QAAQ,CAACwB,MAAM,KAAK,GAAG,EAAE;MAC3B,MAAM,IAAIxD,KAAK,CACb,4CAA4CgC,QAAQ,CAACwB,MAAM,EAC7D,CAAC;IACH;EACF,CAAC,CAAC,OAAOC,KAAc,EAAE;IACvB,IAAIA,KAAK,YAAYzD,KAAK,IAAIyD,KAAK,CAACC,IAAI,KAAK,YAAY,EAAE;MACzD,MAAM,IAAI1D,KAAK,CAAC,mBAAmB,CAAC;IACtC;IACA,MAAMyD,KAAK;EACb,CAAC,SAAS;IACRE,YAAY,CAAC/B,SAAS,CAAC;EACzB;AACF,CAAC;AAED,MAAMgC,aAAa,GAAI9D,OAAe,KAA6B;EACjE+D,mBAAmB,EAAE,MAAOpC,MAAM,IAA8B;IAC9D,MAAMqC,UAAU,GAAGtE,gBAAgB,CAACiC,MAAM,CAACa,OAAO,CAAC;IACnD,IAAIyB,aAAqB;IACzB,IAAItC,MAAM,CAACwB,cAAc,KAAK,aAAa,EAAE;MAC3C,IAAI,CAACxB,MAAM,CAACe,eAAe,EAAE;QAC3B,MAAM,IAAIxC,KAAK,CAAC,8BAA8B,CAAC;MACjD;MACA+D,aAAa,GAAGtC,MAAM,CAACe,eAAe;IACxC,CAAC,MAAM;MACL,MAAMH,UAAU,GAAG5C,sBAAsB,CAACgC,MAAM,CAACY,UAAU,CAAC;MAC5D,IAAIA,UAAU,KAAK,IAAI,EAAE,MAAM,IAAIrC,KAAK,CAAC,qBAAqB,CAAC;MAC/D+D,aAAa,GAAG1B,UAAU;IAC5B;IACA,MAAM2B,YAAY,GAChBvC,MAAM,CAACwB,cAAc,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa;IACzE,MAAM5B,GAAG,GAAG,GAAGvB,OAAO,qBAAqBkE,YAAY,IAAIvC,MAAM,CAACmB,QAAQ,IAAIkB,UAAU,IAAIG,kBAAkB,CAACF,aAAa,CAAC,EAAE;IAE/H,OAAOpE,4BAA4B,CAAC;MAClCG,OAAO;MACPoE,aAAa,EACXzC,MAAM,CAACwB,cAAc,KAAK,aAAa,GACnC;QACEa,UAAU;QACVtB,eAAe,EAAEuB,aAAa;QAC9BnB,QAAQ,EAAEnB,MAAM,CAACmB,QAAQ;QACzBuB,QAAQ,EAAE;MACZ,CAAC,GACD;QACEL,UAAU;QACVlB,QAAQ,EAAEnB,MAAM,CAACmB,QAAQ;QACzBuB,QAAQ,EAAE;MACZ,CAAC;MACPd,cAAc,EAAE5B,MAAM,CAAC4B,cAAc;MACrCtB,cAAc,EAAEN,MAAM,CAACM,cAAc;MACrCV;IACF,CAAC,CAAC;EACJ,CAAC;EACD+C,eAAe,EAAE,MAAO3C,MAAM,IAA4B;IACxD,MAAMhB,IAAI,GAAG,MAAMf,SAAS,CAAe;MACzC2D,cAAc,EAAE5B,MAAM,CAAC4B,cAAc;MACrCtB,cAAc,EAAEN,MAAM,CAACM,cAAc;MACrCV,GAAG,EAAE,GAAGvB,OAAO,cAAcmE,kBAAkB,CAC7CxC,MAAM,CAAC4C,cACT,CAAC,SAASJ,kBAAkB,CAACxC,MAAM,CAAC6C,eAAe,CAAC;IACtD,CAAC,CAAC;IACF,OAAO9D,mBAAmB,CAACV,OAAO,EAAEW,IAAI,CAAC;EAC3C,CAAC;EACDe,kBAAkB,EAAGC,MAAM,IAAKD,kBAAkB,CAAC1B,OAAO,EAAE2B,MAAM;AACpE,CAAC,CAAC;;AAEF;AACA,OAAO,MAAM8C,gBAAgB,GAC3BzE,OAA0B,KACA;EAC1B8D,aAAa,EAAE,MAAAA,CAAA,KAAYA,aAAa,CAAC,MAAM/D,cAAc,CAACC,OAAO,CAAC;AACxE,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { createHttpClient } from "./httpClient.js";
|
|
5
|
+
const mocks = vi.hoisted(() => {
|
|
6
|
+
Reflect.set(globalThis, "HotUpdater", {
|
|
7
|
+
SDK_VERSION: "test-sdk-version"
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
fetchCatalog: vi.fn(),
|
|
11
|
+
fetchJSON: vi.fn()
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
vi.mock("./releaseCatalogCache", () => ({
|
|
15
|
+
fetchReleaseCatalogWithCache: mocks.fetchCatalog
|
|
16
|
+
}));
|
|
17
|
+
vi.mock("./fetchJSON", () => ({
|
|
18
|
+
fetchJSON: mocks.fetchJSON
|
|
19
|
+
}));
|
|
20
|
+
const artifact = {
|
|
21
|
+
fileHash: "bundle-hash",
|
|
22
|
+
fileUrl: "/storage/bundle.zip"
|
|
23
|
+
};
|
|
24
|
+
const catalog = {
|
|
25
|
+
catalogId: "server-owned-project",
|
|
26
|
+
catalogHash: `sha256:${"a".repeat(64)}`,
|
|
27
|
+
fallbackPolicy: "BUILTIN_IF_ACTIVE_INELIGIBLE",
|
|
28
|
+
generation: 1,
|
|
29
|
+
releases: [],
|
|
30
|
+
schemaVersion: 1,
|
|
31
|
+
scopeKey: "v1:app-version:server-owned-project:ios:cHJvZHVjdGlvbg"
|
|
32
|
+
};
|
|
33
|
+
describe("private HotUpdater HTTP client", () => {
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
mocks.fetchCatalog.mockResolvedValue(catalog);
|
|
37
|
+
mocks.fetchJSON.mockResolvedValue(artifact);
|
|
38
|
+
});
|
|
39
|
+
it("fetches a catalog without putting its internal identity in the route", async () => {
|
|
40
|
+
const session = await createHttpClient("https://updates.example.com/hot-updater/").createSession();
|
|
41
|
+
await expect(session.fetchReleaseCatalog({
|
|
42
|
+
appVersion: "1.2.0",
|
|
43
|
+
channel: "production",
|
|
44
|
+
fingerprintHash: null,
|
|
45
|
+
platform: "ios",
|
|
46
|
+
updateStrategy: "appVersion"
|
|
47
|
+
})).resolves.toBe(catalog);
|
|
48
|
+
expect(mocks.fetchCatalog).toHaveBeenCalledWith({
|
|
49
|
+
baseURL: "https://updates.example.com/hot-updater",
|
|
50
|
+
expectedScope: {
|
|
51
|
+
channelKey: "cHJvZHVjdGlvbg",
|
|
52
|
+
platform: "ios",
|
|
53
|
+
strategy: "APP_VERSION"
|
|
54
|
+
},
|
|
55
|
+
requestHeaders: undefined,
|
|
56
|
+
requestTimeout: undefined,
|
|
57
|
+
url: "https://updates.example.com/hot-updater/release-catalogs/app-version/ios/cHJvZHVjdGlvbg/1.2.0"
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it("resolves a functional baseURL once per session and captures it for a deferred artifact", async () => {
|
|
61
|
+
const resolveBaseURL = vi.fn().mockResolvedValueOnce("https://first.example.com/hot-updater").mockResolvedValueOnce("https://second.example.com/hot-updater");
|
|
62
|
+
const client = createHttpClient(resolveBaseURL);
|
|
63
|
+
const firstSession = await client.createSession();
|
|
64
|
+
await firstSession.fetchReleaseCatalog({
|
|
65
|
+
appVersion: "1.2.0",
|
|
66
|
+
channel: "production",
|
|
67
|
+
fingerprintHash: null,
|
|
68
|
+
platform: "ios",
|
|
69
|
+
updateStrategy: "appVersion"
|
|
70
|
+
});
|
|
71
|
+
await expect(firstSession.resolveArtifact({
|
|
72
|
+
currentBundleId: "current",
|
|
73
|
+
targetBundleId: "target"
|
|
74
|
+
})).resolves.toEqual({
|
|
75
|
+
...artifact,
|
|
76
|
+
fileUrl: "https://first.example.com/hot-updater/storage/bundle.zip"
|
|
77
|
+
});
|
|
78
|
+
expect(resolveBaseURL).toHaveBeenCalledOnce();
|
|
79
|
+
expect(mocks.fetchJSON).toHaveBeenCalledWith({
|
|
80
|
+
requestHeaders: undefined,
|
|
81
|
+
requestTimeout: undefined,
|
|
82
|
+
url: "https://first.example.com/hot-updater/artifacts/target/from/current"
|
|
83
|
+
});
|
|
84
|
+
await client.createSession();
|
|
85
|
+
expect(resolveBaseURL).toHaveBeenCalledTimes(2);
|
|
86
|
+
});
|
|
87
|
+
it("rejects non-storage relative artifact URLs", async () => {
|
|
88
|
+
mocks.fetchJSON.mockResolvedValue({
|
|
89
|
+
...artifact,
|
|
90
|
+
fileUrl: "/private/bundle.zip"
|
|
91
|
+
});
|
|
92
|
+
const session = await createHttpClient("https://updates.example.com").createSession();
|
|
93
|
+
await expect(session.resolveArtifact({
|
|
94
|
+
currentBundleId: "current",
|
|
95
|
+
targetBundleId: "target"
|
|
96
|
+
})).rejects.toThrow("client-relative storage paths");
|
|
97
|
+
});
|
|
98
|
+
it("requires a functional baseURL to resolve to a non-empty string", async () => {
|
|
99
|
+
await expect(createHttpClient(() => "").createSession()).rejects.toThrow("baseURL function must return a non-empty string");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=httpClient.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","vi","createHttpClient","mocks","hoisted","Reflect","set","globalThis","SDK_VERSION","fetchCatalog","fn","fetchJSON","mock","fetchReleaseCatalogWithCache","artifact","fileHash","fileUrl","catalog","catalogId","catalogHash","repeat","fallbackPolicy","generation","releases","schemaVersion","scopeKey","clearAllMocks","mockResolvedValue","session","createSession","fetchReleaseCatalog","appVersion","channel","fingerprintHash","platform","updateStrategy","resolves","toBe","toHaveBeenCalledWith","baseURL","expectedScope","channelKey","strategy","requestHeaders","undefined","requestTimeout","url","resolveBaseURL","mockResolvedValueOnce","client","firstSession","resolveArtifact","currentBundleId","targetBundleId","toEqual","toHaveBeenCalledOnce","toHaveBeenCalledTimes","rejects","toThrow"],"sourceRoot":"../../src","sources":["httpClient.spec.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { checkForUpdate } from "./checkForUpdate.js";
|
|
4
|
-
import {
|
|
5
|
-
import { addListener, clearCrashHistory, getAppVersion, getBaseURL, getBundleId, getChannel, getCohort, getCrashHistory, getDefaultChannel, getFingerprintHash, getManifest,
|
|
4
|
+
import { createHttpClient } from "./httpClient.js";
|
|
5
|
+
import { addListener, getPublicActiveUpdateState, clearCrashHistory, getAppVersion, getBaseURL, getBundleId, getChannel, getCohort, getCrashHistory, getDefaultChannel, getFingerprintHash, getInstallId, getManifest, getMinimumReleaseId, getReleaseId, isChannelSwitched, notifyAppReady, reload, resetChannel, setCohort, setReloadBehavior, setUser, updateBundle } from "./native.js";
|
|
6
6
|
import { hotUpdaterStore } from "./store.js";
|
|
7
7
|
import { init, wrap } from "./wrap.js";
|
|
8
8
|
export * from "./store.js";
|
|
9
|
-
export { createDefaultResolver } from "./DefaultResolver.js";
|
|
10
9
|
export { extractSignatureFailure, isSignatureVerificationError } from "./types.js";
|
|
11
10
|
/**
|
|
12
11
|
* Register getBaseURL to global objects for use without imports.
|
|
@@ -25,8 +24,6 @@ const registerGlobalGetBaseURL = () => {
|
|
|
25
24
|
|
|
26
25
|
// Call registration immediately on module load
|
|
27
26
|
registerGlobalGetBaseURL();
|
|
28
|
-
const isManualWrapOptions = options => "updateMode" in options && options.updateMode === "manual";
|
|
29
|
-
|
|
30
27
|
/**
|
|
31
28
|
* Creates a HotUpdater client instance with all update management methods.
|
|
32
29
|
* This function is called once on module initialization to create a singleton instance.
|
|
@@ -37,51 +34,29 @@ function createHotUpdaterClient() {
|
|
|
37
34
|
|
|
38
35
|
// Global configuration stored from wrap
|
|
39
36
|
const globalConfig = {
|
|
40
|
-
|
|
37
|
+
client: null
|
|
41
38
|
};
|
|
42
39
|
const createMissingNetworkConfigError = apiName => {
|
|
43
40
|
if (apiName === "init") {
|
|
44
|
-
return new Error(`[HotUpdater]
|
|
41
|
+
return new Error(`[HotUpdater] baseURL must be provided.\n\n` + `Configure HotUpdater before calling update APIs with the standard baseURL setup:\n\n` + ` HotUpdater.init({\n` + ` baseURL: "<your-update-server-url>",\n` + ` });\n\n` + `For manual update flows, visit: https://hot-updater.dev/docs/guides/custom-update`);
|
|
45
42
|
}
|
|
46
43
|
const baseURLExample = ` export default HotUpdater.wrap({\n` + ` baseURL: "<your-update-server-url>",\n` + ` updateStrategy: "appVersion"\n` + ` })(App);\n\n`;
|
|
47
|
-
return new Error(`[HotUpdater]
|
|
44
|
+
return new Error(`[HotUpdater] baseURL must be provided.\n\n` + `Configure HotUpdater.wrap with the standard baseURL setup:\n\n` + baseURLExample + `For manual update flows, use HotUpdater.init() and visit: ` + `https://hot-updater.dev/docs/guides/custom-update`);
|
|
48
45
|
};
|
|
49
46
|
const normalizeOptions = options => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
baseURL,
|
|
54
|
-
...rest
|
|
55
|
-
} = options;
|
|
56
|
-
return {
|
|
57
|
-
...rest,
|
|
58
|
-
resolver: createDefaultResolver(baseURL),
|
|
59
|
-
updateMode: "manual"
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if ("resolver" in options && options.resolver) {
|
|
63
|
-
return {
|
|
64
|
-
...options,
|
|
65
|
-
updateMode: "manual"
|
|
66
|
-
};
|
|
67
|
-
}
|
|
47
|
+
const incoming = options;
|
|
48
|
+
if (incoming.updateMode === "manual") {
|
|
49
|
+
throw new Error('[HotUpdater] HotUpdater.wrap({ updateMode: "manual" }) was removed. ' + "Call HotUpdater.init({ ... }) instead, export your root component " + "directly, and use HotUpdater.checkForUpdate(...) for the manual " + "update flow. See https://hot-updater.dev/docs/guides/custom-update");
|
|
68
50
|
}
|
|
69
|
-
const autoOptions =
|
|
70
|
-
if (
|
|
51
|
+
const autoOptions = incoming;
|
|
52
|
+
if (autoOptions.baseURL) {
|
|
71
53
|
const {
|
|
72
54
|
baseURL,
|
|
73
55
|
...rest
|
|
74
56
|
} = autoOptions;
|
|
75
57
|
return {
|
|
76
58
|
...rest,
|
|
77
|
-
|
|
78
|
-
updateMode: "auto"
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
if ("resolver" in autoOptions && autoOptions.resolver) {
|
|
82
|
-
return {
|
|
83
|
-
...autoOptions,
|
|
84
|
-
updateMode: "auto"
|
|
59
|
+
client: createHttpClient(baseURL)
|
|
85
60
|
};
|
|
86
61
|
}
|
|
87
62
|
throw createMissingNetworkConfigError("wrap");
|
|
@@ -91,23 +66,21 @@ function createHotUpdaterClient() {
|
|
|
91
66
|
updateMode: _updateMode,
|
|
92
67
|
...rest
|
|
93
68
|
} = options;
|
|
94
|
-
if (
|
|
69
|
+
if (rest.baseURL) {
|
|
95
70
|
const {
|
|
96
71
|
baseURL,
|
|
97
72
|
...baseURLRest
|
|
98
73
|
} = rest;
|
|
99
74
|
return {
|
|
100
75
|
...baseURLRest,
|
|
101
|
-
|
|
76
|
+
client: createHttpClient(baseURL)
|
|
102
77
|
};
|
|
103
78
|
}
|
|
104
|
-
if ("resolver" in rest && rest.resolver) {
|
|
105
|
-
return rest;
|
|
106
|
-
}
|
|
107
79
|
throw createMissingNetworkConfigError("init");
|
|
108
80
|
};
|
|
109
81
|
const configureGlobal = (normalizedOptions, options) => {
|
|
110
|
-
globalConfig.
|
|
82
|
+
globalConfig.analytics = normalizedOptions.analytics;
|
|
83
|
+
globalConfig.client = normalizedOptions.client;
|
|
111
84
|
globalConfig.requestHeaders = options.requestHeaders;
|
|
112
85
|
globalConfig.requestTimeout = options.requestTimeout;
|
|
113
86
|
globalConfig.onError = options.onError;
|
|
@@ -119,11 +92,11 @@ function createHotUpdaterClient() {
|
|
|
119
92
|
}
|
|
120
93
|
configurationAPI ??= nextAPI;
|
|
121
94
|
};
|
|
122
|
-
const
|
|
123
|
-
if (!globalConfig.
|
|
95
|
+
const ensureGlobalClient = methodName => {
|
|
96
|
+
if (!globalConfig.client) {
|
|
124
97
|
throw new Error(`[HotUpdater] ${methodName} requires HotUpdater.wrap() or HotUpdater.init() to be used.\n\n` + `To fix this issue, configure HotUpdater before calling ${methodName}:\n\n` + `Option 1: With HotUpdater.wrap()\n` + ` export default HotUpdater.wrap({\n` + ` baseURL: "<your-update-server-url>",\n` + ` updateStrategy: "appVersion"\n` + ` })(App);\n\n` + `Option 2: With HotUpdater.init() for custom runtimes\n` + ` HotUpdater.init({\n` + ` baseURL: "<your-update-server-url>",\n` + ` });\n\n` + `For manual update flows, visit: https://hot-updater.dev/docs/guides/custom-update`);
|
|
125
98
|
}
|
|
126
|
-
return globalConfig.
|
|
99
|
+
return globalConfig.client;
|
|
127
100
|
};
|
|
128
101
|
return {
|
|
129
102
|
/**
|
|
@@ -144,7 +117,7 @@ function createHotUpdaterClient() {
|
|
|
144
117
|
* baseURL: "<your-update-server-url>",
|
|
145
118
|
* updateStrategy: "appVersion",
|
|
146
119
|
* requestHeaders: {
|
|
147
|
-
* "
|
|
120
|
+
* "x-api-key": "<your-api-key>",
|
|
148
121
|
* },
|
|
149
122
|
* })(App);
|
|
150
123
|
* ```
|
|
@@ -159,8 +132,7 @@ function createHotUpdaterClient() {
|
|
|
159
132
|
* Initializes HotUpdater without wrapping a React component.
|
|
160
133
|
*
|
|
161
134
|
* Use this for manual update flows in runtimes where a root component HOC
|
|
162
|
-
* is not convenient.
|
|
163
|
-
* `HotUpdater.wrap({ updateMode: "manual" })(App)` usage with this API.
|
|
135
|
+
* is not convenient. Use this instead of wrapping the root component.
|
|
164
136
|
*
|
|
165
137
|
* @example
|
|
166
138
|
* ```tsx
|
|
@@ -214,14 +186,16 @@ function createHotUpdaterClient() {
|
|
|
214
186
|
* Fetches the current app version.
|
|
215
187
|
*/
|
|
216
188
|
getAppVersion,
|
|
189
|
+
/** Reads the active and stable Release/Bundle state. */
|
|
190
|
+
getActiveUpdateState: async () => getPublicActiveUpdateState(),
|
|
217
191
|
/**
|
|
218
192
|
* Fetches the current bundle ID of the app.
|
|
219
193
|
*/
|
|
220
194
|
getBundleId,
|
|
221
|
-
/**
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
195
|
+
/** Preferred Release-catalog name for the build-time UUIDv7 floor. */
|
|
196
|
+
getMinimumReleaseId,
|
|
197
|
+
/** Returns the active Release identity, or null for BUILTIN/legacy state. */
|
|
198
|
+
getReleaseId,
|
|
225
199
|
/**
|
|
226
200
|
* Fetches the current manifest for the active bundle.
|
|
227
201
|
*/
|
|
@@ -290,18 +264,17 @@ function createHotUpdaterClient() {
|
|
|
290
264
|
* Manually checks for updates.
|
|
291
265
|
*
|
|
292
266
|
* @param {Object} config - Update check configuration
|
|
293
|
-
* @param {string} config.source - Update server URL
|
|
294
267
|
* @param {string} [config.channel] - Optional channel override for this update check
|
|
295
268
|
* @param {Record<string, string>} [config.requestHeaders] - Request headers
|
|
296
269
|
*
|
|
297
|
-
* @returns {Promise<
|
|
270
|
+
* @returns {Promise<CheckForUpdateResult | null>} Update information or null if up to date
|
|
298
271
|
*
|
|
299
272
|
* @example
|
|
300
273
|
* ```ts
|
|
301
274
|
* const updateInfo = await HotUpdater.checkForUpdate({
|
|
302
|
-
*
|
|
275
|
+
* updateStrategy: "appVersion",
|
|
303
276
|
* requestHeaders: {
|
|
304
|
-
*
|
|
277
|
+
* "x-api-key": "<your-api-key>",
|
|
305
278
|
* },
|
|
306
279
|
* });
|
|
307
280
|
*
|
|
@@ -310,17 +283,18 @@ function createHotUpdaterClient() {
|
|
|
310
283
|
* return;
|
|
311
284
|
* }
|
|
312
285
|
*
|
|
313
|
-
* await
|
|
286
|
+
* await updateInfo.updateBundle();
|
|
314
287
|
* if (updateInfo.shouldForceUpdate) {
|
|
315
288
|
* await HotUpdater.reload();
|
|
316
289
|
* }
|
|
317
290
|
* ```
|
|
318
291
|
*/
|
|
319
292
|
checkForUpdate: config => {
|
|
320
|
-
const
|
|
293
|
+
const client = ensureGlobalClient("checkForUpdate");
|
|
321
294
|
const mergedConfig = {
|
|
322
295
|
...config,
|
|
323
|
-
|
|
296
|
+
analytics: globalConfig.analytics,
|
|
297
|
+
client,
|
|
324
298
|
requestHeaders: {
|
|
325
299
|
...globalConfig.requestHeaders,
|
|
326
300
|
...config.requestHeaders
|
|
@@ -342,9 +316,9 @@ function createHotUpdaterClient() {
|
|
|
342
316
|
* @example
|
|
343
317
|
* ```ts
|
|
344
318
|
* const updateInfo = await HotUpdater.checkForUpdate({
|
|
345
|
-
*
|
|
319
|
+
* updateStrategy: "appVersion",
|
|
346
320
|
* requestHeaders: {
|
|
347
|
-
*
|
|
321
|
+
* "x-api-key": "<your-api-key>",
|
|
348
322
|
* },
|
|
349
323
|
* });
|
|
350
324
|
*
|
|
@@ -354,17 +328,14 @@ function createHotUpdaterClient() {
|
|
|
354
328
|
* };
|
|
355
329
|
* }
|
|
356
330
|
*
|
|
357
|
-
* await
|
|
358
|
-
* bundleId: updateInfo.id,
|
|
359
|
-
* fileUrl: updateInfo.fileUrl
|
|
360
|
-
* });
|
|
331
|
+
* await updateInfo.updateBundle();
|
|
361
332
|
* if (updateInfo.shouldForceUpdate) {
|
|
362
333
|
* await HotUpdater.reload();
|
|
363
334
|
* }
|
|
364
335
|
* ```
|
|
365
336
|
*/
|
|
366
337
|
updateBundle: params => {
|
|
367
|
-
|
|
338
|
+
ensureGlobalClient("updateBundle");
|
|
368
339
|
return updateBundle(params);
|
|
369
340
|
},
|
|
370
341
|
/**
|
|
@@ -398,6 +369,18 @@ function createHotUpdaterClient() {
|
|
|
398
369
|
* ```
|
|
399
370
|
*/
|
|
400
371
|
getFingerprintHash,
|
|
372
|
+
/**
|
|
373
|
+
* Fetches the persisted install id for this app installation.
|
|
374
|
+
*/
|
|
375
|
+
getInstallId,
|
|
376
|
+
/**
|
|
377
|
+
* Persists nullable user identity fields associated with this installation.
|
|
378
|
+
*/
|
|
379
|
+
setUser,
|
|
380
|
+
/**
|
|
381
|
+
* Reads the native launch report for the current process.
|
|
382
|
+
*/
|
|
383
|
+
notifyAppReady,
|
|
401
384
|
/**
|
|
402
385
|
* Gets the list of bundle IDs that have been marked as crashed.
|
|
403
386
|
* These bundles will be rejected if attempted to install again.
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","
|
|
1
|
+
{"version":3,"names":["checkForUpdate","createHttpClient","addListener","getPublicActiveUpdateState","clearCrashHistory","getAppVersion","getBaseURL","getBundleId","getChannel","getCohort","getCrashHistory","getDefaultChannel","getFingerprintHash","getInstallId","getManifest","getMinimumReleaseId","getReleaseId","isChannelSwitched","notifyAppReady","reload","resetChannel","setCohort","setReloadBehavior","setUser","updateBundle","hotUpdaterStore","init","wrap","extractSignatureFailure","isSignatureVerificationError","registerGlobalGetBaseURL","fn","globalThis","HotUpdaterGetBaseURL","createHotUpdaterClient","configurationAPI","mixedConfigurationReported","globalConfig","client","createMissingNetworkConfigError","apiName","Error","baseURLExample","normalizeOptions","options","incoming","updateMode","autoOptions","baseURL","rest","normalizeInitOptions","_updateMode","baseURLRest","configureGlobal","normalizedOptions","analytics","requestHeaders","requestTimeout","onError","reportMixedConfiguration","nextAPI","console","error","ensureGlobalClient","methodName","isUpdateDownloaded","getSnapshot","getActiveUpdateState","config","mergedConfig","params","ok","setState","artifactType","details","downloadedBytes","undefined","progress","totalBytes","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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;AACA;AACA;AACA;IACI2C,kBAAkB,EAAEA,CAAA,KAAMxC,eAAe,CAACyC,WAAW,CAAC,CAAC,CAACD,kBAAkB;IAE1E;AACJ;AACA;IACI5D,aAAa;IAEb;IACA8D,oBAAoB,EAAE,MAAAA,CAAA,KAAYhE,0BAA0B,CAAC,CAAC;IAE9D;AACJ;AACA;IACII,WAAW;IAEX;IACAQ,mBAAmB;IAEnB;IACAC,YAAY;IAEZ;AACJ;AACA;IACIF,WAAW;IAEX;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIN,UAAU;IAEV;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIG,iBAAiB;IAEjB;AACJ;AACA;AACA;AACA;IACIM,iBAAiB;IAEjB;AACJ;AACA;AACA;IACII,SAAS;IAET;AACJ;AACA;IACIZ,SAAS;IAET;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIP,WAAW;IAEX;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIF,cAAc,EAAGoE,MAA6B,IAAK;MACjD,MAAM9B,MAAM,GAAGyB,kBAAkB,CAAC,gBAAgB,CAAC;MAEnD,MAAMM,YAA2C,GAAG;QAClD,GAAGD,MAAM;QACTb,SAAS,EAAElB,YAAY,CAACkB,SAAS;QACjCjB,MAAM;QACNkB,cAAc,EAAE;UACd,GAAGnB,YAAY,CAACmB,cAAc;UAC9B,GAAGY,MAAM,CAACZ;QACZ,CAAC;QACDC,cAAc,EAAEW,MAAM,CAACX,cAAc,IAAIpB,YAAY,CAACoB,cAAc;QACpEC,OAAO,EAAEU,MAAM,CAACV,OAAO,IAAIrB,YAAY,CAACqB;MAC1C,CAAC;MAED,OAAO1D,cAAc,CAACqE,YAAY,CAAC;IACrC,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI7C,YAAY,EAAG8C,MAAoB,IAAK;MACtCP,kBAAkB,CAAC,cAAc,CAAC;MAClC,OAAOvC,YAAY,CAAC8C,MAAM,CAAC;IAC7B,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIlD,YAAY,EAAE,MAAAA,CAAA,KAAY;MACxB,MAAMmD,EAAE,GAAG,MAAMnD,YAAY,CAAC,CAAC;MAC/B,IAAImD,EAAE,EAAE;QACN9C,eAAe,CAAC+C,QAAQ,CAAC;UACvBC,YAAY,EAAE,IAAI;UAClBC,OAAO,EAAE,IAAI;UACbC,eAAe,EAAEC,SAAS;UAC1BX,kBAAkB,EAAE,KAAK;UACzBY,QAAQ,EAAE,CAAC;UACXC,UAAU,EAAEF;QACd,CAAC,CAAC;MACJ;MACA,OAAOL,EAAE;IACX,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI3D,kBAAkB;IAElB;AACJ;AACA;IACIC,YAAY;IAEZ;AACJ;AACA;IACIU,OAAO;IAEP;AACJ;AACA;IACIL,cAAc;IAEd;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIR,eAAe;IAEf;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIN;EACF,CAAC;AACH;AASA,OAAO,MAAM2E,UAA4B,GAAG7C,sBAAsB,CAAC,CAAC","ignoreList":[]}
|