@hot-updater/cloudflare 1.0.0-rc.35 → 1.0.0-rc.37
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/dist/index.d.cts +72 -2
- package/dist/index.d.mts +72 -2
- package/dist/worker/index.d.cts +72 -2
- package/dist/worker/index.d.mts +72 -2
- package/package.json +6 -6
- package/sql/bundles.sql +8 -0
- package/worker/dist/README.md +1 -1
- package/worker/dist/index.js +1576 -1352
- package/worker/dist/index.js.map +4 -4
- package/worker/migrations/0001_hot-updater_1.0.0.sql +8 -0
package/dist/index.d.cts
CHANGED
|
@@ -63,12 +63,33 @@ type DatabaseHttpResponse = DatabaseJsonObject & {
|
|
|
63
63
|
readonly body_truncated: boolean;
|
|
64
64
|
readonly received_at_ms: number;
|
|
65
65
|
};
|
|
66
|
+
/** What a kept UNCHANGED row changed against its installation's head. */
|
|
67
|
+
type BundleEventChangeKind = "first_seen" | "bundle" | "release" | "app_version" | "channel" | "native_build";
|
|
68
|
+
/**
|
|
69
|
+
* An UNCHANGED report the server keeps: what it changed against its
|
|
70
|
+
* installation's head, and the running values the head held before it. A
|
|
71
|
+
* report from an installation without a head is `first_seen` alone, with no
|
|
72
|
+
* previous values: the installation is new to this server, not necessarily
|
|
73
|
+
* to its device.
|
|
74
|
+
*/
|
|
75
|
+
type BundleEventChange = DatabaseJsonObject & {
|
|
76
|
+
readonly kinds: BundleEventChangeKind[];
|
|
77
|
+
readonly previous: (DatabaseJsonObject & {
|
|
78
|
+
readonly bundle_id: string;
|
|
79
|
+
readonly release_id: string | null;
|
|
80
|
+
readonly app_version: string;
|
|
81
|
+
readonly channel: string;
|
|
82
|
+
readonly min_bundle_id?: string;
|
|
83
|
+
}) | null;
|
|
84
|
+
};
|
|
66
85
|
/** Ancillary report data; queryable identity and lifecycle fields stay on the row. */
|
|
67
86
|
type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
68
87
|
readonly cohort: string;
|
|
69
88
|
readonly update_strategy: "fingerprint" | "appVersion" | null;
|
|
70
89
|
readonly fingerprint_hash: string | null;
|
|
71
90
|
readonly sdk_version: string | null;
|
|
91
|
+
/** The native build's built-in bundle ID, when the SDK reports it. */
|
|
92
|
+
readonly min_bundle_id?: string;
|
|
72
93
|
/** `UPDATE_FAILED`: what failed. */
|
|
73
94
|
readonly failure?: BundleEventFailure;
|
|
74
95
|
readonly http_response?: DatabaseHttpResponse;
|
|
@@ -76,6 +97,19 @@ type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
|
76
97
|
readonly delivery?: "patch" | "manifest" | "archive" | "unknown";
|
|
77
98
|
/** `UPDATE_DOWNLOADED`: a patch failed and the full files came instead. */
|
|
78
99
|
readonly patch_fallback?: boolean;
|
|
100
|
+
/** A kept `UNCHANGED` row: what it changed, which the server sets. */
|
|
101
|
+
readonly change?: BundleEventChange;
|
|
102
|
+
/**
|
|
103
|
+
* A download or apply that arrived after its installation already ran its
|
|
104
|
+
* target, as when a reload cut the first runtime's report short: the
|
|
105
|
+
* server keeps it in history, but it moves and counts nothing.
|
|
106
|
+
*/
|
|
107
|
+
readonly late?: true;
|
|
108
|
+
/**
|
|
109
|
+
* A launch or crash of a bundle whose download report never arrived: the
|
|
110
|
+
* server counted that download with it.
|
|
111
|
+
*/
|
|
112
|
+
readonly implied_download?: true;
|
|
79
113
|
};
|
|
80
114
|
type BundleEventRowBase = {
|
|
81
115
|
readonly id: string;
|
|
@@ -118,13 +152,14 @@ interface InsightsScope {
|
|
|
118
152
|
}
|
|
119
153
|
/**
|
|
120
154
|
* Raw event predicates; recovery is attributed to the source bundle. An
|
|
121
|
-
* UNCHANGED
|
|
155
|
+
* UNCHANGED filter matches the kept rows that moved an installation to the
|
|
156
|
+
* bundle without an apply report.
|
|
122
157
|
*/
|
|
123
158
|
type InsightsBundleEventFilter = InsightsScope & ({
|
|
124
159
|
readonly type: "RECOVERED";
|
|
125
160
|
readonly fromBundleId: string;
|
|
126
161
|
} | {
|
|
127
|
-
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED";
|
|
162
|
+
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED" | "UNCHANGED";
|
|
128
163
|
readonly toBundleId: string;
|
|
129
164
|
});
|
|
130
165
|
type InsightsEventFilter = {
|
|
@@ -244,7 +279,10 @@ interface InsightsGetAppUsageResult {
|
|
|
244
279
|
readonly bundleDistribution: readonly {
|
|
245
280
|
readonly appVersion: string;
|
|
246
281
|
readonly platform: "ios" | "android";
|
|
282
|
+
/** The release the installations run; null for none. */
|
|
247
283
|
readonly releaseId: string | null;
|
|
284
|
+
/** The native build's built-in bundle, when they run it. */
|
|
285
|
+
readonly builtinBundleId: string | null;
|
|
248
286
|
readonly installations: number;
|
|
249
287
|
}[];
|
|
250
288
|
readonly measuredAtMs: number;
|
|
@@ -575,6 +613,38 @@ declare const plugins: readonly [import("@hot-updater/plugin-core").HotUpdaterPl
|
|
|
575
613
|
readonly sort: readonly ["bucket_start_ms"];
|
|
576
614
|
};
|
|
577
615
|
}, never, readonly ["channel", "platform", "app_version", "release_id", "bucket_start_ms"]>;
|
|
616
|
+
readonly insights_builtin_distribution: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
617
|
+
readonly channel: {
|
|
618
|
+
readonly type: "string";
|
|
619
|
+
};
|
|
620
|
+
readonly platform: {
|
|
621
|
+
readonly type: "string";
|
|
622
|
+
readonly maxLength: 16;
|
|
623
|
+
};
|
|
624
|
+
readonly app_version: {
|
|
625
|
+
readonly type: "string";
|
|
626
|
+
};
|
|
627
|
+
readonly release_id: {
|
|
628
|
+
readonly type: "string";
|
|
629
|
+
readonly maxLength: 36;
|
|
630
|
+
};
|
|
631
|
+
readonly builtin_bundle_id: {
|
|
632
|
+
readonly type: "string";
|
|
633
|
+
readonly maxLength: 36;
|
|
634
|
+
};
|
|
635
|
+
readonly bucket_start_ms: {
|
|
636
|
+
readonly type: "integer";
|
|
637
|
+
};
|
|
638
|
+
}, "latest_installations", {
|
|
639
|
+
readonly byScope: {
|
|
640
|
+
readonly eq: readonly ["channel", "platform"];
|
|
641
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
642
|
+
};
|
|
643
|
+
readonly byVersion: {
|
|
644
|
+
readonly eq: readonly ["channel", "platform", "app_version"];
|
|
645
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
646
|
+
};
|
|
647
|
+
}, never, readonly ["channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms"]>;
|
|
578
648
|
readonly insights_latest_by_bundle: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
579
649
|
readonly platform: {
|
|
580
650
|
readonly type: "string";
|
package/dist/index.d.mts
CHANGED
|
@@ -63,12 +63,33 @@ type DatabaseHttpResponse = DatabaseJsonObject & {
|
|
|
63
63
|
readonly body_truncated: boolean;
|
|
64
64
|
readonly received_at_ms: number;
|
|
65
65
|
};
|
|
66
|
+
/** What a kept UNCHANGED row changed against its installation's head. */
|
|
67
|
+
type BundleEventChangeKind = "first_seen" | "bundle" | "release" | "app_version" | "channel" | "native_build";
|
|
68
|
+
/**
|
|
69
|
+
* An UNCHANGED report the server keeps: what it changed against its
|
|
70
|
+
* installation's head, and the running values the head held before it. A
|
|
71
|
+
* report from an installation without a head is `first_seen` alone, with no
|
|
72
|
+
* previous values: the installation is new to this server, not necessarily
|
|
73
|
+
* to its device.
|
|
74
|
+
*/
|
|
75
|
+
type BundleEventChange = DatabaseJsonObject & {
|
|
76
|
+
readonly kinds: BundleEventChangeKind[];
|
|
77
|
+
readonly previous: (DatabaseJsonObject & {
|
|
78
|
+
readonly bundle_id: string;
|
|
79
|
+
readonly release_id: string | null;
|
|
80
|
+
readonly app_version: string;
|
|
81
|
+
readonly channel: string;
|
|
82
|
+
readonly min_bundle_id?: string;
|
|
83
|
+
}) | null;
|
|
84
|
+
};
|
|
66
85
|
/** Ancillary report data; queryable identity and lifecycle fields stay on the row. */
|
|
67
86
|
type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
68
87
|
readonly cohort: string;
|
|
69
88
|
readonly update_strategy: "fingerprint" | "appVersion" | null;
|
|
70
89
|
readonly fingerprint_hash: string | null;
|
|
71
90
|
readonly sdk_version: string | null;
|
|
91
|
+
/** The native build's built-in bundle ID, when the SDK reports it. */
|
|
92
|
+
readonly min_bundle_id?: string;
|
|
72
93
|
/** `UPDATE_FAILED`: what failed. */
|
|
73
94
|
readonly failure?: BundleEventFailure;
|
|
74
95
|
readonly http_response?: DatabaseHttpResponse;
|
|
@@ -76,6 +97,19 @@ type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
|
76
97
|
readonly delivery?: "patch" | "manifest" | "archive" | "unknown";
|
|
77
98
|
/** `UPDATE_DOWNLOADED`: a patch failed and the full files came instead. */
|
|
78
99
|
readonly patch_fallback?: boolean;
|
|
100
|
+
/** A kept `UNCHANGED` row: what it changed, which the server sets. */
|
|
101
|
+
readonly change?: BundleEventChange;
|
|
102
|
+
/**
|
|
103
|
+
* A download or apply that arrived after its installation already ran its
|
|
104
|
+
* target, as when a reload cut the first runtime's report short: the
|
|
105
|
+
* server keeps it in history, but it moves and counts nothing.
|
|
106
|
+
*/
|
|
107
|
+
readonly late?: true;
|
|
108
|
+
/**
|
|
109
|
+
* A launch or crash of a bundle whose download report never arrived: the
|
|
110
|
+
* server counted that download with it.
|
|
111
|
+
*/
|
|
112
|
+
readonly implied_download?: true;
|
|
79
113
|
};
|
|
80
114
|
type BundleEventRowBase = {
|
|
81
115
|
readonly id: string;
|
|
@@ -118,13 +152,14 @@ interface InsightsScope {
|
|
|
118
152
|
}
|
|
119
153
|
/**
|
|
120
154
|
* Raw event predicates; recovery is attributed to the source bundle. An
|
|
121
|
-
* UNCHANGED
|
|
155
|
+
* UNCHANGED filter matches the kept rows that moved an installation to the
|
|
156
|
+
* bundle without an apply report.
|
|
122
157
|
*/
|
|
123
158
|
type InsightsBundleEventFilter = InsightsScope & ({
|
|
124
159
|
readonly type: "RECOVERED";
|
|
125
160
|
readonly fromBundleId: string;
|
|
126
161
|
} | {
|
|
127
|
-
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED";
|
|
162
|
+
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED" | "UNCHANGED";
|
|
128
163
|
readonly toBundleId: string;
|
|
129
164
|
});
|
|
130
165
|
type InsightsEventFilter = {
|
|
@@ -244,7 +279,10 @@ interface InsightsGetAppUsageResult {
|
|
|
244
279
|
readonly bundleDistribution: readonly {
|
|
245
280
|
readonly appVersion: string;
|
|
246
281
|
readonly platform: "ios" | "android";
|
|
282
|
+
/** The release the installations run; null for none. */
|
|
247
283
|
readonly releaseId: string | null;
|
|
284
|
+
/** The native build's built-in bundle, when they run it. */
|
|
285
|
+
readonly builtinBundleId: string | null;
|
|
248
286
|
readonly installations: number;
|
|
249
287
|
}[];
|
|
250
288
|
readonly measuredAtMs: number;
|
|
@@ -575,6 +613,38 @@ declare const plugins: readonly [import("@hot-updater/plugin-core").HotUpdaterPl
|
|
|
575
613
|
readonly sort: readonly ["bucket_start_ms"];
|
|
576
614
|
};
|
|
577
615
|
}, never, readonly ["channel", "platform", "app_version", "release_id", "bucket_start_ms"]>;
|
|
616
|
+
readonly insights_builtin_distribution: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
617
|
+
readonly channel: {
|
|
618
|
+
readonly type: "string";
|
|
619
|
+
};
|
|
620
|
+
readonly platform: {
|
|
621
|
+
readonly type: "string";
|
|
622
|
+
readonly maxLength: 16;
|
|
623
|
+
};
|
|
624
|
+
readonly app_version: {
|
|
625
|
+
readonly type: "string";
|
|
626
|
+
};
|
|
627
|
+
readonly release_id: {
|
|
628
|
+
readonly type: "string";
|
|
629
|
+
readonly maxLength: 36;
|
|
630
|
+
};
|
|
631
|
+
readonly builtin_bundle_id: {
|
|
632
|
+
readonly type: "string";
|
|
633
|
+
readonly maxLength: 36;
|
|
634
|
+
};
|
|
635
|
+
readonly bucket_start_ms: {
|
|
636
|
+
readonly type: "integer";
|
|
637
|
+
};
|
|
638
|
+
}, "latest_installations", {
|
|
639
|
+
readonly byScope: {
|
|
640
|
+
readonly eq: readonly ["channel", "platform"];
|
|
641
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
642
|
+
};
|
|
643
|
+
readonly byVersion: {
|
|
644
|
+
readonly eq: readonly ["channel", "platform", "app_version"];
|
|
645
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
646
|
+
};
|
|
647
|
+
}, never, readonly ["channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms"]>;
|
|
578
648
|
readonly insights_latest_by_bundle: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
579
649
|
readonly platform: {
|
|
580
650
|
readonly type: "string";
|
package/dist/worker/index.d.cts
CHANGED
|
@@ -51,12 +51,33 @@ type DatabaseHttpResponse = DatabaseJsonObject & {
|
|
|
51
51
|
readonly body_truncated: boolean;
|
|
52
52
|
readonly received_at_ms: number;
|
|
53
53
|
};
|
|
54
|
+
/** What a kept UNCHANGED row changed against its installation's head. */
|
|
55
|
+
type BundleEventChangeKind = "first_seen" | "bundle" | "release" | "app_version" | "channel" | "native_build";
|
|
56
|
+
/**
|
|
57
|
+
* An UNCHANGED report the server keeps: what it changed against its
|
|
58
|
+
* installation's head, and the running values the head held before it. A
|
|
59
|
+
* report from an installation without a head is `first_seen` alone, with no
|
|
60
|
+
* previous values: the installation is new to this server, not necessarily
|
|
61
|
+
* to its device.
|
|
62
|
+
*/
|
|
63
|
+
type BundleEventChange = DatabaseJsonObject & {
|
|
64
|
+
readonly kinds: BundleEventChangeKind[];
|
|
65
|
+
readonly previous: (DatabaseJsonObject & {
|
|
66
|
+
readonly bundle_id: string;
|
|
67
|
+
readonly release_id: string | null;
|
|
68
|
+
readonly app_version: string;
|
|
69
|
+
readonly channel: string;
|
|
70
|
+
readonly min_bundle_id?: string;
|
|
71
|
+
}) | null;
|
|
72
|
+
};
|
|
54
73
|
/** Ancillary report data; queryable identity and lifecycle fields stay on the row. */
|
|
55
74
|
type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
56
75
|
readonly cohort: string;
|
|
57
76
|
readonly update_strategy: "fingerprint" | "appVersion" | null;
|
|
58
77
|
readonly fingerprint_hash: string | null;
|
|
59
78
|
readonly sdk_version: string | null;
|
|
79
|
+
/** The native build's built-in bundle ID, when the SDK reports it. */
|
|
80
|
+
readonly min_bundle_id?: string;
|
|
60
81
|
/** `UPDATE_FAILED`: what failed. */
|
|
61
82
|
readonly failure?: BundleEventFailure;
|
|
62
83
|
readonly http_response?: DatabaseHttpResponse;
|
|
@@ -64,6 +85,19 @@ type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
|
64
85
|
readonly delivery?: "patch" | "manifest" | "archive" | "unknown";
|
|
65
86
|
/** `UPDATE_DOWNLOADED`: a patch failed and the full files came instead. */
|
|
66
87
|
readonly patch_fallback?: boolean;
|
|
88
|
+
/** A kept `UNCHANGED` row: what it changed, which the server sets. */
|
|
89
|
+
readonly change?: BundleEventChange;
|
|
90
|
+
/**
|
|
91
|
+
* A download or apply that arrived after its installation already ran its
|
|
92
|
+
* target, as when a reload cut the first runtime's report short: the
|
|
93
|
+
* server keeps it in history, but it moves and counts nothing.
|
|
94
|
+
*/
|
|
95
|
+
readonly late?: true;
|
|
96
|
+
/**
|
|
97
|
+
* A launch or crash of a bundle whose download report never arrived: the
|
|
98
|
+
* server counted that download with it.
|
|
99
|
+
*/
|
|
100
|
+
readonly implied_download?: true;
|
|
67
101
|
};
|
|
68
102
|
type BundleEventRowBase = {
|
|
69
103
|
readonly id: string;
|
|
@@ -106,13 +140,14 @@ interface InsightsScope {
|
|
|
106
140
|
}
|
|
107
141
|
/**
|
|
108
142
|
* Raw event predicates; recovery is attributed to the source bundle. An
|
|
109
|
-
* UNCHANGED
|
|
143
|
+
* UNCHANGED filter matches the kept rows that moved an installation to the
|
|
144
|
+
* bundle without an apply report.
|
|
110
145
|
*/
|
|
111
146
|
type InsightsBundleEventFilter = InsightsScope & ({
|
|
112
147
|
readonly type: "RECOVERED";
|
|
113
148
|
readonly fromBundleId: string;
|
|
114
149
|
} | {
|
|
115
|
-
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED";
|
|
150
|
+
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED" | "UNCHANGED";
|
|
116
151
|
readonly toBundleId: string;
|
|
117
152
|
});
|
|
118
153
|
type InsightsEventFilter = {
|
|
@@ -232,7 +267,10 @@ interface InsightsGetAppUsageResult {
|
|
|
232
267
|
readonly bundleDistribution: readonly {
|
|
233
268
|
readonly appVersion: string;
|
|
234
269
|
readonly platform: "ios" | "android";
|
|
270
|
+
/** The release the installations run; null for none. */
|
|
235
271
|
readonly releaseId: string | null;
|
|
272
|
+
/** The native build's built-in bundle, when they run it. */
|
|
273
|
+
readonly builtinBundleId: string | null;
|
|
236
274
|
readonly installations: number;
|
|
237
275
|
}[];
|
|
238
276
|
readonly measuredAtMs: number;
|
|
@@ -563,6 +601,38 @@ declare const plugins: readonly [import("@hot-updater/plugin-core").HotUpdaterPl
|
|
|
563
601
|
readonly sort: readonly ["bucket_start_ms"];
|
|
564
602
|
};
|
|
565
603
|
}, never, readonly ["channel", "platform", "app_version", "release_id", "bucket_start_ms"]>;
|
|
604
|
+
readonly insights_builtin_distribution: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
605
|
+
readonly channel: {
|
|
606
|
+
readonly type: "string";
|
|
607
|
+
};
|
|
608
|
+
readonly platform: {
|
|
609
|
+
readonly type: "string";
|
|
610
|
+
readonly maxLength: 16;
|
|
611
|
+
};
|
|
612
|
+
readonly app_version: {
|
|
613
|
+
readonly type: "string";
|
|
614
|
+
};
|
|
615
|
+
readonly release_id: {
|
|
616
|
+
readonly type: "string";
|
|
617
|
+
readonly maxLength: 36;
|
|
618
|
+
};
|
|
619
|
+
readonly builtin_bundle_id: {
|
|
620
|
+
readonly type: "string";
|
|
621
|
+
readonly maxLength: 36;
|
|
622
|
+
};
|
|
623
|
+
readonly bucket_start_ms: {
|
|
624
|
+
readonly type: "integer";
|
|
625
|
+
};
|
|
626
|
+
}, "latest_installations", {
|
|
627
|
+
readonly byScope: {
|
|
628
|
+
readonly eq: readonly ["channel", "platform"];
|
|
629
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
630
|
+
};
|
|
631
|
+
readonly byVersion: {
|
|
632
|
+
readonly eq: readonly ["channel", "platform", "app_version"];
|
|
633
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
634
|
+
};
|
|
635
|
+
}, never, readonly ["channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms"]>;
|
|
566
636
|
readonly insights_latest_by_bundle: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
567
637
|
readonly platform: {
|
|
568
638
|
readonly type: "string";
|
package/dist/worker/index.d.mts
CHANGED
|
@@ -51,12 +51,33 @@ type DatabaseHttpResponse = DatabaseJsonObject & {
|
|
|
51
51
|
readonly body_truncated: boolean;
|
|
52
52
|
readonly received_at_ms: number;
|
|
53
53
|
};
|
|
54
|
+
/** What a kept UNCHANGED row changed against its installation's head. */
|
|
55
|
+
type BundleEventChangeKind = "first_seen" | "bundle" | "release" | "app_version" | "channel" | "native_build";
|
|
56
|
+
/**
|
|
57
|
+
* An UNCHANGED report the server keeps: what it changed against its
|
|
58
|
+
* installation's head, and the running values the head held before it. A
|
|
59
|
+
* report from an installation without a head is `first_seen` alone, with no
|
|
60
|
+
* previous values: the installation is new to this server, not necessarily
|
|
61
|
+
* to its device.
|
|
62
|
+
*/
|
|
63
|
+
type BundleEventChange = DatabaseJsonObject & {
|
|
64
|
+
readonly kinds: BundleEventChangeKind[];
|
|
65
|
+
readonly previous: (DatabaseJsonObject & {
|
|
66
|
+
readonly bundle_id: string;
|
|
67
|
+
readonly release_id: string | null;
|
|
68
|
+
readonly app_version: string;
|
|
69
|
+
readonly channel: string;
|
|
70
|
+
readonly min_bundle_id?: string;
|
|
71
|
+
}) | null;
|
|
72
|
+
};
|
|
54
73
|
/** Ancillary report data; queryable identity and lifecycle fields stay on the row. */
|
|
55
74
|
type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
56
75
|
readonly cohort: string;
|
|
57
76
|
readonly update_strategy: "fingerprint" | "appVersion" | null;
|
|
58
77
|
readonly fingerprint_hash: string | null;
|
|
59
78
|
readonly sdk_version: string | null;
|
|
79
|
+
/** The native build's built-in bundle ID, when the SDK reports it. */
|
|
80
|
+
readonly min_bundle_id?: string;
|
|
60
81
|
/** `UPDATE_FAILED`: what failed. */
|
|
61
82
|
readonly failure?: BundleEventFailure;
|
|
62
83
|
readonly http_response?: DatabaseHttpResponse;
|
|
@@ -64,6 +85,19 @@ type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
|
64
85
|
readonly delivery?: "patch" | "manifest" | "archive" | "unknown";
|
|
65
86
|
/** `UPDATE_DOWNLOADED`: a patch failed and the full files came instead. */
|
|
66
87
|
readonly patch_fallback?: boolean;
|
|
88
|
+
/** A kept `UNCHANGED` row: what it changed, which the server sets. */
|
|
89
|
+
readonly change?: BundleEventChange;
|
|
90
|
+
/**
|
|
91
|
+
* A download or apply that arrived after its installation already ran its
|
|
92
|
+
* target, as when a reload cut the first runtime's report short: the
|
|
93
|
+
* server keeps it in history, but it moves and counts nothing.
|
|
94
|
+
*/
|
|
95
|
+
readonly late?: true;
|
|
96
|
+
/**
|
|
97
|
+
* A launch or crash of a bundle whose download report never arrived: the
|
|
98
|
+
* server counted that download with it.
|
|
99
|
+
*/
|
|
100
|
+
readonly implied_download?: true;
|
|
67
101
|
};
|
|
68
102
|
type BundleEventRowBase = {
|
|
69
103
|
readonly id: string;
|
|
@@ -106,13 +140,14 @@ interface InsightsScope {
|
|
|
106
140
|
}
|
|
107
141
|
/**
|
|
108
142
|
* Raw event predicates; recovery is attributed to the source bundle. An
|
|
109
|
-
* UNCHANGED
|
|
143
|
+
* UNCHANGED filter matches the kept rows that moved an installation to the
|
|
144
|
+
* bundle without an apply report.
|
|
110
145
|
*/
|
|
111
146
|
type InsightsBundleEventFilter = InsightsScope & ({
|
|
112
147
|
readonly type: "RECOVERED";
|
|
113
148
|
readonly fromBundleId: string;
|
|
114
149
|
} | {
|
|
115
|
-
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED";
|
|
150
|
+
readonly type: "UPDATE_DOWNLOADED" | "UPDATE_APPLIED" | "UPDATE_FAILED" | "UNCHANGED";
|
|
116
151
|
readonly toBundleId: string;
|
|
117
152
|
});
|
|
118
153
|
type InsightsEventFilter = {
|
|
@@ -232,7 +267,10 @@ interface InsightsGetAppUsageResult {
|
|
|
232
267
|
readonly bundleDistribution: readonly {
|
|
233
268
|
readonly appVersion: string;
|
|
234
269
|
readonly platform: "ios" | "android";
|
|
270
|
+
/** The release the installations run; null for none. */
|
|
235
271
|
readonly releaseId: string | null;
|
|
272
|
+
/** The native build's built-in bundle, when they run it. */
|
|
273
|
+
readonly builtinBundleId: string | null;
|
|
236
274
|
readonly installations: number;
|
|
237
275
|
}[];
|
|
238
276
|
readonly measuredAtMs: number;
|
|
@@ -563,6 +601,38 @@ declare const plugins: readonly [import("@hot-updater/plugin-core").HotUpdaterPl
|
|
|
563
601
|
readonly sort: readonly ["bucket_start_ms"];
|
|
564
602
|
};
|
|
565
603
|
}, never, readonly ["channel", "platform", "app_version", "release_id", "bucket_start_ms"]>;
|
|
604
|
+
readonly insights_builtin_distribution: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
605
|
+
readonly channel: {
|
|
606
|
+
readonly type: "string";
|
|
607
|
+
};
|
|
608
|
+
readonly platform: {
|
|
609
|
+
readonly type: "string";
|
|
610
|
+
readonly maxLength: 16;
|
|
611
|
+
};
|
|
612
|
+
readonly app_version: {
|
|
613
|
+
readonly type: "string";
|
|
614
|
+
};
|
|
615
|
+
readonly release_id: {
|
|
616
|
+
readonly type: "string";
|
|
617
|
+
readonly maxLength: 36;
|
|
618
|
+
};
|
|
619
|
+
readonly builtin_bundle_id: {
|
|
620
|
+
readonly type: "string";
|
|
621
|
+
readonly maxLength: 36;
|
|
622
|
+
};
|
|
623
|
+
readonly bucket_start_ms: {
|
|
624
|
+
readonly type: "integer";
|
|
625
|
+
};
|
|
626
|
+
}, "latest_installations", {
|
|
627
|
+
readonly byScope: {
|
|
628
|
+
readonly eq: readonly ["channel", "platform"];
|
|
629
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
630
|
+
};
|
|
631
|
+
readonly byVersion: {
|
|
632
|
+
readonly eq: readonly ["channel", "platform", "app_version"];
|
|
633
|
+
readonly sort: readonly ["bucket_start_ms"];
|
|
634
|
+
};
|
|
635
|
+
}, never, readonly ["channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms"]>;
|
|
566
636
|
readonly insights_latest_by_bundle: import("@hot-updater/plugin-core").AggregateDefinition<{
|
|
567
637
|
readonly platform: {
|
|
568
638
|
readonly type: "string";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/cloudflare",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.37",
|
|
5
5
|
"description": "React Native OTA solution for self-hosted",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
7
7
|
"module": "dist/index.mjs",
|
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
"cloudflare": "4.2.0",
|
|
57
57
|
"hono": "4.12.34",
|
|
58
58
|
"uuidv7": "^1.0.2",
|
|
59
|
-
"@hot-updater/cli-tools": "1.0.0-rc.
|
|
60
|
-
"@hot-updater/protocol": "1.0.0-rc.
|
|
61
|
-
"@hot-updater/plugin-core": "1.0.0-rc.
|
|
62
|
-
"@hot-updater/server": "1.0.0-rc.
|
|
59
|
+
"@hot-updater/cli-tools": "1.0.0-rc.37",
|
|
60
|
+
"@hot-updater/protocol": "1.0.0-rc.37",
|
|
61
|
+
"@hot-updater/plugin-core": "1.0.0-rc.37",
|
|
62
|
+
"@hot-updater/server": "1.0.0-rc.37"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@cloudflare/vitest-pool-workers": "0.13.0",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"vitest": "4.1.4",
|
|
76
76
|
"wrangler": "^4.69.0",
|
|
77
77
|
"xdg-app-paths": "^8.3.0",
|
|
78
|
-
"@hot-updater/test-utils": "1.0.0-rc.
|
|
78
|
+
"@hot-updater/test-utils": "1.0.0-rc.37"
|
|
79
79
|
},
|
|
80
80
|
"scripts": {
|
|
81
81
|
"build": "tsdown && pnpm build:worker",
|
package/sql/bundles.sql
CHANGED
|
@@ -78,6 +78,14 @@ CREATE INDEX IF NOT EXISTS "insights_distribution_byVersion" ON "insights_distri
|
|
|
78
78
|
|
|
79
79
|
CREATE INDEX IF NOT EXISTS "insights_distribution__retention" ON "insights_distribution" ("bucket_start_ms", "channel", "platform", "app_version", "release_id", "_shard");
|
|
80
80
|
|
|
81
|
+
CREATE TABLE IF NOT EXISTS "insights_builtin_distribution" ("channel" TEXT NOT NULL, "platform" TEXT NOT NULL, "app_version" TEXT NOT NULL, "release_id" TEXT NOT NULL, "builtin_bundle_id" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "latest_installations" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms", "_shard"));
|
|
82
|
+
|
|
83
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution_byScope" ON "insights_builtin_distribution" ("channel", "platform", "bucket_start_ms", "app_version", "release_id", "builtin_bundle_id", "_shard");
|
|
84
|
+
|
|
85
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution_byVersion" ON "insights_builtin_distribution" ("channel", "platform", "app_version", "bucket_start_ms", "release_id", "builtin_bundle_id", "_shard");
|
|
86
|
+
|
|
87
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution__retention" ON "insights_builtin_distribution" ("bucket_start_ms", "channel", "platform", "app_version", "release_id", "builtin_bundle_id", "_shard");
|
|
88
|
+
|
|
81
89
|
CREATE TABLE IF NOT EXISTS "insights_latest_by_bundle" ("platform" TEXT NOT NULL, "channel" TEXT NOT NULL, "bundle_field" TEXT NOT NULL, "bundle_id" TEXT NOT NULL, "type" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "installations" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("platform", "channel", "bundle_field", "bundle_id", "type", "bucket_start_ms", "_shard"));
|
|
82
90
|
|
|
83
91
|
CREATE INDEX IF NOT EXISTS "insights_latest_by_bundle__retention" ON "insights_latest_by_bundle" ("bucket_start_ms", "platform", "channel", "bundle_field", "bundle_id", "type", "_shard");
|
package/worker/dist/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-
|
|
1
|
+
This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-07T03:20:22.698Z.
|