@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.
Files changed (56) hide show
  1. package/lib/commonjs/httpClient.js +107 -12
  2. package/lib/commonjs/httpClient.js.map +1 -1
  3. package/lib/commonjs/httpClient.spec.js +190 -0
  4. package/lib/commonjs/httpClient.spec.js.map +1 -1
  5. package/lib/commonjs/index.js +13 -2
  6. package/lib/commonjs/index.js.map +1 -1
  7. package/lib/commonjs/index.spec.js +101 -0
  8. package/lib/commonjs/index.spec.js.map +1 -1
  9. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +48 -1
  10. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +1 -1
  11. package/lib/commonjs/sdkVersion.js +1 -1
  12. package/lib/commonjs/uuidv7.js +41 -0
  13. package/lib/commonjs/uuidv7.js.map +1 -0
  14. package/lib/commonjs/uuidv7.spec.js +30 -0
  15. package/lib/commonjs/uuidv7.spec.js.map +1 -0
  16. package/lib/module/httpClient.js +107 -12
  17. package/lib/module/httpClient.js.map +1 -1
  18. package/lib/module/httpClient.spec.js +191 -1
  19. package/lib/module/httpClient.spec.js.map +1 -1
  20. package/lib/module/index.js +13 -2
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/index.spec.js +102 -1
  23. package/lib/module/index.spec.js.map +1 -1
  24. package/lib/module/notifyAppReadyInsights.transport.spec.js +48 -1
  25. package/lib/module/notifyAppReadyInsights.transport.spec.js.map +1 -1
  26. package/lib/module/sdkVersion.js +1 -1
  27. package/lib/module/uuidv7.js +36 -0
  28. package/lib/module/uuidv7.js.map +1 -0
  29. package/lib/module/uuidv7.spec.js +30 -0
  30. package/lib/module/uuidv7.spec.js.map +1 -0
  31. package/lib/typescript/commonjs/httpClient.d.ts +6 -0
  32. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  34. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  35. package/lib/typescript/commonjs/uuidv7.d.ts +10 -0
  36. package/lib/typescript/commonjs/uuidv7.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/wrap.types.d.ts +7 -2
  38. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
  39. package/lib/typescript/module/httpClient.d.ts +6 -0
  40. package/lib/typescript/module/httpClient.d.ts.map +1 -1
  41. package/lib/typescript/module/index.d.ts.map +1 -1
  42. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  43. package/lib/typescript/module/uuidv7.d.ts +10 -0
  44. package/lib/typescript/module/uuidv7.d.ts.map +1 -0
  45. package/lib/typescript/module/wrap.types.d.ts +7 -2
  46. package/lib/typescript/module/wrap.types.d.ts.map +1 -1
  47. package/package.json +2 -2
  48. package/src/httpClient.spec.ts +219 -3
  49. package/src/httpClient.ts +157 -14
  50. package/src/index.spec.ts +70 -1
  51. package/src/index.ts +17 -2
  52. package/src/notifyAppReadyInsights.transport.spec.ts +58 -0
  53. package/src/sdkVersion.ts +1 -1
  54. package/src/uuidv7.spec.ts +25 -0
  55. package/src/uuidv7.ts +38 -0
  56. 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":"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"}
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;AAEF;;;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
+ {"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.15";
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":"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"}
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":"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"}
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;AAEF;;;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
+ {"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.15";
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":"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"}
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.15",
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.15"
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",
@@ -1,8 +1,12 @@
1
- import type { ArtifactInfo, ReleaseCatalog } from "@hot-updater/core";
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
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
+ });