@hot-updater/react-native 1.0.0-rc.15 → 1.0.0-rc.16
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/lib/commonjs/httpClient.js +107 -12
- package/lib/commonjs/httpClient.js.map +1 -1
- package/lib/commonjs/httpClient.spec.js +190 -0
- package/lib/commonjs/httpClient.spec.js.map +1 -1
- package/lib/commonjs/index.js +13 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.spec.js +101 -0
- package/lib/commonjs/index.spec.js.map +1 -1
- package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +48 -1
- package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +1 -1
- package/lib/commonjs/sdkVersion.js +1 -1
- package/lib/commonjs/uuidv7.js +41 -0
- package/lib/commonjs/uuidv7.js.map +1 -0
- package/lib/commonjs/uuidv7.spec.js +30 -0
- package/lib/commonjs/uuidv7.spec.js.map +1 -0
- package/lib/module/httpClient.js +107 -12
- package/lib/module/httpClient.js.map +1 -1
- package/lib/module/httpClient.spec.js +191 -1
- package/lib/module/httpClient.spec.js.map +1 -1
- package/lib/module/index.js +13 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.spec.js +102 -1
- package/lib/module/index.spec.js.map +1 -1
- package/lib/module/notifyAppReadyInsights.transport.spec.js +48 -1
- package/lib/module/notifyAppReadyInsights.transport.spec.js.map +1 -1
- package/lib/module/sdkVersion.js +1 -1
- package/lib/module/uuidv7.js +36 -0
- package/lib/module/uuidv7.js.map +1 -0
- package/lib/module/uuidv7.spec.js +30 -0
- package/lib/module/uuidv7.spec.js.map +1 -0
- package/lib/typescript/commonjs/httpClient.d.ts +6 -0
- package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
- package/lib/typescript/commonjs/uuidv7.d.ts +10 -0
- package/lib/typescript/commonjs/uuidv7.d.ts.map +1 -0
- package/lib/typescript/commonjs/wrap.types.d.ts +7 -2
- package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
- package/lib/typescript/module/httpClient.d.ts +6 -0
- package/lib/typescript/module/httpClient.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/sdkVersion.d.ts +1 -1
- package/lib/typescript/module/uuidv7.d.ts +10 -0
- package/lib/typescript/module/uuidv7.d.ts.map +1 -0
- package/lib/typescript/module/wrap.types.d.ts +7 -2
- package/lib/typescript/module/wrap.types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/httpClient.spec.ts +219 -3
- package/src/httpClient.ts +157 -14
- package/src/index.spec.ts +70 -1
- package/src/index.ts +17 -2
- package/src/notifyAppReadyInsights.transport.spec.ts +58 -0
- package/src/sdkVersion.ts +1 -1
- package/src/uuidv7.spec.ts +25 -0
- package/src/uuidv7.ts +38 -0
- package/src/wrap.types.ts +9 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates an RFC 9562 UUIDv7: a 48-bit millisecond timestamp, then random bits.
|
|
5
|
+
*
|
|
6
|
+
* `createUUIDv7` from `@hot-updater/plugin-core` calls `crypto.getRandomValues`
|
|
7
|
+
* unconditionally, but React Native has no Web Crypto unless the app installs a
|
|
8
|
+
* polyfill. An Insights event ID only has to tell one event from another so a
|
|
9
|
+
* retried POST is counted once, so `Math.random` is enough without one.
|
|
10
|
+
*/
|
|
11
|
+
export const createUUIDv7 = () => {
|
|
12
|
+
const bytes = new Uint8Array(16);
|
|
13
|
+
const {
|
|
14
|
+
crypto
|
|
15
|
+
} = globalThis;
|
|
16
|
+
if (typeof crypto?.getRandomValues === "function") {
|
|
17
|
+
crypto.getRandomValues(bytes);
|
|
18
|
+
} else {
|
|
19
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
20
|
+
bytes[index] = Math.floor(Math.random() * 256);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Division, not bit shifts: shifts truncate to 32 bits, and a millisecond
|
|
25
|
+
// timestamp already needs 41.
|
|
26
|
+
let timestamp = Date.now();
|
|
27
|
+
for (let index = 5; index >= 0; index -= 1) {
|
|
28
|
+
bytes[index] = timestamp % 256;
|
|
29
|
+
timestamp = Math.floor(timestamp / 256);
|
|
30
|
+
}
|
|
31
|
+
bytes[6] = 0x70 | bytes[6] & 0x0f;
|
|
32
|
+
bytes[8] = 0x80 | bytes[8] & 0x3f;
|
|
33
|
+
const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, "0")).join("");
|
|
34
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=uuidv7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createUUIDv7","bytes","Uint8Array","crypto","globalThis","getRandomValues","index","length","Math","floor","random","timestamp","Date","now","hex","Array","from","byte","toString","padStart","join","slice"],"sourceRoot":"../../src","sources":["uuidv7.ts"],"mappings":";;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,YAAY,GAAGA,CAAA,KAAc;EACxC,MAAMC,KAAK,GAAG,IAAIC,UAAU,CAAC,EAAE,CAAC;EAChC,MAAM;IAAEC;EAAO,CAAC,GAAGC,UAA6C;EAChE,IAAI,OAAOD,MAAM,EAAEE,eAAe,KAAK,UAAU,EAAE;IACjDF,MAAM,CAACE,eAAe,CAACJ,KAAK,CAAC;EAC/B,CAAC,MAAM;IACL,KAAK,IAAIK,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGL,KAAK,CAACM,MAAM,EAAED,KAAK,IAAI,CAAC,EAAE;MACpDL,KAAK,CAACK,KAAK,CAAC,GAAGE,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;IAChD;EACF;;EAEA;EACA;EACA,IAAIC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EAC1B,KAAK,IAAIP,KAAK,GAAG,CAAC,EAAEA,KAAK,IAAI,CAAC,EAAEA,KAAK,IAAI,CAAC,EAAE;IAC1CL,KAAK,CAACK,KAAK,CAAC,GAAGK,SAAS,GAAG,GAAG;IAC9BA,SAAS,GAAGH,IAAI,CAACC,KAAK,CAACE,SAAS,GAAG,GAAG,CAAC;EACzC;EACAV,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAIA,KAAK,CAAC,CAAC,CAAC,GAAI,IAAK;EACpCA,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAIA,KAAK,CAAC,CAAC,CAAC,GAAI,IAAK;EAEpC,MAAMa,GAAG,GAAGC,KAAK,CAACC,IAAI,CAACf,KAAK,EAAGgB,IAAI,IACjCA,IAAI,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CACnC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;EACV,OAAO,GAAGN,GAAG,CAACO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAIP,GAAG,CAACO,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAIP,GAAG,CAACO,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAIP,GAAG,CAACO,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAIP,GAAG,CAACO,KAAK,CAAC,EAAE,CAAC,EAAE;AAC5G,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isUUIDv7 } from "@hot-updater/core";
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { createUUIDv7 } from "./uuidv7.js";
|
|
6
|
+
describe("createUUIDv7", () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
vi.useRealTimers();
|
|
9
|
+
vi.unstubAllGlobals();
|
|
10
|
+
});
|
|
11
|
+
it.each([{
|
|
12
|
+
label: "Web Crypto",
|
|
13
|
+
crypto: globalThis.crypto
|
|
14
|
+
}, {
|
|
15
|
+
label: "no Web Crypto, as in React Native",
|
|
16
|
+
crypto: undefined
|
|
17
|
+
}])("leads with the 48-bit millisecond time using $label", ({
|
|
18
|
+
crypto
|
|
19
|
+
}) => {
|
|
20
|
+
vi.useFakeTimers({
|
|
21
|
+
now: 0x0192_3456_789a
|
|
22
|
+
});
|
|
23
|
+
vi.stubGlobal("crypto", crypto);
|
|
24
|
+
const id = createUUIDv7();
|
|
25
|
+
expect(isUUIDv7(id)).toBe(true);
|
|
26
|
+
expect(id.startsWith("01923456-789a-7")).toBe(true);
|
|
27
|
+
expect(createUUIDv7()).not.toBe(id);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=uuidv7.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isUUIDv7","afterEach","describe","expect","it","vi","createUUIDv7","useRealTimers","unstubAllGlobals","each","label","crypto","globalThis","undefined","useFakeTimers","now","stubGlobal","id","toBe","startsWith","not"],"sourceRoot":"../../src","sources":["uuidv7.spec.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAE5D,SAASC,YAAY,QAAQ,aAAU;AAEvCJ,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC7BD,SAAS,CAAC,MAAM;IACdI,EAAE,CAACE,aAAa,CAAC,CAAC;IAClBF,EAAE,CAACG,gBAAgB,CAAC,CAAC;EACvB,CAAC,CAAC;EAEFJ,EAAE,CAACK,IAAI,CAAC,CACN;IAAEC,KAAK,EAAE,YAAY;IAAEC,MAAM,EAAEC,UAAU,CAACD;EAAO,CAAC,EAClD;IAAED,KAAK,EAAE,mCAAmC;IAAEC,MAAM,EAAEE;EAAU,CAAC,CAClE,CAAC,CAAC,qDAAqD,EAAE,CAAC;IAAEF;EAAO,CAAC,KAAK;IACxEN,EAAE,CAACS,aAAa,CAAC;MAAEC,GAAG,EAAE;IAAiB,CAAC,CAAC;IAC3CV,EAAE,CAACW,UAAU,CAAC,QAAQ,EAAEL,MAAM,CAAC;IAE/B,MAAMM,EAAE,GAAGX,YAAY,CAAC,CAAC;IAEzBH,MAAM,CAACH,QAAQ,CAACiB,EAAE,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAC/Bf,MAAM,CAACc,EAAE,CAACE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAACD,IAAI,CAAC,IAAI,CAAC;IACnDf,MAAM,CAACG,YAAY,CAAC,CAAC,CAAC,CAACc,GAAG,CAACF,IAAI,CAACD,EAAE,CAAC;EACrC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -45,6 +45,12 @@ export type InsightsEventParams = InsightsTransitionEventParams | InsightsUnchan
|
|
|
45
45
|
export interface HotUpdaterHttpSession {
|
|
46
46
|
fetchReleaseCatalog: (params: ReleaseCatalogRequest) => Promise<ReleaseCatalog>;
|
|
47
47
|
resolveArtifact: (params: ArtifactRequest) => Promise<ArtifactInfo>;
|
|
48
|
+
/**
|
|
49
|
+
* Posts an Insights event under a client `eventId`, retrying a network
|
|
50
|
+
* error, timeout, 429 or 5xx for up to three attempts in all. Resolves once
|
|
51
|
+
* the event is delivered or left to background retries; rejects when its
|
|
52
|
+
* first attempt fails for good, such as with a 400.
|
|
53
|
+
*/
|
|
48
54
|
sendInsightsEvent: (params: InsightsEventParams) => Promise<void>;
|
|
49
55
|
}
|
|
50
56
|
export interface HotUpdaterHttpClient {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/httpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EAIX,iBAAiB,EACjB,aAAa,EAEb,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,MAAM,EAEN,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAItB,IAAI,EACL,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gCAAgC,EAChC,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,QAAQ,CAAC;AAoBhB,KAAK,cAAc,GAAG;IACpB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACvD,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EAIX,iBAAiB,EACjB,aAAa,EAEb,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,MAAM,EAEN,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAItB,IAAI,EACL,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gCAAgC,EAChC,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,QAAQ,CAAC;AAoBhB,KAAK,cAAc,GAAG;IACpB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACvD,CAAC;AAiBF;;;GAGG;AACH,iBAAS,sBAAsB;IA6I3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;oBACa,iBAAiB;IAQjC;;;;;;;;;;;;;;OAcG;oBACa,qBAAqB,KAAG,IAAI;IAS5C;;OAEG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH,wDAAwD;;IAGxD;;;OAGG;;IAGH,wEAAwE;;IAGxE;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;OAIG;;IAGH;;;OAGG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;6BACsB,qBAAqB;IAkB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;2BAC0B,YAAY;IA8BzC;;;;OAIG;;IAcH;;;;;;;;;;OAUG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;EAGN;AAED,KAAK,gBAAgB,GAAG,IAAI,CAC1B,UAAU,CAAC,OAAO,sBAAsB,CAAC,EACzC,MAAM,CACP,GAAG;IACF,IAAI,EAAE,cAAc,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,gBAA2C,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const HOT_UPDATER_SDK_VERSION = "1.0.0-rc.
|
|
1
|
+
export declare const HOT_UPDATER_SDK_VERSION = "1.0.0-rc.16";
|
|
2
2
|
//# sourceMappingURL=sdkVersion.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an RFC 9562 UUIDv7: a 48-bit millisecond timestamp, then random bits.
|
|
3
|
+
*
|
|
4
|
+
* `createUUIDv7` from `@hot-updater/plugin-core` calls `crypto.getRandomValues`
|
|
5
|
+
* unconditionally, but React Native has no Web Crypto unless the app installs a
|
|
6
|
+
* polyfill. An Insights event ID only has to tell one event from another so a
|
|
7
|
+
* retried POST is counted once, so `Math.random` is enough without one.
|
|
8
|
+
*/
|
|
9
|
+
export declare const createUUIDv7: () => string;
|
|
10
|
+
//# sourceMappingURL=uuidv7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuidv7.d.ts","sourceRoot":"","sources":["../../../src/uuidv7.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,QAAO,MAyB/B,CAAC"}
|
|
@@ -22,9 +22,13 @@ interface CommonHotUpdaterOptions {
|
|
|
22
22
|
/**
|
|
23
23
|
* Sends app-ready transitions and same-Bundle Release adoptions to the
|
|
24
24
|
* configured server. Defaults to `true`; set to `false` to disable client
|
|
25
|
-
* reporting.
|
|
25
|
+
* reporting. Debug builds (`__DEV__`) send nothing unless you pass
|
|
26
|
+
* `{ debug: true }`, so development sessions stay out of production data.
|
|
26
27
|
*/
|
|
27
|
-
insights?: boolean
|
|
28
|
+
insights?: boolean | {
|
|
29
|
+
/** Also report from debug builds. Defaults to `false`. */
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
};
|
|
28
32
|
/** Base URL of a server exposing the Hot Updater v1 client HTTP protocol. */
|
|
29
33
|
baseURL: HotUpdaterBaseURL;
|
|
30
34
|
requestHeaders?: Record<string, string>;
|
|
@@ -42,6 +46,7 @@ export type AutoUpdateOptions = CommonHotUpdaterOptions & {
|
|
|
42
46
|
export type HotUpdaterInitOptions = CommonHotUpdaterOptions;
|
|
43
47
|
export type HotUpdaterOptions = AutoUpdateOptions;
|
|
44
48
|
type InternalCommonOptions = {
|
|
49
|
+
/** Whether this runtime reports, with the debug-build default applied. */
|
|
45
50
|
insights?: boolean;
|
|
46
51
|
client: HotUpdaterHttpClient;
|
|
47
52
|
requestHeaders?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.types.d.ts","sourceRoot":"","sources":["../../../src/wrap.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC7C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,UAAU,GACV,0BAA0B,CAAC;AAE/B,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC;AAEF,UAAU,uBAAuB;IAC/B
|
|
1
|
+
{"version":3,"file":"wrap.types.d.ts","sourceRoot":"","sources":["../../../src/wrap.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,12 @@ export type InsightsEventParams = InsightsTransitionEventParams | InsightsUnchan
|
|
|
45
45
|
export interface HotUpdaterHttpSession {
|
|
46
46
|
fetchReleaseCatalog: (params: ReleaseCatalogRequest) => Promise<ReleaseCatalog>;
|
|
47
47
|
resolveArtifact: (params: ArtifactRequest) => Promise<ArtifactInfo>;
|
|
48
|
+
/**
|
|
49
|
+
* Posts an Insights event under a client `eventId`, retrying a network
|
|
50
|
+
* error, timeout, 429 or 5xx for up to three attempts in all. Resolves once
|
|
51
|
+
* the event is delivered or left to background retries; rejects when its
|
|
52
|
+
* first attempt fails for good, such as with a 400.
|
|
53
|
+
*/
|
|
48
54
|
sendInsightsEvent: (params: InsightsEventParams) => Promise<void>;
|
|
49
55
|
}
|
|
50
56
|
export interface HotUpdaterHttpClient {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/httpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,aAAa,GAAG,YAAY,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,UAAU,yBAAyB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,KAAK,6BAA6B,GAAG,yBAAyB,GAAG;IAC/D,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,WAAW,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,aAAa,GAAG,YAAY,CAAC;CACvD,CAAC;AAEF,KAAK,4BAA4B,GAAG,yBAAyB,GAAG;IAC9D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,6BAA6B,GAC7B,4BAA4B,CAAC;AAEjC,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,EAAE,CACnB,MAAM,EAAE,qBAAqB,KAC1B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACrD;AAuUD,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,YAClB,iBAAiB,KACzB,oBAOF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EAIX,iBAAiB,EACjB,aAAa,EAEb,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,MAAM,EAEN,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAItB,IAAI,EACL,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gCAAgC,EAChC,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,QAAQ,CAAC;AAoBhB,KAAK,cAAc,GAAG;IACpB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACvD,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EAIX,iBAAiB,EACjB,aAAa,EAEb,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,MAAM,EAEN,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAItB,IAAI,EACL,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gCAAgC,EAChC,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,QAAQ,CAAC;AAoBhB,KAAK,cAAc,GAAG;IACpB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACvD,CAAC;AAiBF;;;GAGG;AACH,iBAAS,sBAAsB;IA6I3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;oBACa,iBAAiB;IAQjC;;;;;;;;;;;;;;OAcG;oBACa,qBAAqB,KAAG,IAAI;IAS5C;;OAEG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH,wDAAwD;;IAGxD;;;OAGG;;IAGH,wEAAwE;;IAGxE;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;OAIG;;IAGH;;;OAGG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;6BACsB,qBAAqB;IAkB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;2BAC0B,YAAY;IA8BzC;;;;OAIG;;IAcH;;;;;;;;;;OAUG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;EAGN;AAED,KAAK,gBAAgB,GAAG,IAAI,CAC1B,UAAU,CAAC,OAAO,sBAAsB,CAAC,EACzC,MAAM,CACP,GAAG;IACF,IAAI,EAAE,cAAc,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,gBAA2C,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const HOT_UPDATER_SDK_VERSION = "1.0.0-rc.
|
|
1
|
+
export declare const HOT_UPDATER_SDK_VERSION = "1.0.0-rc.16";
|
|
2
2
|
//# sourceMappingURL=sdkVersion.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an RFC 9562 UUIDv7: a 48-bit millisecond timestamp, then random bits.
|
|
3
|
+
*
|
|
4
|
+
* `createUUIDv7` from `@hot-updater/plugin-core` calls `crypto.getRandomValues`
|
|
5
|
+
* unconditionally, but React Native has no Web Crypto unless the app installs a
|
|
6
|
+
* polyfill. An Insights event ID only has to tell one event from another so a
|
|
7
|
+
* retried POST is counted once, so `Math.random` is enough without one.
|
|
8
|
+
*/
|
|
9
|
+
export declare const createUUIDv7: () => string;
|
|
10
|
+
//# sourceMappingURL=uuidv7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuidv7.d.ts","sourceRoot":"","sources":["../../../src/uuidv7.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,QAAO,MAyB/B,CAAC"}
|
|
@@ -22,9 +22,13 @@ interface CommonHotUpdaterOptions {
|
|
|
22
22
|
/**
|
|
23
23
|
* Sends app-ready transitions and same-Bundle Release adoptions to the
|
|
24
24
|
* configured server. Defaults to `true`; set to `false` to disable client
|
|
25
|
-
* reporting.
|
|
25
|
+
* reporting. Debug builds (`__DEV__`) send nothing unless you pass
|
|
26
|
+
* `{ debug: true }`, so development sessions stay out of production data.
|
|
26
27
|
*/
|
|
27
|
-
insights?: boolean
|
|
28
|
+
insights?: boolean | {
|
|
29
|
+
/** Also report from debug builds. Defaults to `false`. */
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
};
|
|
28
32
|
/** Base URL of a server exposing the Hot Updater v1 client HTTP protocol. */
|
|
29
33
|
baseURL: HotUpdaterBaseURL;
|
|
30
34
|
requestHeaders?: Record<string, string>;
|
|
@@ -42,6 +46,7 @@ export type AutoUpdateOptions = CommonHotUpdaterOptions & {
|
|
|
42
46
|
export type HotUpdaterInitOptions = CommonHotUpdaterOptions;
|
|
43
47
|
export type HotUpdaterOptions = AutoUpdateOptions;
|
|
44
48
|
type InternalCommonOptions = {
|
|
49
|
+
/** Whether this runtime reports, with the debug-build default applied. */
|
|
45
50
|
insights?: boolean;
|
|
46
51
|
client: HotUpdaterHttpClient;
|
|
47
52
|
requestHeaders?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.types.d.ts","sourceRoot":"","sources":["../../../src/wrap.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC7C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,UAAU,GACV,0BAA0B,CAAC;AAE/B,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC;AAEF,UAAU,uBAAuB;IAC/B
|
|
1
|
+
{"version":3,"file":"wrap.types.d.ts","sourceRoot":"","sources":["../../../src/wrap.types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.16",
|
|
4
4
|
"description": "React Native OTA solution for self-hosted",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"main": "./lib/commonjs/index.js",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"dependencies": {
|
|
122
122
|
"use-sync-external-store": "1.5.0",
|
|
123
123
|
"@hot-updater/core": "1.0.0-rc.15",
|
|
124
|
-
"@hot-updater/plugin-core": "1.0.0-rc.
|
|
124
|
+
"@hot-updater/plugin-core": "1.0.0-rc.16"
|
|
125
125
|
},
|
|
126
126
|
"scripts": {
|
|
127
127
|
"build": "node ./scripts/sync-sdk-version.mjs run -- bob build",
|
package/src/httpClient.spec.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
isUUIDv7,
|
|
3
|
+
type ArtifactInfo,
|
|
4
|
+
type ReleaseCatalog,
|
|
5
|
+
} from "@hot-updater/core";
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
7
|
|
|
4
8
|
import { FetchJSONResponseError } from "./fetchJSON";
|
|
5
|
-
import { createHttpClient } from "./httpClient";
|
|
9
|
+
import { createHttpClient, type InsightsEventParams } from "./httpClient";
|
|
6
10
|
|
|
7
11
|
const mocks = vi.hoisted(() => {
|
|
8
12
|
Reflect.set(globalThis, "HotUpdater", {
|
|
@@ -195,3 +199,215 @@ describe("private HotUpdater HTTP client", () => {
|
|
|
195
199
|
);
|
|
196
200
|
});
|
|
197
201
|
});
|
|
202
|
+
|
|
203
|
+
const unchangedEvent: InsightsEventParams = {
|
|
204
|
+
appVersion: "1.0.0",
|
|
205
|
+
channel: "production",
|
|
206
|
+
cohort: "123",
|
|
207
|
+
fingerprintHash: null,
|
|
208
|
+
fromBundleId: null,
|
|
209
|
+
installId: "install-id",
|
|
210
|
+
platform: "ios",
|
|
211
|
+
toBundleId: "bundle-id",
|
|
212
|
+
type: "UNCHANGED",
|
|
213
|
+
updateStrategy: null,
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
/** Answers each POST /events with the next response, then 204. */
|
|
217
|
+
const stubEventsEndpoint = (...responses: (number | Response | Error)[]) => {
|
|
218
|
+
const fetchMock = vi.fn<typeof fetch>(async () => {
|
|
219
|
+
const next = responses.shift() ?? 204;
|
|
220
|
+
if (next instanceof Error) throw next;
|
|
221
|
+
return typeof next === "number"
|
|
222
|
+
? new Response(null, { status: next })
|
|
223
|
+
: next;
|
|
224
|
+
});
|
|
225
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
226
|
+
const sentEvents = () =>
|
|
227
|
+
fetchMock.mock.calls.map(
|
|
228
|
+
([, request]) =>
|
|
229
|
+
JSON.parse(String(request?.body)) as {
|
|
230
|
+
eventId: string;
|
|
231
|
+
type: string;
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
return { fetchMock, sentEvents };
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
describe("Insights event delivery", () => {
|
|
238
|
+
beforeEach(() => {
|
|
239
|
+
vi.useFakeTimers();
|
|
240
|
+
// No jitter: the first retry waits exactly 1 s and the second 2 s.
|
|
241
|
+
vi.spyOn(Math, "random").mockReturnValue(0.5);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
afterEach(() => {
|
|
245
|
+
vi.useRealTimers();
|
|
246
|
+
vi.unstubAllGlobals();
|
|
247
|
+
vi.restoreAllMocks();
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
const createSession = () =>
|
|
251
|
+
createHttpClient("https://updates.example.com").createSession();
|
|
252
|
+
|
|
253
|
+
it("retries a 503 in the background under the same UUIDv7 eventId", async () => {
|
|
254
|
+
const { fetchMock, sentEvents } = stubEventsEndpoint(503, 204);
|
|
255
|
+
const session = await createSession();
|
|
256
|
+
|
|
257
|
+
// Settles after the failed first attempt, without waiting for the retry.
|
|
258
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
259
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
260
|
+
|
|
261
|
+
await vi.advanceTimersByTimeAsync(1_000);
|
|
262
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
263
|
+
const [first, second] = sentEvents();
|
|
264
|
+
expect(isUUIDv7(first?.eventId)).toBe(true);
|
|
265
|
+
expect(second?.eventId).toBe(first?.eventId);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("waits for a 429's Retry-After before the next attempt", async () => {
|
|
269
|
+
const { fetchMock } = stubEventsEndpoint(
|
|
270
|
+
new Response(null, { headers: { "Retry-After": "7" }, status: 429 }),
|
|
271
|
+
);
|
|
272
|
+
const session = await createSession();
|
|
273
|
+
|
|
274
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
275
|
+
await vi.advanceTimersByTimeAsync(6_999);
|
|
276
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
277
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
278
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it("caps a server's Retry-After at 30 seconds", async () => {
|
|
282
|
+
const { fetchMock } = stubEventsEndpoint(
|
|
283
|
+
new Response(null, { headers: { "Retry-After": "3600" }, status: 503 }),
|
|
284
|
+
);
|
|
285
|
+
const session = await createSession();
|
|
286
|
+
|
|
287
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
288
|
+
await vi.advanceTimersByTimeAsync(29_999);
|
|
289
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
290
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
291
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it("does not retry a 400", async () => {
|
|
295
|
+
const { fetchMock } = stubEventsEndpoint(400);
|
|
296
|
+
const session = await createSession();
|
|
297
|
+
|
|
298
|
+
await expect(session.sendInsightsEvent(unchangedEvent)).rejects.toThrow(
|
|
299
|
+
"Expected HTTP 204 from /events, received 400",
|
|
300
|
+
);
|
|
301
|
+
await vi.runAllTimersAsync();
|
|
302
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it("stops after three attempts and warns once", async () => {
|
|
306
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
307
|
+
const { fetchMock } = stubEventsEndpoint(
|
|
308
|
+
500,
|
|
309
|
+
new Error("network unavailable"),
|
|
310
|
+
503,
|
|
311
|
+
);
|
|
312
|
+
const session = await createSession();
|
|
313
|
+
|
|
314
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
315
|
+
await vi.runAllTimersAsync();
|
|
316
|
+
|
|
317
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
318
|
+
expect(warn).toHaveBeenCalledExactlyOnceWith(
|
|
319
|
+
"[HotUpdater] Insights UNCHANGED event was not delivered:",
|
|
320
|
+
expect.objectContaining({
|
|
321
|
+
message: "Expected HTTP 204 from /events, received 503",
|
|
322
|
+
}),
|
|
323
|
+
);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it("gives each attempt its own timeout", async () => {
|
|
327
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
328
|
+
const fetchMock = vi.fn<typeof fetch>(
|
|
329
|
+
(_input, request) =>
|
|
330
|
+
new Promise((_resolve, reject) => {
|
|
331
|
+
request?.signal?.addEventListener("abort", () => {
|
|
332
|
+
reject(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
333
|
+
});
|
|
334
|
+
}),
|
|
335
|
+
);
|
|
336
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
337
|
+
const session = await createSession();
|
|
338
|
+
|
|
339
|
+
const sent = session.sendInsightsEvent({
|
|
340
|
+
...unchangedEvent,
|
|
341
|
+
requestTimeout: 2_000,
|
|
342
|
+
});
|
|
343
|
+
await vi.advanceTimersByTimeAsync(2_000);
|
|
344
|
+
await sent;
|
|
345
|
+
// The second attempt starts after a 1 s backoff and gets a full 2 s.
|
|
346
|
+
await vi.advanceTimersByTimeAsync(1_000);
|
|
347
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
348
|
+
const secondSignal = fetchMock.mock.calls[1]?.[1]?.signal;
|
|
349
|
+
await vi.advanceTimersByTimeAsync(1_999);
|
|
350
|
+
expect(secondSignal?.aborted).toBe(false);
|
|
351
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
352
|
+
expect(secondSignal?.aborted).toBe(true);
|
|
353
|
+
await vi.runAllTimersAsync();
|
|
354
|
+
|
|
355
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
356
|
+
expect(warn).toHaveBeenCalledExactlyOnceWith(
|
|
357
|
+
"[HotUpdater] Insights UNCHANGED event was not delivered:",
|
|
358
|
+
expect.objectContaining({ message: "Request timed out" }),
|
|
359
|
+
);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it("sends a later event after an earlier event's retries without holding its caller", async () => {
|
|
363
|
+
const { fetchMock, sentEvents } = stubEventsEndpoint(503);
|
|
364
|
+
const session = await createSession();
|
|
365
|
+
|
|
366
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
367
|
+
await session.sendInsightsEvent({
|
|
368
|
+
...unchangedEvent,
|
|
369
|
+
fromBundleId: "bundle-id",
|
|
370
|
+
toBundleId: "next-bundle-id",
|
|
371
|
+
type: "UPDATE_DOWNLOADED",
|
|
372
|
+
updateStrategy: "appVersion",
|
|
373
|
+
});
|
|
374
|
+
expect(fetchMock).toHaveBeenCalledOnce();
|
|
375
|
+
|
|
376
|
+
await vi.runAllTimersAsync();
|
|
377
|
+
const [first, retry, later] = sentEvents();
|
|
378
|
+
expect([first?.type, retry?.type, later?.type]).toEqual([
|
|
379
|
+
"UNCHANGED",
|
|
380
|
+
"UNCHANGED",
|
|
381
|
+
"UPDATE_DOWNLOADED",
|
|
382
|
+
]);
|
|
383
|
+
expect(retry?.eventId).toBe(first?.eventId);
|
|
384
|
+
expect(later?.eventId).not.toBe(first?.eventId);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it("keeps sending events after one fails outside its requests", async () => {
|
|
388
|
+
vi.spyOn(console, "warn").mockImplementation(() => {
|
|
389
|
+
throw new Error("console unavailable");
|
|
390
|
+
});
|
|
391
|
+
const { fetchMock, sentEvents } = stubEventsEndpoint(500, 500, 500);
|
|
392
|
+
const session = await createSession();
|
|
393
|
+
|
|
394
|
+
await session.sendInsightsEvent(unchangedEvent);
|
|
395
|
+
await vi.runAllTimersAsync();
|
|
396
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
397
|
+
|
|
398
|
+
// A queue left rejected would never send this event or settle its caller.
|
|
399
|
+
await session.sendInsightsEvent({
|
|
400
|
+
...unchangedEvent,
|
|
401
|
+
fromBundleId: "bundle-id",
|
|
402
|
+
toBundleId: "next-bundle-id",
|
|
403
|
+
type: "UPDATE_DOWNLOADED",
|
|
404
|
+
updateStrategy: "appVersion",
|
|
405
|
+
});
|
|
406
|
+
expect(sentEvents().map(({ type }) => type)).toEqual([
|
|
407
|
+
"UNCHANGED",
|
|
408
|
+
"UNCHANGED",
|
|
409
|
+
"UNCHANGED",
|
|
410
|
+
"UPDATE_DOWNLOADED",
|
|
411
|
+
]);
|
|
412
|
+
});
|
|
413
|
+
});
|