@hot-updater/react-native 0.35.3 → 0.35.5
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 +3 -1
- package/lib/commonjs/sdkVersion.js +1 -1
- package/lib/commonjs/store.js +11 -2
- package/lib/commonjs/store.js.map +1 -1
- package/lib/commonjs/store.notification.spec.js +76 -0
- package/lib/commonjs/store.notification.spec.js.map +1 -0
- package/lib/module/sdkVersion.js +1 -1
- package/lib/module/store.js +11 -2
- package/lib/module/store.js.map +1 -1
- package/lib/module/store.notification.spec.js +77 -0
- package/lib/module/store.notification.spec.js.map +1 -0
- package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/module/sdkVersion.d.ts +1 -1
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/package.json +11 -6
- package/src/sdkVersion.ts +1 -1
- package/src/store.notification.spec.ts +92 -0
- package/src/store.ts +15 -2
|
@@ -429,7 +429,9 @@ class BundleFileStorageService(
|
|
|
429
429
|
if (!HashUtils.verifyHash(patchDownloadResult.file, patch.patchFileHash)) {
|
|
430
430
|
false
|
|
431
431
|
} else {
|
|
432
|
-
|
|
432
|
+
withContext(Dispatchers.IO) {
|
|
433
|
+
BsdiffPatch.apply(sourceFile, patchDownloadResult.file, targetFile)
|
|
434
|
+
}
|
|
433
435
|
HashUtils.verifyHash(targetFile, expectedHash).also { patched ->
|
|
434
436
|
if (patched) {
|
|
435
437
|
Log.d(
|
|
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.HOT_UPDATER_SDK_VERSION = void 0;
|
|
7
|
-
const HOT_UPDATER_SDK_VERSION = exports.HOT_UPDATER_SDK_VERSION = "0.35.
|
|
7
|
+
const HOT_UPDATER_SDK_VERSION = exports.HOT_UPDATER_SDK_VERSION = "0.35.5";
|
|
8
8
|
//# sourceMappingURL=sdkVersion.js.map
|
package/lib/commonjs/store.js
CHANGED
|
@@ -50,10 +50,19 @@ const createHotUpdaterStore = () => {
|
|
|
50
50
|
return state;
|
|
51
51
|
};
|
|
52
52
|
const listeners = new Set();
|
|
53
|
+
let isEmitScheduled = false;
|
|
53
54
|
const emitChange = () => {
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
if (isEmitScheduled) {
|
|
56
|
+
return;
|
|
56
57
|
}
|
|
58
|
+
isEmitScheduled = true;
|
|
59
|
+
const scheduleFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : callback => callback(0);
|
|
60
|
+
scheduleFrame(() => {
|
|
61
|
+
isEmitScheduled = false;
|
|
62
|
+
for (const listener of listeners) {
|
|
63
|
+
listener();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
57
66
|
};
|
|
58
67
|
const normalizeDiffDetails = details => {
|
|
59
68
|
const totalFilesCount = Math.max(0, details.totalFilesCount);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_withSelector","_interopRequireDefault","require","_native","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","areDiffDetailsEqual","left","right","totalFilesCount","completedFilesCount","files","length","every","leftFile","index","rightFile","undefined","order","path","downloadPath","downloadedBytes","progress","status","totalBytes","areStatesEqual","isUpdateDownloaded","artifactType","details","normalizeByteCount","value","Number","isFinite","Math","round","normalizeDownloadPath","createHotUpdaterStore","state","getSnapshot","listeners","Set","emitChange","listener","normalizeDiffDetails","max","normalizedFiles","map","file","min","sort","setState","newState","nextState","applyProgressEvent","event","subscribe","add","delete","addListener","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_withSelector","_interopRequireDefault","require","_native","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","areDiffDetailsEqual","left","right","totalFilesCount","completedFilesCount","files","length","every","leftFile","index","rightFile","undefined","order","path","downloadPath","downloadedBytes","progress","status","totalBytes","areStatesEqual","isUpdateDownloaded","artifactType","details","normalizeByteCount","value","Number","isFinite","Math","round","normalizeDownloadPath","createHotUpdaterStore","state","getSnapshot","listeners","Set","isEmitScheduled","emitChange","scheduleFrame","requestAnimationFrame","callback","listener","normalizeDiffDetails","max","normalizedFiles","map","file","min","sort","setState","newState","nextState","applyProgressEvent","event","subscribe","add","delete","addListener","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = require("@testing-library/react");
|
|
4
|
+
var _react2 = require("react");
|
|
5
|
+
var _vitest = require("vitest");
|
|
6
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } // @vitest-environment jsdom
|
|
7
|
+
const listeners = _vitest.vi.hoisted(() => new Map());
|
|
8
|
+
_vitest.vi.mock("./native", () => ({
|
|
9
|
+
addListener: _vitest.vi.fn((eventName, listener) => {
|
|
10
|
+
listeners.set(eventName, listener);
|
|
11
|
+
return () => {
|
|
12
|
+
listeners.delete(eventName);
|
|
13
|
+
};
|
|
14
|
+
})
|
|
15
|
+
}));
|
|
16
|
+
(0, _vitest.describe)("hotUpdaterStore notification scheduling", () => {
|
|
17
|
+
(0, _vitest.beforeEach)(() => {
|
|
18
|
+
listeners.clear();
|
|
19
|
+
_vitest.vi.resetModules();
|
|
20
|
+
});
|
|
21
|
+
(0, _vitest.afterEach)(() => {
|
|
22
|
+
(0, _react.cleanup)();
|
|
23
|
+
_vitest.vi.unstubAllGlobals();
|
|
24
|
+
});
|
|
25
|
+
(0, _vitest.it)("keeps progress notifications from exceeding React's maximum update depth", async () => {
|
|
26
|
+
// Given
|
|
27
|
+
const frameCallbacks = [];
|
|
28
|
+
_vitest.vi.stubGlobal("requestAnimationFrame", callback => {
|
|
29
|
+
frameCallbacks.push(callback);
|
|
30
|
+
return frameCallbacks.length;
|
|
31
|
+
});
|
|
32
|
+
const {
|
|
33
|
+
hotUpdaterStore
|
|
34
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require("./store")));
|
|
35
|
+
const emitProgress = listeners.get("onProgress");
|
|
36
|
+
const Consumer = () => {
|
|
37
|
+
const [progress, setProgress] = (0, _react2.useState)(0);
|
|
38
|
+
(0, _react2.useLayoutEffect)(() => {
|
|
39
|
+
const unsubscribe = hotUpdaterStore.subscribe(() => {
|
|
40
|
+
setProgress(hotUpdaterStore.getSnapshot().progress);
|
|
41
|
+
});
|
|
42
|
+
return () => {
|
|
43
|
+
unsubscribe();
|
|
44
|
+
};
|
|
45
|
+
}, []);
|
|
46
|
+
(0, _react2.useLayoutEffect)(() => {
|
|
47
|
+
if (progress >= 1) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const nextProgress = Math.min(1, progress + 0.01);
|
|
51
|
+
emitProgress?.({
|
|
52
|
+
artifactType: "archive",
|
|
53
|
+
downloadedBytes: nextProgress * 1_000_000,
|
|
54
|
+
progress: nextProgress,
|
|
55
|
+
totalBytes: 1_000_000
|
|
56
|
+
});
|
|
57
|
+
}, [progress]);
|
|
58
|
+
return null;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// When
|
|
62
|
+
(0, _react.render)(/*#__PURE__*/(0, _react2.createElement)(Consumer));
|
|
63
|
+
for (let frame = 0; frame < 200 && hotUpdaterStore.getSnapshot().progress < 1; frame++) {
|
|
64
|
+
const frameCallback = frameCallbacks.shift();
|
|
65
|
+
(0, _vitest.expect)(frameCallback).toBeTypeOf("function");
|
|
66
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
67
|
+
await (0, _react2.act)(async () => {
|
|
68
|
+
frameCallback?.(0);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Then
|
|
73
|
+
(0, _vitest.expect)(hotUpdaterStore.getSnapshot().progress).toBe(1);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=store.notification.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_react2","_vitest","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","listeners","vi","hoisted","Map","mock","addListener","fn","eventName","listener","delete","describe","beforeEach","clear","resetModules","afterEach","cleanup","unstubAllGlobals","it","frameCallbacks","stubGlobal","callback","push","length","hotUpdaterStore","Promise","resolve","then","emitProgress","Consumer","progress","setProgress","useState","useLayoutEffect","unsubscribe","subscribe","getSnapshot","nextProgress","Math","min","artifactType","downloadedBytes","totalBytes","render","createElement","frame","frameCallback","shift","expect","toBeTypeOf","setImmediate","act","toBe"],"sourceRoot":"../../src","sources":["store.notification.spec.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/sdkVersion.js
CHANGED
package/lib/module/store.js
CHANGED
|
@@ -45,10 +45,19 @@ const createHotUpdaterStore = () => {
|
|
|
45
45
|
return state;
|
|
46
46
|
};
|
|
47
47
|
const listeners = new Set();
|
|
48
|
+
let isEmitScheduled = false;
|
|
48
49
|
const emitChange = () => {
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
if (isEmitScheduled) {
|
|
51
|
+
return;
|
|
51
52
|
}
|
|
53
|
+
isEmitScheduled = true;
|
|
54
|
+
const scheduleFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : callback => callback(0);
|
|
55
|
+
scheduleFrame(() => {
|
|
56
|
+
isEmitScheduled = false;
|
|
57
|
+
for (const listener of listeners) {
|
|
58
|
+
listener();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
52
61
|
};
|
|
53
62
|
const normalizeDiffDetails = details => {
|
|
54
63
|
const totalFilesCount = Math.max(0, details.totalFilesCount);
|
package/lib/module/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useSyncExternalStoreExports","addListener","useSyncExternalStoreWithSelector","areDiffDetailsEqual","left","right","totalFilesCount","completedFilesCount","files","length","every","leftFile","index","rightFile","undefined","order","path","downloadPath","downloadedBytes","progress","status","totalBytes","areStatesEqual","isUpdateDownloaded","artifactType","details","normalizeByteCount","value","Number","isFinite","Math","round","normalizeDownloadPath","createHotUpdaterStore","state","getSnapshot","listeners","Set","emitChange","listener","normalizeDiffDetails","max","normalizedFiles","map","file","min","sort","setState","newState","nextState","applyProgressEvent","event","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,4CAA4C;AAOpF,SAASC,WAAW,QAAQ,aAAU;AAWtC,MAAM;EAAEC;AAAiC,CAAC,GAAGF,2BAA2B;AAExE,MAAMG,mBAAmB,GAAGA,CAC1BC,IAA0C,EAC1CC,KAA2C,KACxC;EACH,IAAID,IAAI,KAAKC,KAAK,EAAE;IAClB,OAAO,IAAI;EACb;EAEA,IAAID,IAAI,KAAK,IAAI,IAAIC,KAAK,KAAK,IAAI,EAAE;IACnC,OAAO,KAAK;EACd;EAEA,IACED,IAAI,CAACE,eAAe,KAAKD,KAAK,CAACC,eAAe,IAC9CF,IAAI,CAACG,mBAAmB,KAAKF,KAAK,CAACE,mBAAmB,IACtDH,IAAI,CAACI,KAAK,CAACC,MAAM,KAAKJ,KAAK,CAACG,KAAK,CAACC,MAAM,EACxC;IACA,OAAO,KAAK;EACd;EAEA,OAAOL,IAAI,CAACI,KAAK,CAACE,KAAK,CAAC,CAACC,QAAQ,EAAEC,KAAK,KAAK;IAC3C,MAAMC,SAAS,GAAGR,KAAK,CAACG,KAAK,CAACI,KAAK,CAAC;IACpC,OACEC,SAAS,KAAKC,SAAS,IACvBH,QAAQ,CAACI,KAAK,KAAKF,SAAS,CAACE,KAAK,IAClCJ,QAAQ,CAACK,IAAI,KAAKH,SAAS,CAACG,IAAI,IAChCL,QAAQ,CAACM,YAAY,KAAKJ,SAAS,CAACI,YAAY,IAChDN,QAAQ,CAACO,eAAe,KAAKL,SAAS,CAACK,eAAe,IACtDP,QAAQ,CAACQ,QAAQ,KAAKN,SAAS,CAACM,QAAQ,IACxCR,QAAQ,CAACS,MAAM,KAAKP,SAAS,CAACO,MAAM,IACpCT,QAAQ,CAACU,UAAU,KAAKR,SAAS,CAACQ,UAAU;EAEhD,CAAC,CAAC;AACJ,CAAC;AAED,MAAMC,cAAc,GAAGA,CAAClB,IAAqB,EAAEC,KAAsB,KAAK;EACxE,OACED,IAAI,CAACe,QAAQ,KAAKd,KAAK,CAACc,QAAQ,IAChCf,IAAI,CAACc,eAAe,KAAKb,KAAK,CAACa,eAAe,IAC9Cd,IAAI,CAACiB,UAAU,KAAKhB,KAAK,CAACgB,UAAU,IACpCjB,IAAI,CAACmB,kBAAkB,KAAKlB,KAAK,CAACkB,kBAAkB,IACpDnB,IAAI,CAACoB,YAAY,KAAKnB,KAAK,CAACmB,YAAY,IACxCrB,mBAAmB,CAACC,IAAI,CAACqB,OAAO,EAAEpB,KAAK,CAACoB,OAAO,CAAC;AAEpD,CAAC;AAED,MAAMC,kBAAkB,GAAIC,KAAyB,IAAK;EACxD,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACC,MAAM,CAACC,QAAQ,CAACF,KAAK,CAAC,IAAIA,KAAK,GAAG,CAAC,EAAE;IACrE,OAAOb,SAAS;EAClB;EACA,OAAOgB,IAAI,CAACC,KAAK,CAACJ,KAAK,CAAC;AAC1B,CAAC;AAED,MAAMK,qBAAqB,GAAIL,KAAyB,IAAK;EAC3D,OAAO,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAAClB,MAAM,GAAG,CAAC,GAAGkB,KAAK,GAAGb,SAAS;AAC1E,CAAC;AAED,MAAMmB,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3Bf,QAAQ,EAAE,CAAC;IACXD,eAAe,EAAEJ,SAAS;IAC1BO,UAAU,EAAEP,SAAS;IACrBS,kBAAkB,EAAE,KAAK;IACzBC,YAAY,EAAE,IAAI;IAClBC,OAAO,EAAE;EACX,CAAC;EAED,MAAMU,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOD,KAAK;EACd,CAAC;EAED,MAAME,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;
|
|
1
|
+
{"version":3,"names":["useSyncExternalStoreExports","addListener","useSyncExternalStoreWithSelector","areDiffDetailsEqual","left","right","totalFilesCount","completedFilesCount","files","length","every","leftFile","index","rightFile","undefined","order","path","downloadPath","downloadedBytes","progress","status","totalBytes","areStatesEqual","isUpdateDownloaded","artifactType","details","normalizeByteCount","value","Number","isFinite","Math","round","normalizeDownloadPath","createHotUpdaterStore","state","getSnapshot","listeners","Set","isEmitScheduled","emitChange","scheduleFrame","requestAnimationFrame","callback","listener","normalizeDiffDetails","max","normalizedFiles","map","file","min","sort","setState","newState","nextState","applyProgressEvent","event","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// @vitest-environment jsdom
|
|
4
|
+
|
|
5
|
+
import { cleanup, render } from "@testing-library/react";
|
|
6
|
+
import { act, createElement, useLayoutEffect, useState } from "react";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
const listeners = vi.hoisted(() => new Map());
|
|
9
|
+
vi.mock("./native", () => ({
|
|
10
|
+
addListener: vi.fn((eventName, listener) => {
|
|
11
|
+
listeners.set(eventName, listener);
|
|
12
|
+
return () => {
|
|
13
|
+
listeners.delete(eventName);
|
|
14
|
+
};
|
|
15
|
+
})
|
|
16
|
+
}));
|
|
17
|
+
describe("hotUpdaterStore notification scheduling", () => {
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
listeners.clear();
|
|
20
|
+
vi.resetModules();
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
cleanup();
|
|
24
|
+
vi.unstubAllGlobals();
|
|
25
|
+
});
|
|
26
|
+
it("keeps progress notifications from exceeding React's maximum update depth", async () => {
|
|
27
|
+
// Given
|
|
28
|
+
const frameCallbacks = [];
|
|
29
|
+
vi.stubGlobal("requestAnimationFrame", callback => {
|
|
30
|
+
frameCallbacks.push(callback);
|
|
31
|
+
return frameCallbacks.length;
|
|
32
|
+
});
|
|
33
|
+
const {
|
|
34
|
+
hotUpdaterStore
|
|
35
|
+
} = await import("./store");
|
|
36
|
+
const emitProgress = listeners.get("onProgress");
|
|
37
|
+
const Consumer = () => {
|
|
38
|
+
const [progress, setProgress] = useState(0);
|
|
39
|
+
useLayoutEffect(() => {
|
|
40
|
+
const unsubscribe = hotUpdaterStore.subscribe(() => {
|
|
41
|
+
setProgress(hotUpdaterStore.getSnapshot().progress);
|
|
42
|
+
});
|
|
43
|
+
return () => {
|
|
44
|
+
unsubscribe();
|
|
45
|
+
};
|
|
46
|
+
}, []);
|
|
47
|
+
useLayoutEffect(() => {
|
|
48
|
+
if (progress >= 1) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const nextProgress = Math.min(1, progress + 0.01);
|
|
52
|
+
emitProgress?.({
|
|
53
|
+
artifactType: "archive",
|
|
54
|
+
downloadedBytes: nextProgress * 1_000_000,
|
|
55
|
+
progress: nextProgress,
|
|
56
|
+
totalBytes: 1_000_000
|
|
57
|
+
});
|
|
58
|
+
}, [progress]);
|
|
59
|
+
return null;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// When
|
|
63
|
+
render(/*#__PURE__*/createElement(Consumer));
|
|
64
|
+
for (let frame = 0; frame < 200 && hotUpdaterStore.getSnapshot().progress < 1; frame++) {
|
|
65
|
+
const frameCallback = frameCallbacks.shift();
|
|
66
|
+
expect(frameCallback).toBeTypeOf("function");
|
|
67
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
68
|
+
await act(async () => {
|
|
69
|
+
frameCallback?.(0);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Then
|
|
74
|
+
expect(hotUpdaterStore.getSnapshot().progress).toBe(1);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=store.notification.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["cleanup","render","act","createElement","useLayoutEffect","useState","afterEach","beforeEach","describe","expect","it","vi","listeners","hoisted","Map","mock","addListener","fn","eventName","listener","set","delete","clear","resetModules","unstubAllGlobals","frameCallbacks","stubGlobal","callback","push","length","hotUpdaterStore","emitProgress","get","Consumer","progress","setProgress","unsubscribe","subscribe","getSnapshot","nextProgress","Math","min","artifactType","downloadedBytes","totalBytes","frame","frameCallback","shift","toBeTypeOf","Promise","resolve","setImmediate","toBe"],"sourceRoot":"../../src","sources":["store.notification.spec.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const HOT_UPDATER_SDK_VERSION = "0.35.
|
|
1
|
+
export declare const HOT_UPDATER_SDK_VERSION = "0.35.5";
|
|
2
2
|
//# sourceMappingURL=sdkVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,6BAA6B,EAE9B,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,6BAA6B,GAAG,IAAI,CAAC;CAC/C,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,6BAA6B,EAE9B,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,6BAA6B,GAAG,IAAI,CAAC;CAC/C,CAAC;AAkMF,eAAO,MAAM,eAAe;;yBAnEE,OAAO,CAAC,eAAe,CAAC;0BAuDvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const HOT_UPDATER_SDK_VERSION = "0.35.
|
|
1
|
+
export declare const HOT_UPDATER_SDK_VERSION = "0.35.5";
|
|
2
2
|
//# sourceMappingURL=sdkVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,6BAA6B,EAE9B,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,6BAA6B,GAAG,IAAI,CAAC;CAC/C,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,6BAA6B,EAE9B,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,6BAA6B,GAAG,IAAI,CAAC;CAC/C,CAAC;AAkMF,eAAO,MAAM,eAAe;;yBAnEE,OAAO,CAAC,eAAe,CAAC;0BAuDvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.35.
|
|
3
|
+
"version": "0.35.5",
|
|
4
4
|
"description": "React Native OTA solution for self-hosted",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"main": "./lib/commonjs/index.js",
|
|
@@ -115,24 +115,29 @@
|
|
|
115
115
|
},
|
|
116
116
|
"devDependencies": {
|
|
117
117
|
"@react-native-community/cli": "18.0.0",
|
|
118
|
+
"@testing-library/dom": "10.4.1",
|
|
119
|
+
"@testing-library/react": "16.3.2",
|
|
118
120
|
"@types/node": "^22.10.5",
|
|
119
121
|
"@types/react": "19.1.3",
|
|
122
|
+
"@types/react-dom": "19.1.3",
|
|
120
123
|
"@types/use-sync-external-store": "^0.0.6",
|
|
121
124
|
"del-cli": "^6.0.0",
|
|
122
125
|
"expo": "^50.0.0",
|
|
126
|
+
"jsdom": "29.1.1",
|
|
123
127
|
"oxc-transform": "0.121.0",
|
|
124
128
|
"react": "19.1.3",
|
|
129
|
+
"react-dom": "19.1.3",
|
|
125
130
|
"react-native": "0.79.1",
|
|
126
131
|
"react-native-builder-bob": "0.41.0",
|
|
127
132
|
"typescript": "^6.0.2",
|
|
128
|
-
"hot-updater": "0.35.
|
|
133
|
+
"hot-updater": "0.35.5"
|
|
129
134
|
},
|
|
130
135
|
"dependencies": {
|
|
131
136
|
"use-sync-external-store": "1.5.0",
|
|
132
|
-
"@hot-updater/
|
|
133
|
-
"@hot-updater/
|
|
134
|
-
"@hot-updater/plugin-core": "0.35.
|
|
135
|
-
"@hot-updater/
|
|
137
|
+
"@hot-updater/core": "0.35.5",
|
|
138
|
+
"@hot-updater/js": "0.35.5",
|
|
139
|
+
"@hot-updater/plugin-core": "0.35.5",
|
|
140
|
+
"@hot-updater/cli-tools": "0.35.5"
|
|
136
141
|
},
|
|
137
142
|
"scripts": {
|
|
138
143
|
"build": "node ./scripts/sync-sdk-version.mjs run -- bob build && tsc -p plugin/tsconfig.build.json",
|
package/src/sdkVersion.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const HOT_UPDATER_SDK_VERSION = "0.35.
|
|
1
|
+
export const HOT_UPDATER_SDK_VERSION = "0.35.5";
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { cleanup, render } from "@testing-library/react";
|
|
4
|
+
import { act, createElement, useLayoutEffect, useState } from "react";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
|
|
7
|
+
const listeners = vi.hoisted(
|
|
8
|
+
() => new Map<string, (event: Record<string, unknown>) => void>(),
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
vi.mock("./native", () => ({
|
|
12
|
+
addListener: vi.fn(
|
|
13
|
+
(eventName: string, listener: (event: Record<string, unknown>) => void) => {
|
|
14
|
+
listeners.set(eventName, listener);
|
|
15
|
+
return () => {
|
|
16
|
+
listeners.delete(eventName);
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
),
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
describe("hotUpdaterStore notification scheduling", () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
listeners.clear();
|
|
25
|
+
vi.resetModules();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
cleanup();
|
|
30
|
+
vi.unstubAllGlobals();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("keeps progress notifications from exceeding React's maximum update depth", async () => {
|
|
34
|
+
// Given
|
|
35
|
+
const frameCallbacks: ((timestamp: number) => void)[] = [];
|
|
36
|
+
vi.stubGlobal(
|
|
37
|
+
"requestAnimationFrame",
|
|
38
|
+
(callback: (timestamp: number) => void) => {
|
|
39
|
+
frameCallbacks.push(callback);
|
|
40
|
+
return frameCallbacks.length;
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
const { hotUpdaterStore } = await import("./store");
|
|
44
|
+
const emitProgress = listeners.get("onProgress");
|
|
45
|
+
const Consumer = () => {
|
|
46
|
+
const [progress, setProgress] = useState(0);
|
|
47
|
+
|
|
48
|
+
useLayoutEffect(() => {
|
|
49
|
+
const unsubscribe = hotUpdaterStore.subscribe(() => {
|
|
50
|
+
setProgress(hotUpdaterStore.getSnapshot().progress);
|
|
51
|
+
});
|
|
52
|
+
return () => {
|
|
53
|
+
unsubscribe();
|
|
54
|
+
};
|
|
55
|
+
}, []);
|
|
56
|
+
|
|
57
|
+
useLayoutEffect(() => {
|
|
58
|
+
if (progress >= 1) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const nextProgress = Math.min(1, progress + 0.01);
|
|
63
|
+
emitProgress?.({
|
|
64
|
+
artifactType: "archive",
|
|
65
|
+
downloadedBytes: nextProgress * 1_000_000,
|
|
66
|
+
progress: nextProgress,
|
|
67
|
+
totalBytes: 1_000_000,
|
|
68
|
+
});
|
|
69
|
+
}, [progress]);
|
|
70
|
+
|
|
71
|
+
return null;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// When
|
|
75
|
+
render(createElement(Consumer));
|
|
76
|
+
for (
|
|
77
|
+
let frame = 0;
|
|
78
|
+
frame < 200 && hotUpdaterStore.getSnapshot().progress < 1;
|
|
79
|
+
frame++
|
|
80
|
+
) {
|
|
81
|
+
const frameCallback = frameCallbacks.shift();
|
|
82
|
+
expect(frameCallback).toBeTypeOf("function");
|
|
83
|
+
await new Promise<void>((resolve) => setImmediate(resolve));
|
|
84
|
+
await act(async () => {
|
|
85
|
+
frameCallback?.(0);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Then
|
|
90
|
+
expect(hotUpdaterStore.getSnapshot().progress).toBe(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
package/src/store.ts
CHANGED
|
@@ -90,11 +90,24 @@ const createHotUpdaterStore = () => {
|
|
|
90
90
|
};
|
|
91
91
|
|
|
92
92
|
const listeners = new Set<() => void>();
|
|
93
|
+
let isEmitScheduled = false;
|
|
93
94
|
|
|
94
95
|
const emitChange = () => {
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
if (isEmitScheduled) {
|
|
97
|
+
return;
|
|
97
98
|
}
|
|
99
|
+
|
|
100
|
+
isEmitScheduled = true;
|
|
101
|
+
const scheduleFrame =
|
|
102
|
+
typeof requestAnimationFrame === "function"
|
|
103
|
+
? requestAnimationFrame
|
|
104
|
+
: (callback: (timestamp: number) => void) => callback(0);
|
|
105
|
+
scheduleFrame(() => {
|
|
106
|
+
isEmitScheduled = false;
|
|
107
|
+
for (const listener of listeners) {
|
|
108
|
+
listener();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
98
111
|
};
|
|
99
112
|
|
|
100
113
|
const normalizeDiffDetails = (
|