Skip to content

Commit e99e7d0

Browse files
committed
Report download status and duration
1 parent edd2d36 commit e99e7d0

4 files changed

Lines changed: 42 additions & 14 deletions

File tree

package-mixins.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NativeEventEmitter } from "react-native";
22
import log from "./logging";
3+
import { DownloadAcquisitionStatus } from "./lib/acquisition-sdk/acquisition-sdk";
34

45
// Reporting this event is important, but avoid blocking install()/restartApp() indefinitely
56
// on a stalled network request.
@@ -39,22 +40,33 @@ module.exports = (NativeCodePush) => {
3940
);
4041
}
4142

43+
const downloadStartTime = Date.now();
44+
const reportDownloadStatus = async (status) => {
45+
if (!reportStatusDownload) return;
46+
const downloadDurationMs = Date.now() - downloadStartTime;
47+
try {
48+
await withTimeout(reportStatusDownload({ ...this, downloadDurationMs, status }), REPORT_STATUS_DOWNLOAD_TIMEOUT_MS);
49+
} catch (err) {
50+
log(`Report download status failed: ${err}`);
51+
}
52+
};
53+
4254
// Use the downloaded package info. Native code will save the package info
4355
// so that the client knows what the current package version is.
4456
try {
4557
const updatePackageCopy = Object.assign({}, this);
4658
Object.keys(updatePackageCopy).forEach((key) => (typeof updatePackageCopy[key] === 'function') && delete updatePackageCopy[key]);
4759

48-
const downloadedPackage = await NativeCodePush.downloadUpdate(updatePackageCopy, !!downloadProgressCallback);
49-
50-
if (reportStatusDownload) {
51-
try {
52-
await withTimeout(reportStatusDownload(this), REPORT_STATUS_DOWNLOAD_TIMEOUT_MS);
53-
} catch (err) {
54-
log(`Report download status failed: ${err}`);
55-
}
60+
let downloadedPackage;
61+
try {
62+
downloadedPackage = await NativeCodePush.downloadUpdate(updatePackageCopy, !!downloadProgressCallback);
63+
} catch (err) {
64+
await reportDownloadStatus(DownloadAcquisitionStatus.Failed);
65+
throw err;
5666
}
5767

68+
await reportDownloadStatus(DownloadAcquisitionStatus.Succeeded);
69+
5870
return { ...downloadedPackage, ...local };
5971
} finally {
6072
downloadProgressSubscription && downloadProgressSubscription.remove();

src/acquisition-sdk/__tests__/acquisition-sdk.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ describe("Acquisition SDK", () => {
222222
it("reportStatusDownload(...) signals completion", (done: Mocha.Done): void => {
223223
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
224224

225-
acquisition.reportStatusDownload(templateCurrentPackage, ((error: Error, parameter: void): void => {
225+
acquisition.reportStatusDownload({ ...templateCurrentPackage, status: acquisitionSdk.DownloadAcquisitionStatus.Succeeded }, ((error: Error, parameter: void): void => {
226226
if (error) {
227227
throw error;
228228
}
@@ -261,7 +261,7 @@ describe("Acquisition SDK", () => {
261261
(acquisitionSdk.AcquisitionManager as any)._apiCallsDisabled = false;
262262
}));
263263

264-
acquisition.reportStatusDownload(templateCurrentPackage, ((error: Error, parameter: void): void => {
264+
acquisition.reportStatusDownload({ ...templateCurrentPackage, status: acquisitionSdk.DownloadAcquisitionStatus.Succeeded }, ((error: Error, parameter: void): void => {
265265
assert.strictEqual((acquisitionSdk.AcquisitionManager as any)._apiCallsDisabled, true);
266266
acquisition = acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.CustomResponseHttpRequester(invalidJsonResponse), configuration);
267267
(acquisitionSdk.AcquisitionManager as any)._apiCallsDisabled = false;
@@ -287,7 +287,7 @@ describe("Acquisition SDK", () => {
287287
assert.strictEqual((acquisitionSdk.AcquisitionManager as any)._apiCallsDisabled, false);
288288
}));
289289

290-
acquisition.reportStatusDownload(templateCurrentPackage, ((error: Error, parameter: void): void => {
290+
acquisition.reportStatusDownload({ ...templateCurrentPackage, status: acquisitionSdk.DownloadAcquisitionStatus.Succeeded }, ((error: Error, parameter: void): void => {
291291
assert.strictEqual((acquisitionSdk.AcquisitionManager as any)._apiCallsDisabled, false);
292292
}));
293293

src/acquisition-sdk/acquisition-sdk.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Vendored from https://github.com/microsoft/code-push/blob/master/src/script/acquisition-sdk.ts (archived, MIT licensed)
22

3-
import { UpdateCheckResponse, UpdateCheckRequest, DeploymentStatusReport, DownloadReport } from "./types";
3+
import { UpdateCheckResponse, UpdateCheckRequest, DeploymentStatusReport, DownloadReport, DownloadStatus } from "./types";
44
import { CodePushHttpError, CodePushDeployStatusError, CodePushPackageError } from "./code-push-error"
55

66
export namespace Http {
@@ -35,6 +35,11 @@ export interface RemotePackage extends Package {
3535
downloadUrl: string;
3636
}
3737

38+
export interface DownloadedPackage extends Package {
39+
downloadDurationMs?: number;
40+
status: DownloadStatus;
41+
}
42+
3843
export interface NativeUpdateNotification {
3944
updateAppVersion: boolean; // Always true
4045
appVersion: string;
@@ -59,6 +64,11 @@ export class AcquisitionStatus {
5964
public static DeploymentFailed = "DeploymentFailed";
6065
}
6166

67+
export class DownloadAcquisitionStatus {
68+
public static Succeeded: DownloadStatus = "DownloadSucceeded";
69+
public static Failed: DownloadStatus = "DownloadFailed";
70+
}
71+
6272
export class AcquisitionManager {
6373
private readonly BASE_URL_PART = "appcenter.ms";
6474
private _appVersion: string;
@@ -235,7 +245,7 @@ export class AcquisitionManager {
235245
});
236246
}
237247

238-
public reportStatusDownload(downloadedPackage: Package, callback?: Callback<void>): void {
248+
public reportStatusDownload(downloadedPackage: DownloadedPackage, callback?: Callback<void>): void {
239249
if (AcquisitionManager._apiCallsDisabled) {
240250
console.log(`[CodePush] Api calls are disabled, skipping API call`);
241251
callback(/*error*/ null, /*not used*/ null);
@@ -246,7 +256,9 @@ export class AcquisitionManager {
246256
var body: DownloadReport = {
247257
client_unique_id: this._clientUniqueId,
248258
deployment_key: this._deploymentKey,
249-
label: downloadedPackage.label
259+
label: downloadedPackage.label,
260+
download_duration_ms: downloadedPackage.downloadDurationMs,
261+
status: downloadedPackage.status
250262
};
251263

252264
this._httpRequester.request(Http.Verb.POST, url, JSON.stringify(body), (error: Error, response: Http.Response): void => {

src/acquisition-sdk/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@ export interface DeploymentStatusReport {
1313
status?: string;
1414
}
1515

16+
export type DownloadStatus = "DownloadSucceeded" | "DownloadFailed";
17+
1618
/*in*/
1719
export interface DownloadReport {
1820
client_unique_id: string;
1921
deployment_key: string;
2022
label: string;
23+
download_duration_ms?: number;
24+
status: DownloadStatus;
2125
}
2226

2327
/*out*/

0 commit comments

Comments
 (0)