This repository has been archived by the owner on Oct 12, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 324
/
remotePackage.ts
122 lines (103 loc) · 5.29 KB
/
remotePackage.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/// <reference path="../typings/codePush.d.ts" />
/// <reference types="cordova-plugin-file" />
"use strict";
declare var cordova: Cordova & { plugin: { http: AdvancedHttp.Plugin }};
import LocalPackage = require("./localPackage");
import Package = require("./package");
import FileUtil = require("./fileUtil");
import NativeAppInfo = require("./nativeAppInfo");
import CodePushUtil = require("./codePushUtil");
import Sdk = require("./sdk");
/**
* Defines a remote package, which represents an update package available for download.
*/
class RemotePackage extends Package implements IRemotePackage {
constructor() {
super();
/**
* @see https://github.com/microsoft/cordova-plugin-code-push/pull/513#pullrequestreview-449368983
*/
FileUtil.getDataDirectory(LocalPackage.DownloadDir, true, (error: Error, _: DirectoryEntry) => {
/*
* TODO: errors must be strongly checked, via named subclassing & instanceof
* or common (const) enum property of error payload i.e.:
* if error.kind === ErrorKind.PermissionDeniedError
*/
if (error) {
CodePushUtil.logError("Can't create directory for download update.", error);
}
});
}
private isDownloading: boolean = false;
/**
* The URL at which the package is available for download.
*/
public downloadUrl: string;
/**
* Downloads the package update from the CodePush service.
*
* @param downloadSuccess Called with one parameter, the downloaded package information, once the download completed successfully.
* @param downloadError Optional callback invoked in case of an error.
* @param downloadProgress Optional callback invoked during the download process. It is called several times with one DownloadProgress parameter.
*/
public download(successCallback: SuccessCallback<LocalPackage>, errorCallback?: ErrorCallback, downloadProgress?: SuccessCallback<DownloadProgress>): void {
try {
CodePushUtil.logMessage("Downloading update");
if (!this.downloadUrl) {
CodePushUtil.invokeErrorCallback(new Error("The remote package does not contain a download URL."), errorCallback);
} else {
this.isDownloading = true;
const onFileError: FileSaverErrorHandler = (fileError: FileError, stage: string) => {
const error = new Error("Could not access local package. Stage:" + stage + "Error code: " + fileError.code);
CodePushUtil.invokeErrorCallback(error, errorCallback);
CodePushUtil.logMessage(stage + ":" + fileError);
this.isDownloading = false;
};
const onFileReady: FileSaverCompletionHandler = (fileEntry: FileEntry) => {
this.isDownloading = false;
fileEntry.file((file: File) => {
NativeAppInfo.isFailedUpdate(this.packageHash, (installFailed: boolean) => {
var localPackage = new LocalPackage();
localPackage.deploymentKey = this.deploymentKey;
localPackage.description = this.description;
localPackage.label = this.label;
localPackage.appVersion = this.appVersion;
localPackage.isMandatory = this.isMandatory;
localPackage.packageHash = this.packageHash;
localPackage.isFirstRun = false;
localPackage.failedInstall = installFailed;
localPackage.localPath = fileEntry.toInternalURL();
CodePushUtil.logMessage("Package download success: " + JSON.stringify(localPackage));
successCallback && successCallback(localPackage);
Sdk.reportStatusDownload(localPackage, localPackage.deploymentKey);
});
}, fileError => onFileError(fileError, "READ_FILE"));
};
const filedir = cordova.file.dataDirectory + LocalPackage.DownloadDir + "/";
const filename = LocalPackage.PackageUpdateFileName;
cordova.plugin.http.downloadFile(this.downloadUrl, {}, {}, filedir + filename, onFileReady, onFileError);
}
} catch (e) {
CodePushUtil.invokeErrorCallback(new Error("An error occurred while downloading the package. " + (e && e.message) ? e.message : ""), errorCallback);
}
}
/**
* Aborts the current download session, previously started with download().
*
* @param abortSuccess Optional callback invoked if the abort operation succeeded.
* @param abortError Optional callback invoked in case of an error.
*/
public abortDownload(abortSuccess?: SuccessCallback<void>, abortError?: ErrorCallback): void {
try {
if (this.isDownloading) {
this.isDownloading = false;
/* abort succeeded */
abortSuccess && abortSuccess();
}
} catch (e) {
/* abort failed */
abortError && abortError(e);
}
}
}
export = RemotePackage;