@take-out/native-hot-update 0.0.36
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/README.md +171 -0
- package/dist/cjs/createHotUpdater.cjs +183 -0
- package/dist/cjs/createHotUpdater.js +146 -0
- package/dist/cjs/createHotUpdater.js.map +6 -0
- package/dist/cjs/createHotUpdater.native.js +213 -0
- package/dist/cjs/createHotUpdater.native.js.map +1 -0
- package/dist/cjs/index.cjs +26 -0
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/index.native.js +29 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/mmkv.cjs +32 -0
- package/dist/cjs/mmkv.js +27 -0
- package/dist/cjs/mmkv.js.map +6 -0
- package/dist/cjs/mmkv.native.js +41 -0
- package/dist/cjs/mmkv.native.js.map +1 -0
- package/dist/cjs/types.cjs +16 -0
- package/dist/cjs/types.js +14 -0
- package/dist/cjs/types.js.map +6 -0
- package/dist/cjs/types.native.js +19 -0
- package/dist/cjs/types.native.js.map +1 -0
- package/dist/esm/createHotUpdater.js +129 -0
- package/dist/esm/createHotUpdater.js.map +6 -0
- package/dist/esm/createHotUpdater.mjs +149 -0
- package/dist/esm/createHotUpdater.mjs.map +1 -0
- package/dist/esm/createHotUpdater.native.js +176 -0
- package/dist/esm/createHotUpdater.native.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +3 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/mmkv.js +11 -0
- package/dist/esm/mmkv.js.map +6 -0
- package/dist/esm/mmkv.mjs +9 -0
- package/dist/esm/mmkv.mjs.map +1 -0
- package/dist/esm/mmkv.native.js +15 -0
- package/dist/esm/mmkv.native.js.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +6 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/types.mjs.map +1 -0
- package/dist/esm/types.native.js +2 -0
- package/dist/esm/types.native.js.map +1 -0
- package/package.json +63 -0
- package/src/createHotUpdater.ts +240 -0
- package/src/index.ts +2 -0
- package/src/mmkv.ts +20 -0
- package/src/types.ts +62 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { getUpdateSource, HotUpdater, useHotUpdaterStore } from "@hot-updater/react-native";
|
|
2
|
+
import * as Application from "expo-application";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { Alert } from "react-native-web";
|
|
5
|
+
const INITIAL_OTA_ID = "00000000-0000-0000-0000-000000000000",
|
|
6
|
+
BUNDLE_ID_KEY_PREFIX = "hotUpdater.bundleId",
|
|
7
|
+
PRE_RELEASE_BUNDLE_ID_KEY = "hotUpdater.preReleaseBundleId";
|
|
8
|
+
function createHotUpdater(config) {
|
|
9
|
+
const {
|
|
10
|
+
serverUrl,
|
|
11
|
+
storage,
|
|
12
|
+
updateStrategy = "appVersion"
|
|
13
|
+
} = config;
|
|
14
|
+
let isUpdatePending = !1;
|
|
15
|
+
const getAppliedOta = () => {
|
|
16
|
+
const id = HotUpdater.getBundleId();
|
|
17
|
+
return id === INITIAL_OTA_ID || id === HotUpdater.getMinBundleId() ? null : id;
|
|
18
|
+
},
|
|
19
|
+
getShortOtaId = () => {
|
|
20
|
+
const fullId = getAppliedOta();
|
|
21
|
+
return fullId ? fullId.slice(24) : null;
|
|
22
|
+
},
|
|
23
|
+
getIsUpdatePending = () => isUpdatePending,
|
|
24
|
+
getPreReleaseBundleId = () => storage.get(PRE_RELEASE_BUNDLE_ID_KEY),
|
|
25
|
+
handleUpdateDownloaded = (id, options = {}) => {
|
|
26
|
+
const appVersion = Application.nativeApplicationVersion;
|
|
27
|
+
appVersion && storage.set(`${BUNDLE_ID_KEY_PREFIX}.${appVersion}`, id), options.isPreRelease ? storage.set(PRE_RELEASE_BUNDLE_ID_KEY, id) : storage.delete(PRE_RELEASE_BUNDLE_ID_KEY), isUpdatePending = !0;
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
useOtaUpdater: (options = {}) => {
|
|
31
|
+
const {
|
|
32
|
+
enabled = !0,
|
|
33
|
+
onUpdateDownloaded: onUpdateDownloadedCallback,
|
|
34
|
+
onError
|
|
35
|
+
} = options,
|
|
36
|
+
progress = useHotUpdaterStore(state => state.progress),
|
|
37
|
+
isUpdating = progress > 0.01,
|
|
38
|
+
[isUserClearedForAccess, setIsUserClearedForAccess] = useState(!1),
|
|
39
|
+
isUserClearedForAccessRef = useRef(isUserClearedForAccess);
|
|
40
|
+
return isUserClearedForAccessRef.current = isUserClearedForAccess, useEffect(() => {
|
|
41
|
+
if (!isUpdating) {
|
|
42
|
+
const timer = setTimeout(() => {
|
|
43
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
44
|
+
}, 5e3);
|
|
45
|
+
return () => clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
}, [isUpdating]), useEffect(() => {
|
|
48
|
+
const timer = setTimeout(() => {
|
|
49
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
50
|
+
}, 2e4);
|
|
51
|
+
return () => clearTimeout(timer);
|
|
52
|
+
}, []), useEffect(() => {
|
|
53
|
+
let shouldContinue = !0;
|
|
54
|
+
return (async () => {
|
|
55
|
+
try {
|
|
56
|
+
if (!enabled) {
|
|
57
|
+
setIsUserClearedForAccess(!0);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!shouldContinue) return;
|
|
61
|
+
const updateInfo = await HotUpdater.checkForUpdate({
|
|
62
|
+
source: getUpdateSource(serverUrl, {
|
|
63
|
+
updateStrategy
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
if (!updateInfo) {
|
|
67
|
+
setIsUserClearedForAccess(!0);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!shouldContinue) return;
|
|
71
|
+
if (updateInfo.status === "ROLLBACK") {
|
|
72
|
+
const preReleaseBundleId = getPreReleaseBundleId(),
|
|
73
|
+
currentBundleId = HotUpdater.getBundleId();
|
|
74
|
+
if (preReleaseBundleId && preReleaseBundleId === currentBundleId && currentBundleId > updateInfo.id) {
|
|
75
|
+
Alert.alert("Update Skipped", "Skipped rollback because you are using a newer pre-release bundle."), setIsUserClearedForAccess(!0);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (updateInfo.shouldForceUpdate || setIsUserClearedForAccess(!0), !shouldContinue) return;
|
|
80
|
+
await updateInfo.updateBundle(), handleUpdateDownloaded(updateInfo.id);
|
|
81
|
+
const info = {
|
|
82
|
+
id: updateInfo.id,
|
|
83
|
+
isCriticalUpdate: updateInfo.shouldForceUpdate,
|
|
84
|
+
fileUrl: updateInfo.fileUrl,
|
|
85
|
+
message: updateInfo.message
|
|
86
|
+
};
|
|
87
|
+
if (onUpdateDownloadedCallback?.(info), !shouldContinue) return;
|
|
88
|
+
if (updateInfo.shouldForceUpdate) {
|
|
89
|
+
if (!isUserClearedForAccessRef.current) {
|
|
90
|
+
HotUpdater.reload();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
Alert.alert("Update Downloaded", "An important update has been downloaded. Reload now to apply it?", [{
|
|
94
|
+
text: "Later",
|
|
95
|
+
style: "cancel"
|
|
96
|
+
}, {
|
|
97
|
+
text: "Reload Now",
|
|
98
|
+
onPress: () => HotUpdater.reload()
|
|
99
|
+
}]);
|
|
100
|
+
}
|
|
101
|
+
} catch (error) {
|
|
102
|
+
onError?.(error), setIsUserClearedForAccess(!0);
|
|
103
|
+
} finally {
|
|
104
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
105
|
+
}
|
|
106
|
+
})(), () => {
|
|
107
|
+
shouldContinue = !1;
|
|
108
|
+
};
|
|
109
|
+
}, [enabled, onUpdateDownloadedCallback, onError]), {
|
|
110
|
+
userClearedForAccess: isUserClearedForAccess,
|
|
111
|
+
progress,
|
|
112
|
+
isUpdatePending: getIsUpdatePending()
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
checkForUpdate: async (options = {}) => {
|
|
116
|
+
const {
|
|
117
|
+
channel,
|
|
118
|
+
isPreRelease = !1
|
|
119
|
+
} = options,
|
|
120
|
+
updateSource = getUpdateSource(serverUrl, {
|
|
121
|
+
updateStrategy
|
|
122
|
+
}),
|
|
123
|
+
finalSource = channel ? params => updateSource({
|
|
124
|
+
...params,
|
|
125
|
+
channel
|
|
126
|
+
}) : updateSource,
|
|
127
|
+
updateInfo = await HotUpdater.checkForUpdate({
|
|
128
|
+
source: finalSource
|
|
129
|
+
});
|
|
130
|
+
return updateInfo ? (await updateInfo.updateBundle(), handleUpdateDownloaded(updateInfo.id, {
|
|
131
|
+
isPreRelease
|
|
132
|
+
}), {
|
|
133
|
+
id: updateInfo.id,
|
|
134
|
+
isCriticalUpdate: updateInfo.shouldForceUpdate,
|
|
135
|
+
fileUrl: updateInfo.fileUrl,
|
|
136
|
+
message: updateInfo.message
|
|
137
|
+
}) : null;
|
|
138
|
+
},
|
|
139
|
+
getAppliedOta,
|
|
140
|
+
getShortOtaId,
|
|
141
|
+
getIsUpdatePending,
|
|
142
|
+
reload: () => HotUpdater.reload(),
|
|
143
|
+
getBundleId: () => HotUpdater.getBundleId(),
|
|
144
|
+
getMinBundleId: () => HotUpdater.getMinBundleId(),
|
|
145
|
+
getChannel: () => HotUpdater.getChannel()
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export { createHotUpdater };
|
|
149
|
+
//# sourceMappingURL=createHotUpdater.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getUpdateSource","HotUpdater","useHotUpdaterStore","Application","useEffect","useRef","useState","Alert","INITIAL_OTA_ID","BUNDLE_ID_KEY_PREFIX","PRE_RELEASE_BUNDLE_ID_KEY","createHotUpdater","config","serverUrl","storage","updateStrategy","isUpdatePending","getAppliedOta","id","getBundleId","getMinBundleId","getShortOtaId","fullId","slice","getIsUpdatePending","getPreReleaseBundleId","get","handleUpdateDownloaded","options","appVersion","nativeApplicationVersion","set","isPreRelease","delete","useOtaUpdater","enabled","onUpdateDownloaded","onUpdateDownloadedCallback","onError","progress","state","isUpdating","isUserClearedForAccess","setIsUserClearedForAccess","isUserClearedForAccessRef","current","timer","setTimeout","clearTimeout","shouldContinue","updateInfo","checkForUpdate","source","status","preReleaseBundleId","currentBundleId","alert","shouldForceUpdate","updateBundle","info","isCriticalUpdate","fileUrl","message","reload","text","style","onPress","error","userClearedForAccess","channel","updateSource","finalSource","params","getChannel"],"sources":["../../src/createHotUpdater.ts"],"sourcesContent":[null],"mappings":"AAAA,SACEA,eAAA,EACAC,UAAA,EACAC,kBAAA,QACK;AACP,YAAYC,WAAA,MAAiB;AAC7B,SAASC,SAAA,EAAWC,MAAA,EAAQC,QAAA,QAAgB;AAC5C,SAASC,KAAA,QAAa;AAItB,MAAMC,cAAA,GAAiB;EACjBC,oBAAA,GAAuB;EACvBC,yBAAA,GAA4B;AAE3B,SAASC,iBAAiBC,MAAA,EAA8C;EAC7E,MAAM;IAAEC,SAAA;IAAWC,OAAA;IAASC,cAAA,GAAiB;EAAa,IAAIH,MAAA;EAE9D,IAAII,eAAA,GAAkB;EAEtB,MAAMC,aAAA,GAAgBA,CAAA,KAAqB;MACzC,MAAMC,EAAA,GAAKjB,UAAA,CAAWkB,WAAA,CAAY;MAElC,OADID,EAAA,KAAOV,cAAA,IACPU,EAAA,KAAOjB,UAAA,CAAWmB,cAAA,CAAe,IAAU,OACxCF,EAAA;IACT;IAEMG,aAAA,GAAgBA,CAAA,KAAqB;MACzC,MAAMC,MAAA,GAASL,aAAA,CAAc;MAC7B,OAAOK,MAAA,GAASA,MAAA,CAAOC,KAAA,CAAM,EAAE,IAAI;IACrC;IAEMC,kBAAA,GAAqBA,CAAA,KAClBR,eAAA;IAGHS,qBAAA,GAAwBA,CAAA,KACrBX,OAAA,CAAQY,GAAA,CAAIhB,yBAAyB;IAGxCiB,sBAAA,GAAyBA,CAC7BT,EAAA,EACAU,OAAA,GAAsC,CAAC,MACpC;MACH,MAAMC,UAAA,GAAa1B,WAAA,CAAY2B,wBAAA;MAC3BD,UAAA,IACFf,OAAA,CAAQiB,GAAA,CAAI,GAAGtB,oBAAoB,IAAIoB,UAAU,IAAIX,EAAE,GAGrDU,OAAA,CAAQI,YAAA,GACVlB,OAAA,CAAQiB,GAAA,CAAIrB,yBAAA,EAA2BQ,EAAE,IAEzCJ,OAAA,CAAQmB,MAAA,CAAOvB,yBAAyB,GAG1CM,eAAA,GAAkB;IACpB;EA4KA,OAAO;IACLkB,aAAA,EA3KoBA,CACpBN,OAAA,GAII,CAAC,MACF;MACH,MAAM;UACJO,OAAA,GAAU;UACVC,kBAAA,EAAoBC,0BAAA;UACpBC;QACF,IAAIV,OAAA;QAEEW,QAAA,GAAWrC,kBAAA,CAAoBsC,KAAA,IAAUA,KAAA,CAAMD,QAAQ;QACvDE,UAAA,GAAaF,QAAA,GAAW;QAExB,CAACG,sBAAA,EAAwBC,yBAAyB,IAAIrC,QAAA,CAAS,EAAK;QACpEsC,yBAAA,GAA4BvC,MAAA,CAAOqC,sBAAsB;MAC/D,OAAAE,yBAAA,CAA0BC,OAAA,GAAUH,sBAAA,EAGpCtC,SAAA,CAAU,MAAM;QACd,IAAI,CAACqC,UAAA,EAAY;UACf,MAAMK,KAAA,GAAQC,UAAA,CAAW,MAAM;YACxBH,yBAAA,CAA0BC,OAAA,IAC7BF,yBAAA,CAA0B,EAAI;UAElC,GAAG,GAAI;UACP,OAAO,MAAMK,YAAA,CAAaF,KAAK;QACjC;MACF,GAAG,CAACL,UAAU,CAAC,GAGfrC,SAAA,CAAU,MAAM;QACd,MAAM0C,KAAA,GAAQC,UAAA,CAAW,MAAM;UACxBH,yBAAA,CAA0BC,OAAA,IAC7BF,yBAAA,CAA0B,EAAI;QAElC,GAAG,GAAK;QACR,OAAO,MAAMK,YAAA,CAAaF,KAAK;MACjC,GAAG,EAAE,GAGL1C,SAAA,CAAU,MAAM;QACd,IAAI6C,cAAA,GAAiB;QAEpB,QAAC,YAAY;UACZ,IAAI;YACF,IAAI,CAACd,OAAA,EAAS;cACZQ,yBAAA,CAA0B,EAAI;cAC9B;YACF;YAEA,IAAI,CAACM,cAAA,EAAgB;YAErB,MAAMC,UAAA,GAAa,MAAMjD,UAAA,CAAWkD,cAAA,CAAe;cACjDC,MAAA,EAAQpD,eAAA,CAAgBa,SAAA,EAAW;gBAAEE;cAAe,CAAC;YACvD,CAAC;YAED,IAAI,CAACmC,UAAA,EAAY;cACfP,yBAAA,CAA0B,EAAI;cAC9B;YACF;YAEA,IAAI,CAACM,cAAA,EAAgB;YAGrB,IAAIC,UAAA,CAAWG,MAAA,KAAW,YAAY;cACpC,MAAMC,kBAAA,GAAqB7B,qBAAA,CAAsB;gBAC3C8B,eAAA,GAAkBtD,UAAA,CAAWkB,WAAA,CAAY;cAE/C,IACEmC,kBAAA,IACAA,kBAAA,KAAuBC,eAAA,IACvBA,eAAA,GAAkBL,UAAA,CAAWhC,EAAA,EAC7B;gBACAX,KAAA,CAAMiD,KAAA,CACJ,kBACA,oEACF,GACAb,yBAAA,CAA0B,EAAI;gBAC9B;cACF;YACF;YAMA,IAJKO,UAAA,CAAWO,iBAAA,IACdd,yBAAA,CAA0B,EAAI,GAG5B,CAACM,cAAA,EAAgB;YAErB,MAAMC,UAAA,CAAWQ,YAAA,CAAa,GAC9B/B,sBAAA,CAAuBuB,UAAA,CAAWhC,EAAE;YAEpC,MAAMyC,IAAA,GAAmB;cACvBzC,EAAA,EAAIgC,UAAA,CAAWhC,EAAA;cACf0C,gBAAA,EAAkBV,UAAA,CAAWO,iBAAA;cAC7BI,OAAA,EAASX,UAAA,CAAWW,OAAA;cACpBC,OAAA,EAASZ,UAAA,CAAWY;YACtB;YAGA,IAFAzB,0BAAA,GAA6BsB,IAAI,GAE7B,CAACV,cAAA,EAAgB;YAErB,IAAIC,UAAA,CAAWO,iBAAA,EAAmB;cAChC,IAAI,CAACb,yBAAA,CAA0BC,OAAA,EAAS;gBACtC5C,UAAA,CAAW8D,MAAA,CAAO;gBAClB;cACF;cACAxD,KAAA,CAAMiD,KAAA,CACJ,qBACA,oEACA,CACE;gBAAEQ,IAAA,EAAM;gBAASC,KAAA,EAAO;cAAS,GACjC;gBAAED,IAAA,EAAM;gBAAcE,OAAA,EAASA,CAAA,KAAMjE,UAAA,CAAW8D,MAAA,CAAO;cAAE,EAE7D;YACF;UACF,SAASI,KAAA,EAAO;YACd7B,OAAA,GAAU6B,KAAK,GACfxB,yBAAA,CAA0B,EAAI;UAChC,UAAE;YACKC,yBAAA,CAA0BC,OAAA,IAC7BF,yBAAA,CAA0B,EAAI;UAElC;QACF,GAAG,GAEI,MAAM;UACXM,cAAA,GAAiB;QACnB;MACF,GAAG,CAACd,OAAA,EAASE,0BAAA,EAA4BC,OAAO,CAAC,GAE1C;QACL8B,oBAAA,EAAsB1B,sBAAA;QACtBH,QAAA;QACAvB,eAAA,EAAiBQ,kBAAA,CAAmB;MACtC;IACF;IAkCE2B,cAAA,EAhCqB,MAAAA,CACrBvB,OAAA,GAAwD,CAAC,MACtD;MACH,MAAM;UAAEyC,OAAA;UAASrC,YAAA,GAAe;QAAM,IAAIJ,OAAA;QAEpC0C,YAAA,GAAetE,eAAA,CAAgBa,SAAA,EAAW;UAAEE;QAAe,CAAC;QAE5DwD,WAAA,GAAcF,OAAA,GACfG,MAAA,IAAgBF,YAAA,CAAa;UAAE,GAAGE,MAAA;UAAQH;QAAQ,CAAC,IACpDC,YAAA;QAEEpB,UAAA,GAAa,MAAMjD,UAAA,CAAWkD,cAAA,CAAe;UACjDC,MAAA,EAAQmB;QACV,CAAC;MAED,OAAIrB,UAAA,IACF,MAAMA,UAAA,CAAWQ,YAAA,CAAa,GAC9B/B,sBAAA,CAAuBuB,UAAA,CAAWhC,EAAA,EAAI;QAAEc;MAAa,CAAC,GAE/C;QACLd,EAAA,EAAIgC,UAAA,CAAWhC,EAAA;QACf0C,gBAAA,EAAkBV,UAAA,CAAWO,iBAAA;QAC7BI,OAAA,EAASX,UAAA,CAAWW,OAAA;QACpBC,OAAA,EAASZ,UAAA,CAAWY;MACtB,KAGK;IACT;IAKE7C,aAAA;IACAI,aAAA;IACAG,kBAAA;IACAuC,MAAA,EAAQA,CAAA,KAAM9D,UAAA,CAAW8D,MAAA,CAAO;IAChC5C,WAAA,EAAaA,CAAA,KAAMlB,UAAA,CAAWkB,WAAA,CAAY;IAC1CC,cAAA,EAAgBA,CAAA,KAAMnB,UAAA,CAAWmB,cAAA,CAAe;IAChDqD,UAAA,EAAYA,CAAA,KAAMxE,UAAA,CAAWwE,UAAA,CAAW;EAC1C;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { getUpdateSource, HotUpdater, useHotUpdaterStore } from "@hot-updater/react-native";
|
|
2
|
+
import * as Application from "expo-application";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { Alert } from "react-native";
|
|
5
|
+
var INITIAL_OTA_ID = "00000000-0000-0000-0000-000000000000",
|
|
6
|
+
BUNDLE_ID_KEY_PREFIX = "hotUpdater.bundleId",
|
|
7
|
+
PRE_RELEASE_BUNDLE_ID_KEY = "hotUpdater.preReleaseBundleId";
|
|
8
|
+
function createHotUpdater(config) {
|
|
9
|
+
var {
|
|
10
|
+
serverUrl,
|
|
11
|
+
storage,
|
|
12
|
+
updateStrategy = "appVersion"
|
|
13
|
+
} = config,
|
|
14
|
+
isUpdatePending = !1,
|
|
15
|
+
getAppliedOta = function () {
|
|
16
|
+
var id = HotUpdater.getBundleId();
|
|
17
|
+
return id === INITIAL_OTA_ID || id === HotUpdater.getMinBundleId() ? null : id;
|
|
18
|
+
},
|
|
19
|
+
getShortOtaId = function () {
|
|
20
|
+
var fullId = getAppliedOta();
|
|
21
|
+
return fullId ? fullId.slice(24) : null;
|
|
22
|
+
},
|
|
23
|
+
getIsUpdatePending = function () {
|
|
24
|
+
return isUpdatePending;
|
|
25
|
+
},
|
|
26
|
+
getPreReleaseBundleId = function () {
|
|
27
|
+
return storage.get(PRE_RELEASE_BUNDLE_ID_KEY);
|
|
28
|
+
},
|
|
29
|
+
handleUpdateDownloaded = function (id) {
|
|
30
|
+
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {},
|
|
31
|
+
appVersion = Application.nativeApplicationVersion;
|
|
32
|
+
appVersion && storage.set(`${BUNDLE_ID_KEY_PREFIX}.${appVersion}`, id), options.isPreRelease ? storage.set(PRE_RELEASE_BUNDLE_ID_KEY, id) : storage.delete(PRE_RELEASE_BUNDLE_ID_KEY), isUpdatePending = !0;
|
|
33
|
+
},
|
|
34
|
+
useOtaUpdater = function () {
|
|
35
|
+
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
|
|
36
|
+
{
|
|
37
|
+
enabled = !0,
|
|
38
|
+
onUpdateDownloaded: onUpdateDownloadedCallback,
|
|
39
|
+
onError
|
|
40
|
+
} = options,
|
|
41
|
+
progress = useHotUpdaterStore(function (state) {
|
|
42
|
+
return state.progress;
|
|
43
|
+
}),
|
|
44
|
+
isUpdating = progress > 0.01,
|
|
45
|
+
[isUserClearedForAccess, setIsUserClearedForAccess] = useState(!1),
|
|
46
|
+
isUserClearedForAccessRef = useRef(isUserClearedForAccess);
|
|
47
|
+
return isUserClearedForAccessRef.current = isUserClearedForAccess, useEffect(function () {
|
|
48
|
+
if (!isUpdating) {
|
|
49
|
+
var timer = setTimeout(function () {
|
|
50
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
51
|
+
}, 5e3);
|
|
52
|
+
return function () {
|
|
53
|
+
return clearTimeout(timer);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}, [isUpdating]), useEffect(function () {
|
|
57
|
+
var timer = setTimeout(function () {
|
|
58
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
59
|
+
}, 2e4);
|
|
60
|
+
return function () {
|
|
61
|
+
return clearTimeout(timer);
|
|
62
|
+
};
|
|
63
|
+
}, []), useEffect(function () {
|
|
64
|
+
var shouldContinue = !0;
|
|
65
|
+
return async function () {
|
|
66
|
+
try {
|
|
67
|
+
if (!enabled) {
|
|
68
|
+
setIsUserClearedForAccess(!0);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!shouldContinue) return;
|
|
72
|
+
var updateInfo = await HotUpdater.checkForUpdate({
|
|
73
|
+
source: getUpdateSource(serverUrl, {
|
|
74
|
+
updateStrategy
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
if (!updateInfo) {
|
|
78
|
+
setIsUserClearedForAccess(!0);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!shouldContinue) return;
|
|
82
|
+
if (updateInfo.status === "ROLLBACK") {
|
|
83
|
+
var preReleaseBundleId = getPreReleaseBundleId(),
|
|
84
|
+
currentBundleId = HotUpdater.getBundleId();
|
|
85
|
+
if (preReleaseBundleId && preReleaseBundleId === currentBundleId && currentBundleId > updateInfo.id) {
|
|
86
|
+
Alert.alert("Update Skipped", "Skipped rollback because you are using a newer pre-release bundle."), setIsUserClearedForAccess(!0);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (updateInfo.shouldForceUpdate || setIsUserClearedForAccess(!0), !shouldContinue) return;
|
|
91
|
+
await updateInfo.updateBundle(), handleUpdateDownloaded(updateInfo.id);
|
|
92
|
+
var info = {
|
|
93
|
+
id: updateInfo.id,
|
|
94
|
+
isCriticalUpdate: updateInfo.shouldForceUpdate,
|
|
95
|
+
fileUrl: updateInfo.fileUrl,
|
|
96
|
+
message: updateInfo.message
|
|
97
|
+
};
|
|
98
|
+
if (onUpdateDownloadedCallback?.(info), !shouldContinue) return;
|
|
99
|
+
if (updateInfo.shouldForceUpdate) {
|
|
100
|
+
if (!isUserClearedForAccessRef.current) {
|
|
101
|
+
HotUpdater.reload();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
Alert.alert("Update Downloaded", "An important update has been downloaded. Reload now to apply it?", [{
|
|
105
|
+
text: "Later",
|
|
106
|
+
style: "cancel"
|
|
107
|
+
}, {
|
|
108
|
+
text: "Reload Now",
|
|
109
|
+
onPress: function () {
|
|
110
|
+
return HotUpdater.reload();
|
|
111
|
+
}
|
|
112
|
+
}]);
|
|
113
|
+
}
|
|
114
|
+
} catch (error) {
|
|
115
|
+
onError?.(error), setIsUserClearedForAccess(!0);
|
|
116
|
+
} finally {
|
|
117
|
+
isUserClearedForAccessRef.current || setIsUserClearedForAccess(!0);
|
|
118
|
+
}
|
|
119
|
+
}(), function () {
|
|
120
|
+
shouldContinue = !1;
|
|
121
|
+
};
|
|
122
|
+
}, [enabled, onUpdateDownloadedCallback, onError]), {
|
|
123
|
+
userClearedForAccess: isUserClearedForAccess,
|
|
124
|
+
progress,
|
|
125
|
+
isUpdatePending: getIsUpdatePending()
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
checkForUpdate = async function () {
|
|
129
|
+
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
|
|
130
|
+
{
|
|
131
|
+
channel,
|
|
132
|
+
isPreRelease = !1
|
|
133
|
+
} = options,
|
|
134
|
+
updateSource = getUpdateSource(serverUrl, {
|
|
135
|
+
updateStrategy
|
|
136
|
+
}),
|
|
137
|
+
finalSource = channel ? function (params) {
|
|
138
|
+
return updateSource({
|
|
139
|
+
...params,
|
|
140
|
+
channel
|
|
141
|
+
});
|
|
142
|
+
} : updateSource,
|
|
143
|
+
updateInfo = await HotUpdater.checkForUpdate({
|
|
144
|
+
source: finalSource
|
|
145
|
+
});
|
|
146
|
+
return updateInfo ? (await updateInfo.updateBundle(), handleUpdateDownloaded(updateInfo.id, {
|
|
147
|
+
isPreRelease
|
|
148
|
+
}), {
|
|
149
|
+
id: updateInfo.id,
|
|
150
|
+
isCriticalUpdate: updateInfo.shouldForceUpdate,
|
|
151
|
+
fileUrl: updateInfo.fileUrl,
|
|
152
|
+
message: updateInfo.message
|
|
153
|
+
}) : null;
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
useOtaUpdater,
|
|
157
|
+
checkForUpdate,
|
|
158
|
+
getAppliedOta,
|
|
159
|
+
getShortOtaId,
|
|
160
|
+
getIsUpdatePending,
|
|
161
|
+
reload: function () {
|
|
162
|
+
return HotUpdater.reload();
|
|
163
|
+
},
|
|
164
|
+
getBundleId: function () {
|
|
165
|
+
return HotUpdater.getBundleId();
|
|
166
|
+
},
|
|
167
|
+
getMinBundleId: function () {
|
|
168
|
+
return HotUpdater.getMinBundleId();
|
|
169
|
+
},
|
|
170
|
+
getChannel: function () {
|
|
171
|
+
return HotUpdater.getChannel();
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export { createHotUpdater };
|
|
176
|
+
//# sourceMappingURL=createHotUpdater.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getUpdateSource","HotUpdater","useHotUpdaterStore","Application","useEffect","useRef","useState","Alert","INITIAL_OTA_ID","BUNDLE_ID_KEY_PREFIX","PRE_RELEASE_BUNDLE_ID_KEY","createHotUpdater","config","serverUrl","storage","updateStrategy","isUpdatePending","getAppliedOta","id","getBundleId","getMinBundleId","getShortOtaId","fullId","slice","getIsUpdatePending","getPreReleaseBundleId","get","handleUpdateDownloaded","options","arguments","length","appVersion","nativeApplicationVersion","set","isPreRelease","delete","useOtaUpdater","enabled","onUpdateDownloaded","onUpdateDownloadedCallback","onError","progress","state","isUpdating","isUserClearedForAccess","setIsUserClearedForAccess","isUserClearedForAccessRef","current","timer","setTimeout","clearTimeout","shouldContinue","updateInfo","checkForUpdate","source","status","preReleaseBundleId","currentBundleId","alert","shouldForceUpdate","updateBundle","info","isCriticalUpdate","fileUrl","message","reload","text","style","onPress","error","userClearedForAccess","channel","updateSource","finalSource","params"],"sources":["../../src/createHotUpdater.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createHotUpdater"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,gBAAA,QAAwB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createHotUpdater"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,gBAAA,QAAwB","ignoreList":[]}
|
package/dist/esm/mmkv.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mmkv.ts"],
|
|
4
|
+
"mappings": "AAaO,SAAS,kBAAkB,MAA8B;AAC9D,SAAO;AAAA,IACL,KAAK,CAAC,QAAgB,KAAK,UAAU,GAAG;AAAA,IACxC,KAAK,CAAC,KAAa,UAAkB,KAAK,IAAI,KAAK,KAAK;AAAA,IACxD,QAAQ,CAAC,QAAgB,KAAK,OAAO,GAAG;AAAA,EAC1C;AACF;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createMMKVStorage","mmkv","get","key","getString","set","value","delete"],"sources":["../../src/mmkv.ts"],"sourcesContent":[null],"mappings":"AAaO,SAASA,kBAAkBC,IAAA,EAA8B;EAC9D,OAAO;IACLC,GAAA,EAAMC,GAAA,IAAgBF,IAAA,CAAKG,SAAA,CAAUD,GAAG;IACxCE,GAAA,EAAKA,CAACF,GAAA,EAAaG,KAAA,KAAkBL,IAAA,CAAKI,GAAA,CAAIF,GAAA,EAAKG,KAAK;IACxDC,MAAA,EAASJ,GAAA,IAAgBF,IAAA,CAAKM,MAAA,CAAOJ,GAAG;EAC1C;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function createMMKVStorage(mmkv) {
|
|
2
|
+
return {
|
|
3
|
+
get: function (key) {
|
|
4
|
+
return mmkv.getString(key);
|
|
5
|
+
},
|
|
6
|
+
set: function (key, value) {
|
|
7
|
+
return mmkv.set(key, value);
|
|
8
|
+
},
|
|
9
|
+
delete: function (key) {
|
|
10
|
+
return mmkv.delete(key);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export { createMMKVStorage };
|
|
15
|
+
//# sourceMappingURL=mmkv.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createMMKVStorage","mmkv","get","key","getString","set","value"],"sources":["../../src/mmkv.ts"],"sourcesContent":[null],"mappings":"AAaO,SAASA,kBAAkBC,IAAA,EAA8B;EAC9D,OAAO;IACLC,GAAA,EAAK,SAAAA,CAAiBC,GAAA,EAAK;MAC3B,OAAMF,IAAa,CAAAG,SAAkB,CAAAD,GAAK;IAC1C;IACFE,GAAA,WAAAA,CAAAF,GAAA,EAAAG,KAAA;MACF,OAAAL,IAAA,CAAAI,GAAA,CAAAF,GAAA,EAAAG,KAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"sourcesContent":[],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"sourcesContent":[],"mappings":"","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@take-out/native-hot-update",
|
|
3
|
+
"version": "0.0.36",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"source": "src/index.ts",
|
|
7
|
+
"main": "dist/cjs",
|
|
8
|
+
"module": "dist/esm",
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"types": "./src/index.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
"./package.json": "./package.json",
|
|
15
|
+
".": {
|
|
16
|
+
"react-native": {
|
|
17
|
+
"import": "./dist/esm/index.native.js",
|
|
18
|
+
"require": "./dist/cjs/index.native.js"
|
|
19
|
+
},
|
|
20
|
+
"types": "./src/index.ts",
|
|
21
|
+
"import": "./dist/esm/index.mjs",
|
|
22
|
+
"require": "./dist/cjs/index.cjs"
|
|
23
|
+
},
|
|
24
|
+
"./mmkv": {
|
|
25
|
+
"types": "./src/mmkv.ts",
|
|
26
|
+
"import": "./dist/esm/mmkv.mjs",
|
|
27
|
+
"require": "./dist/cjs/mmkv.cjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"src"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tamagui-build --skip-types",
|
|
36
|
+
"watch": "tamagui-build --skip-types --watch",
|
|
37
|
+
"clean": "tamagui-build clean",
|
|
38
|
+
"typecheck": "tko run typecheck",
|
|
39
|
+
"lint": "oxlint src",
|
|
40
|
+
"check": "tsc --noEmit"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@hot-updater/react-native": "^0.20.11"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"expo-application": "*",
|
|
47
|
+
"react": "*",
|
|
48
|
+
"react-native": "*"
|
|
49
|
+
},
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"react-native-mmkv": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@tamagui/build": "*",
|
|
57
|
+
"@types/react": "^18.3.18",
|
|
58
|
+
"react": "*",
|
|
59
|
+
"react-native": "*",
|
|
60
|
+
"react-native-mmkv": "^3.1.0",
|
|
61
|
+
"typescript": "^5.7.3"
|
|
62
|
+
}
|
|
63
|
+
}
|