@appzung/react-native-code-push 8.3.2 → 10.0.0-rc1

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 (191) hide show
  1. package/CodePush.js +22 -19
  2. package/CodePush.podspec +3 -3
  3. package/LICENSE.md +1 -1
  4. package/README.md +159 -296
  5. package/android/app/.gradle/config.properties +2 -0
  6. package/android/app/build.gradle +2 -0
  7. package/android/app/local.properties +8 -0
  8. package/android/app/src/main/AndroidManifest.xml +1 -2
  9. package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
  10. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
  11. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
  12. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
  13. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
  14. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
  15. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
  16. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
  17. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
  18. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
  19. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
  20. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
  21. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
  22. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
  23. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +16 -9
  24. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
  25. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
  26. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
  27. package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
  28. package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
  29. package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
  30. package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
  31. package/android/build.gradle +3 -0
  32. package/android/codepush.gradle +3 -3
  33. package/docs/advanced-usage.md +56 -0
  34. package/docs/api-android.md +12 -75
  35. package/docs/api-ios.md +5 -17
  36. package/docs/api-js.md +18 -55
  37. package/docs/setup-android.md +15 -397
  38. package/docs/setup-ios.md +24 -198
  39. package/docs/setup-windows.md +7 -74
  40. package/ios/CodePush/CodePush.h +4 -4
  41. package/ios/CodePush/CodePush.m +10 -9
  42. package/ios/CodePush/CodePushConfig.m +14 -11
  43. package/ios/CodePush/CodePushPackage.m +60 -60
  44. package/ios/CodePush/CodePushTelemetryManager.m +13 -13
  45. package/ios/CodePush.xcodeproj/project.pbxproj +24 -470
  46. package/ios/PrivacyInfo.xcprivacy +31 -0
  47. package/package.json +27 -24
  48. package/react-native.config.js +1 -1
  49. package/scripts/generateBundledResourcesHash.js +1 -1
  50. package/scripts/getFilesInFolder.js +1 -1
  51. package/scripts/recordFilesBeforeBundleCommand.js +1 -1
  52. package/typings/react-native-code-push.d.ts +22 -22
  53. package/windows/CodePush/CodePushConfig.cpp +3 -3
  54. package/windows/CodePush/CodePushConfig.h +3 -3
  55. package/windows/CodePush/CodePushNativeModule.cpp +27 -27
  56. package/windows/CodePush/CodePushNativeModule.h +4 -4
  57. package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
  58. package/windows/CodePush/CodePushTelemetryManager.h +1 -1
  59. package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
  60. package/.azurepipelines/test-rn-code-push.yml +0 -94
  61. package/.config/CredScanSuppressions.json +0 -14
  62. package/SECURITY.md +0 -41
  63. package/docs/multi-deployment-testing-android.md +0 -148
  64. package/docs/multi-deployment-testing-ios.md +0 -59
  65. package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
  66. package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
  67. package/ios/CodePush/Base64/README.md +0 -47
  68. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
  69. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
  70. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
  71. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
  72. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
  73. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
  74. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
  75. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
  76. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
  77. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
  78. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
  79. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
  80. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
  81. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
  82. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
  83. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
  84. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
  85. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
  86. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
  87. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
  88. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
  89. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
  90. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
  91. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
  92. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
  93. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
  94. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
  95. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
  96. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
  97. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
  98. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
  99. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
  100. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
  101. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
  102. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
  103. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
  104. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
  105. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
  106. package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
  107. package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
  108. package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
  109. package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
  110. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
  111. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
  112. package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
  113. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
  114. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
  115. package/ios/CodePush/JWT/LICENSE +0 -19
  116. package/ios/CodePush/JWT/README.md +0 -489
  117. package/ios/CodePush/SSZipArchive/Common.h +0 -81
  118. package/ios/CodePush/SSZipArchive/README.md +0 -1
  119. package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -76
  120. package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -691
  121. package/ios/CodePush/SSZipArchive/aes/aes.h +0 -198
  122. package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +0 -541
  123. package/ios/CodePush/SSZipArchive/aes/aescrypt.c +0 -294
  124. package/ios/CodePush/SSZipArchive/aes/aeskey.c +0 -548
  125. package/ios/CodePush/SSZipArchive/aes/aesopt.h +0 -739
  126. package/ios/CodePush/SSZipArchive/aes/aestab.c +0 -391
  127. package/ios/CodePush/SSZipArchive/aes/aestab.h +0 -173
  128. package/ios/CodePush/SSZipArchive/aes/brg_endian.h +0 -126
  129. package/ios/CodePush/SSZipArchive/aes/brg_types.h +0 -219
  130. package/ios/CodePush/SSZipArchive/aes/entropy.c +0 -54
  131. package/ios/CodePush/SSZipArchive/aes/entropy.h +0 -16
  132. package/ios/CodePush/SSZipArchive/aes/fileenc.c +0 -144
  133. package/ios/CodePush/SSZipArchive/aes/fileenc.h +0 -121
  134. package/ios/CodePush/SSZipArchive/aes/hmac.c +0 -145
  135. package/ios/CodePush/SSZipArchive/aes/hmac.h +0 -103
  136. package/ios/CodePush/SSZipArchive/aes/prng.c +0 -155
  137. package/ios/CodePush/SSZipArchive/aes/prng.h +0 -82
  138. package/ios/CodePush/SSZipArchive/aes/pwd2key.c +0 -103
  139. package/ios/CodePush/SSZipArchive/aes/pwd2key.h +0 -57
  140. package/ios/CodePush/SSZipArchive/aes/sha1.c +0 -258
  141. package/ios/CodePush/SSZipArchive/aes/sha1.h +0 -73
  142. package/ios/CodePush/SSZipArchive/minizip/crypt.h +0 -130
  143. package/ios/CodePush/SSZipArchive/minizip/ioapi.c +0 -369
  144. package/ios/CodePush/SSZipArchive/minizip/ioapi.h +0 -175
  145. package/ios/CodePush/SSZipArchive/minizip/mztools.c +0 -284
  146. package/ios/CodePush/SSZipArchive/minizip/mztools.h +0 -31
  147. package/ios/CodePush/SSZipArchive/minizip/unzip.c +0 -1839
  148. package/ios/CodePush/SSZipArchive/minizip/unzip.h +0 -248
  149. package/ios/CodePush/SSZipArchive/minizip/zip.c +0 -1910
  150. package/ios/CodePush/SSZipArchive/minizip/zip.h +0 -202
  151. package/scripts/postlink/android/postlink.js +0 -87
  152. package/scripts/postlink/ios/postlink.js +0 -116
  153. package/scripts/postlink/run.js +0 -11
  154. package/scripts/postunlink/android/postunlink.js +0 -74
  155. package/scripts/postunlink/ios/postunlink.js +0 -87
  156. package/scripts/postunlink/run.js +0 -11
  157. package/scripts/tools/linkToolsAndroid.js +0 -57
  158. package/scripts/tools/linkToolsIos.js +0 -130
  159. package/windows-legacy/CodePush/CodePush.csproj +0 -128
  160. package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
  161. package/windows-legacy/CodePush/FileUtils.cs +0 -40
  162. package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
  163. package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
  164. package/windows-legacy/CodePush/UpdateManager.cs +0 -305
  165. package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
  166. package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
  167. package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
  168. package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
  169. package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
  170. package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
  171. package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
  172. package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
  173. package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
  174. package/windows-legacy/CodePush.Net46/packages.config +0 -5
  175. package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
  176. package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
  177. package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
  178. package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
  179. package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
  180. package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
  181. package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
  182. package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
  183. package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
  184. package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
  185. package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
  186. package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
  187. package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
  188. package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
  189. package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
  190. package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
  191. package/windows-legacy/CodePush.Shared/UpdateState.cs +0 -9
@@ -1,329 +0,0 @@
1
- using Newtonsoft.Json.Linq;
2
- using ReactNative;
3
- using ReactNative.Bridge;
4
- using ReactNative.Modules.Core;
5
- using System;
6
- using System.Collections.Generic;
7
- using System.IO;
8
- using System.Reflection;
9
- using System.Threading;
10
- using System.Threading.Tasks;
11
- #if WINDOWS_UWP
12
- using Windows.Web.Http;
13
- #else
14
- using CodePush.Net46.Adapters.Http;
15
- #endif
16
-
17
- namespace CodePush.ReactNative
18
- {
19
- internal class CodePushNativeModule : ReactContextNativeModuleBase
20
- {
21
- private CodePushReactPackage _codePush;
22
- private MinimumBackgroundListener _minimumBackgroundListener;
23
- private ReactContext _reactContext;
24
-
25
- public CodePushNativeModule(ReactContext reactContext, CodePushReactPackage codePush)
26
- : base(reactContext)
27
- {
28
- _reactContext = reactContext;
29
- _codePush = codePush;
30
- }
31
-
32
- public override string Name
33
- {
34
- get
35
- {
36
- return "CodePush";
37
- }
38
- }
39
-
40
- public override IReadOnlyDictionary<string, object> Constants
41
- {
42
- get
43
- {
44
- return new Dictionary<string, object>
45
- {
46
- { "codePushInstallModeImmediate", InstallMode.Immediate },
47
- { "codePushInstallModeOnNextResume", InstallMode.OnNextResume },
48
- { "codePushInstallModeOnNextRestart", InstallMode.OnNextRestart },
49
- { "codePushUpdateStateRunning", UpdateState.Running },
50
- { "codePushUpdateStatePending", UpdateState.Pending },
51
- { "codePushUpdateStateLatest", UpdateState.Latest },
52
- };
53
- }
54
- }
55
-
56
- public override void Initialize()
57
- {
58
- _codePush.InitializeUpdateAfterRestart();
59
- }
60
-
61
- [ReactMethod]
62
- public async void downloadUpdate(JObject updatePackage, bool notifyProgress, IPromise promise)
63
- {
64
- try
65
- {
66
- updatePackage[CodePushConstants.BinaryModifiedTimeKey] = "" + await FileUtils.GetBinaryResourcesModifiedTimeAsync(_codePush.AssetsBundleFileName).ConfigureAwait(false);
67
- await _codePush.UpdateManager.DownloadPackageAsync(
68
- updatePackage,
69
- _codePush.AssetsBundleFileName,
70
- new Progress<HttpProgress>(
71
- (HttpProgress progress) =>
72
- {
73
- if (!notifyProgress)
74
- {
75
- return;
76
- }
77
-
78
- var downloadProgress = new JObject()
79
- {
80
- { "totalBytes", progress.TotalBytesToReceive },
81
- { "receivedBytes", progress.BytesReceived }
82
- };
83
-
84
- _reactContext
85
- .GetJavaScriptModule<RCTDeviceEventEmitter>()
86
- .emit(CodePushConstants.DownloadProgressEventName, downloadProgress);
87
- }
88
- )
89
- ).ConfigureAwait(false);
90
-
91
- JObject newPackage = await _codePush.UpdateManager.GetPackageAsync((string)updatePackage[CodePushConstants.PackageHashKey]).ConfigureAwait(false);
92
- promise.Resolve(newPackage);
93
- }
94
- catch (InvalidDataException e)
95
- {
96
- CodePushUtils.Log(e.ToString());
97
- SettingsManager.SaveFailedUpdate(updatePackage);
98
- promise.Reject(e);
99
- }
100
- catch (Exception e)
101
- {
102
- CodePushUtils.Log(e.ToString());
103
- promise.Reject(e);
104
- }
105
- }
106
-
107
- [ReactMethod]
108
- public void getConfiguration(IPromise promise)
109
- {
110
- var config = new JObject
111
- {
112
- { "appVersion", _codePush.AppVersion },
113
- { "clientUniqueId", CodePushUtils.GetDeviceId() },
114
- { "deploymentKey", _codePush.DeploymentKey },
115
- { "serverUrl", CodePushConstants.CodePushServerUrl }
116
- };
117
-
118
- // TODO generate binary hash
119
- // string binaryHash = CodePushUpdateUtils.getHashForBinaryContents(mainActivity, isDebugMode);
120
- /*if (binaryHash != null)
121
- {
122
- configMap.putString(PACKAGE_HASH_KEY, binaryHash);
123
- }*/
124
- promise.Resolve(config);
125
- }
126
-
127
- [ReactMethod]
128
- public async void getUpdateMetadata(UpdateState updateState, IPromise promise)
129
- {
130
- JObject currentPackage = await _codePush.UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
131
- if (currentPackage == null)
132
- {
133
- promise.Resolve("");
134
- return;
135
- }
136
-
137
- var currentUpdateIsPending = false;
138
-
139
- if (currentPackage[CodePushConstants.PackageHashKey] != null)
140
- {
141
- var currentHash = (string)currentPackage[CodePushConstants.PackageHashKey];
142
- currentUpdateIsPending = SettingsManager.IsPendingUpdate(currentHash);
143
- }
144
-
145
- if (updateState == UpdateState.Pending && !currentUpdateIsPending)
146
- {
147
- // The caller wanted a pending update
148
- // but there isn't currently one.
149
- promise.Resolve("");
150
- }
151
- else if (updateState == UpdateState.Running && currentUpdateIsPending)
152
- {
153
- // The caller wants the running update, but the current
154
- // one is pending, so we need to grab the previous.
155
- promise.Resolve(await _codePush.UpdateManager.GetPreviousPackageAsync().ConfigureAwait(false));
156
- }
157
- else
158
- {
159
- // The current package satisfies the request:
160
- // 1) Caller wanted a pending, and there is a pending update
161
- // 2) Caller wanted the running update, and there isn't a pending
162
- // 3) Caller wants the latest update, regardless if it's pending or not
163
- if (_codePush.IsRunningBinaryVersion)
164
- {
165
- // This only matters in Debug builds. Since we do not clear "outdated" updates,
166
- // we need to indicate to the JS side that somehow we have a current update on
167
- // disk that is not actually running.
168
- currentPackage["_isDebugOnly"] = true;
169
- }
170
-
171
- // Enable differentiating pending vs. non-pending updates
172
- currentPackage["isPending"] = currentUpdateIsPending;
173
- promise.Resolve(currentPackage);
174
- }
175
- }
176
-
177
-
178
- [ReactMethod]
179
- public async void getNewStatusReport(IPromise promise)
180
- {
181
- await Task.Run(() =>
182
- {
183
- if (_codePush.NeedToReportRollback)
184
- {
185
- _codePush.NeedToReportRollback = false;
186
-
187
- var failedUpdates = SettingsManager.GetFailedUpdates();
188
- if (failedUpdates != null && failedUpdates.Count > 0)
189
- {
190
- var lastFailedPackage = (JObject)failedUpdates[failedUpdates.Count - 1];
191
- var failedStatusReport = TelemetryManager.GetRollbackReport(lastFailedPackage);
192
- if (failedStatusReport != null)
193
- {
194
- promise.Resolve(failedStatusReport);
195
- return;
196
- }
197
- }
198
- }
199
- else if (_codePush.DidUpdate)
200
- {
201
- var currentPackage = _codePush.UpdateManager.GetCurrentPackageAsync().Result;
202
- if (currentPackage != null)
203
- {
204
- var newPackageStatusReport = TelemetryManager.GetUpdateReport(currentPackage);
205
- if (newPackageStatusReport != null)
206
- {
207
- promise.Resolve(newPackageStatusReport);
208
- return;
209
- }
210
- }
211
- }
212
- else if (_codePush.IsRunningBinaryVersion)
213
- {
214
- var newAppVersionStatusReport = TelemetryManager.GetBinaryUpdateReport(_codePush.AppVersion);
215
- if (newAppVersionStatusReport != null)
216
- {
217
- promise.Resolve(newAppVersionStatusReport);
218
- return;
219
- }
220
- }
221
- else
222
- {
223
- var retryStatusReport = TelemetryManager.GetRetryStatusReport();
224
- if (retryStatusReport != null)
225
- {
226
- promise.Resolve(retryStatusReport);
227
- return;
228
- }
229
- }
230
-
231
- promise.Resolve("");
232
- }).ConfigureAwait(false);
233
- }
234
-
235
- [ReactMethod]
236
- public async void installUpdate(JObject updatePackage, InstallMode installMode, int minimumBackgroundDuration, IPromise promise)
237
- {
238
- await _codePush.UpdateManager.InstallPackageAsync(updatePackage, SettingsManager.IsPendingUpdate(null)).ConfigureAwait(false);
239
- var pendingHash = (string)updatePackage[CodePushConstants.PackageHashKey];
240
- SettingsManager.SavePendingUpdate(pendingHash, /* isLoading */false);
241
- if (installMode == InstallMode.OnNextResume)
242
- {
243
- if (_minimumBackgroundListener == null)
244
- {
245
- // Ensure we do not add the listener twice.
246
- Action loadBundleAction = () =>
247
- {
248
- Context.RunOnNativeModulesQueueThread(async () =>
249
- {
250
- await LoadBundleAsync().ConfigureAwait(false);
251
- });
252
- };
253
-
254
- _minimumBackgroundListener = new MinimumBackgroundListener(loadBundleAction, minimumBackgroundDuration);
255
- _reactContext.AddLifecycleEventListener(_minimumBackgroundListener);
256
- }
257
- else
258
- {
259
- _minimumBackgroundListener.MinimumBackgroundDuration = minimumBackgroundDuration;
260
- }
261
- }
262
-
263
- promise.Resolve("");
264
- }
265
-
266
- [ReactMethod]
267
- public void isFailedUpdate(string packageHash, IPromise promise)
268
- {
269
- promise.Resolve(SettingsManager.IsFailedHash(packageHash));
270
- }
271
-
272
- [ReactMethod]
273
- public async void isFirstRun(string packageHash, IPromise promise)
274
- {
275
- bool isFirstRun = _codePush.DidUpdate
276
- && packageHash != null
277
- && packageHash.Length > 0
278
- && packageHash.Equals(await _codePush.UpdateManager.GetCurrentPackageHashAsync().ConfigureAwait(false));
279
- promise.Resolve(isFirstRun);
280
- }
281
-
282
- [ReactMethod]
283
- public void notifyApplicationReady(IPromise promise)
284
- {
285
- SettingsManager.RemovePendingUpdate();
286
- promise.Resolve("");
287
- }
288
-
289
- [ReactMethod]
290
- public async void restartApp(bool onlyIfUpdateIsPending)
291
- {
292
- // If this is an unconditional restart request, or there
293
- // is current pending update, then reload the app.
294
- if (!onlyIfUpdateIsPending || SettingsManager.IsPendingUpdate(null))
295
- {
296
- await LoadBundleAsync().ConfigureAwait(false);
297
- }
298
- }
299
-
300
- [ReactMethod]
301
- public async void recordStatusReported(JObject statusReport)
302
- {
303
- await Task.Run(() => TelemetryManager.RecordStatusReported(statusReport)).ConfigureAwait(false);
304
- }
305
-
306
- [ReactMethod]
307
- public async void saveStatusReportForRetry(JObject statusReport)
308
- {
309
- await Task.Run(() => TelemetryManager.SaveStatusReportForRetry(statusReport)).ConfigureAwait(false);
310
- }
311
-
312
- internal async Task LoadBundleAsync()
313
- {
314
- // #1) Get the private ReactInstanceManager, which is what includes
315
- // the logic to reload the current React context.
316
- var reactInstanceManager = _codePush.ReactInstanceManager;
317
-
318
- // #2) Update the locally stored JS bundle file path
319
- Type reactInstanceManagerType = typeof(ReactInstanceManager);
320
- string latestJSBundleFile = await _codePush.GetJavaScriptBundleFileAsync(_codePush.AssetsBundleFileName).ConfigureAwait(false);
321
- reactInstanceManagerType
322
- .GetField("_jsBundleFile", BindingFlags.NonPublic | BindingFlags.Instance)
323
- .SetValue(reactInstanceManager, latestJSBundleFile);
324
-
325
- // #3) Get the context creation method and fire it on the UI thread (which RN enforces)
326
- Context.RunOnDispatcherQueueThread(() => reactInstanceManager.RecreateReactContextAsync(CancellationToken.None));
327
- }
328
- }
329
- }
@@ -1,235 +0,0 @@
1
- using Newtonsoft.Json.Linq;
2
- using ReactNative;
3
- using ReactNative.Bridge;
4
- using ReactNative.Modules.Core;
5
- using ReactNative.UIManager;
6
- using System;
7
- using System.Collections.Generic;
8
- using System.Reflection;
9
- using System.Threading.Tasks;
10
-
11
-
12
- namespace CodePush.ReactNative
13
- {
14
- public sealed class CodePushReactPackage : IReactPackage
15
- {
16
- private static CodePushReactPackage CurrentInstance;
17
-
18
- internal string AppVersion { get; private set; }
19
- internal string DeploymentKey { get; private set; }
20
- internal string AssetsBundleFileName { get; private set; }
21
- internal bool NeedToReportRollback { get; set; } = false;
22
- internal bool DidUpdate { get; private set; } = false;
23
- internal bool IsRunningBinaryVersion { get; private set; } = false;
24
- #pragma warning disable CS0618 // Keeping for backward compatibility
25
- internal ReactPage MainPage { get; private set; }
26
- #pragma warning restore CS0618 // Keeping for backward compatibility
27
- internal ReactNativeHost Host { get; private set; }
28
- internal UpdateManager UpdateManager { get; private set; }
29
-
30
- internal ReactInstanceManager ReactInstanceManager
31
- {
32
- get
33
- {
34
- if (Host != null)
35
- {
36
- return Host.ReactInstanceManager;
37
- }
38
-
39
- #if WINDOWS_UWP
40
- #pragma warning disable CS0618 // Keeping for backward compatibility
41
- return (ReactInstanceManager)typeof(ReactPage)
42
- #pragma warning restore CS0618 // Keeping for backward compatibility
43
- .GetField("_reactInstanceManager", BindingFlags.NonPublic | BindingFlags.Instance)
44
- .GetValue(MainPage);
45
- #else
46
- return ((Lazy<ReactInstanceManager>)typeof(ReactPage)
47
- .GetField("_reactInstanceManager", BindingFlags.NonPublic | BindingFlags.Instance)
48
- .GetValue(MainPage)).Value as ReactInstanceManager;
49
- #endif
50
- }
51
- }
52
-
53
- internal bool UseDeveloperSupport
54
- {
55
- get
56
- {
57
- return Host?.UseDeveloperSupport ?? MainPage.UseDeveloperSupport;
58
- }
59
- }
60
-
61
-
62
- #pragma warning disable CS0618 // Keeping for backward compatibility
63
- public CodePushReactPackage(string deploymentKey, ReactPage mainPage)
64
- #pragma warning restore CS0618 // Keeping for backward compatibility
65
- {
66
- AppVersion = CodePushUtils.GetAppVersion();
67
- DeploymentKey = deploymentKey;
68
- MainPage = mainPage;
69
- UpdateManager = new UpdateManager();
70
-
71
- if (CurrentInstance != null)
72
- {
73
- CodePushUtils.Log("More than one CodePush instance has been initialized. Please use the instance method codePush.getBundleUrlInternal() to get the correct bundleURL for a particular instance.");
74
- }
75
-
76
- CurrentInstance = this;
77
- }
78
-
79
- public CodePushReactPackage(string deploymentKey, ReactNativeHost host)
80
- {
81
- AppVersion = CodePushUtils.GetAppVersion();
82
- DeploymentKey = deploymentKey;
83
- Host = host;
84
- UpdateManager = new UpdateManager();
85
-
86
- if (CurrentInstance != null)
87
- {
88
- CodePushUtils.Log("More than one CodePush instance has been initialized. Please use the instance method codePush.getBundleUrlInternal() to get the correct bundleURL for a particular instance.");
89
- }
90
-
91
- CurrentInstance = this;
92
- }
93
-
94
- #region Public methods
95
- public IReadOnlyList<Type> CreateJavaScriptModulesConfig()
96
- {
97
- return new List<Type>();
98
- }
99
-
100
- public IReadOnlyList<INativeModule> CreateNativeModules(ReactContext reactContext)
101
- {
102
- return new List<INativeModule>
103
- {
104
- new CodePushNativeModule(reactContext, this)
105
- };
106
- }
107
-
108
- public IReadOnlyList<IViewManager> CreateViewManagers(ReactContext reactContext)
109
- {
110
- return new List<IViewManager>();
111
- }
112
-
113
- public string GetJavaScriptBundleFile()
114
- {
115
- return GetJavaScriptBundleFile(CodePushConstants.DefaultJsBundleName);
116
- }
117
-
118
- public string GetJavaScriptBundleFile(string assetsBundleFileName)
119
- {
120
- if (CurrentInstance == null)
121
- {
122
- throw new InvalidOperationException("A CodePush instance has not been created yet. Have you added it to your app's list of ReactPackages?");
123
- }
124
-
125
- return CurrentInstance.GetJavaScriptBundleFileAsync(assetsBundleFileName).Result;
126
- }
127
-
128
- public async Task<string> GetJavaScriptBundleFileAsync(string assetsBundleFileName)
129
- {
130
- AssetsBundleFileName = assetsBundleFileName;
131
- string binaryJsBundleUrl = CodePushUtils.GetAssetsBundlePrefix() + assetsBundleFileName;
132
-
133
- var binaryResourcesModifiedTime = await FileUtils.GetBinaryResourcesModifiedTimeAsync(AssetsBundleFileName).ConfigureAwait(false);
134
- var packageFile = await UpdateManager.GetCurrentPackageBundleAsync(AssetsBundleFileName).ConfigureAwait(false);
135
- if (packageFile == null)
136
- {
137
- // There has not been any downloaded updates.
138
- CodePushUtils.LogBundleUrl(binaryJsBundleUrl);
139
- IsRunningBinaryVersion = true;
140
- return binaryJsBundleUrl;
141
- }
142
-
143
- var packageMetadata = await UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
144
- long? binaryModifiedDateDuringPackageInstall = null;
145
- var binaryModifiedDateDuringPackageInstallString = (string)packageMetadata[CodePushConstants.BinaryModifiedTimeKey];
146
- if (binaryModifiedDateDuringPackageInstallString != null)
147
- {
148
- binaryModifiedDateDuringPackageInstall = long.Parse(binaryModifiedDateDuringPackageInstallString);
149
- }
150
-
151
- var packageAppVersion = (string)packageMetadata["appVersion"];
152
-
153
- if (binaryModifiedDateDuringPackageInstall != null &&
154
- binaryModifiedDateDuringPackageInstall == binaryResourcesModifiedTime &&
155
- AppVersion.Equals(packageAppVersion))
156
- {
157
- CodePushUtils.LogBundleUrl(packageFile.Path);
158
- IsRunningBinaryVersion = false;
159
-
160
- return CodePushUtils.GetFileBundlePrefix() + CodePushUtils.ExtractSubFolder(packageFile.Path);
161
- }
162
- else
163
- {
164
- // The binary version is newer.
165
- DidUpdate = false;
166
- if (!UseDeveloperSupport || !AppVersion.Equals(packageAppVersion))
167
- {
168
- await ClearUpdatesAsync().ConfigureAwait(false);
169
- }
170
-
171
- CodePushUtils.LogBundleUrl(binaryJsBundleUrl);
172
- IsRunningBinaryVersion = true;
173
- return binaryJsBundleUrl;
174
- }
175
- }
176
-
177
- #endregion
178
-
179
- #region Internal methods
180
-
181
- internal void InitializeUpdateAfterRestart()
182
- {
183
- // Reset the state which indicates that
184
- // the app was just freshly updated.
185
- DidUpdate = false;
186
-
187
- JObject pendingUpdate = SettingsManager.GetPendingUpdate();
188
- if (pendingUpdate != null)
189
- {
190
- var updateIsLoading = (bool)pendingUpdate[CodePushConstants.PendingUpdateIsLoadingKey];
191
- if (updateIsLoading)
192
- {
193
- // Pending update was initialized, but notifyApplicationReady was not called.
194
- // Therefore, deduce that it is a broken update and rollback.
195
- CodePushUtils.Log("Update did not finish loading the last time, rolling back to a previous version.");
196
- NeedToReportRollback = true;
197
- RollbackPackageAsync().Wait();
198
- }
199
- else
200
- {
201
- DidUpdate = true;
202
- // Clear the React dev bundle cache so that new updates can be loaded.
203
- if (UseDeveloperSupport)
204
- {
205
- FileUtils.ClearReactDevBundleCacheAsync().Wait();
206
- }
207
- // Mark that we tried to initialize the new update, so that if it crashes,
208
- // we will know that we need to rollback when the app next starts.
209
- SettingsManager.SavePendingUpdate((string)pendingUpdate[CodePushConstants.PendingUpdateHashKey], /* isLoading */true);
210
- }
211
- }
212
- }
213
-
214
- internal async Task ClearUpdatesAsync()
215
- {
216
- await UpdateManager.ClearUpdatesAsync().ConfigureAwait(false);
217
- SettingsManager.RemovePendingUpdate();
218
- SettingsManager.RemoveFailedUpdates();
219
- }
220
-
221
- #endregion
222
-
223
- #region Private methods
224
-
225
- private async Task RollbackPackageAsync()
226
- {
227
- JObject failedPackage = await UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
228
- SettingsManager.SaveFailedUpdate(failedPackage);
229
- await UpdateManager.RollbackPackageAsync().ConfigureAwait(false);
230
- SettingsManager.RemovePendingUpdate();
231
- }
232
-
233
- #endregion
234
- }
235
- }
@@ -1,70 +0,0 @@
1
- using System;
2
- using System.Diagnostics;
3
- using System.Linq;
4
- using System.IO;
5
- #if WINDOWS_UWP
6
- using Windows.ApplicationModel;
7
- using Windows.Storage;
8
- #endif
9
-
10
- namespace CodePush.ReactNative
11
- {
12
- internal partial class CodePushUtils
13
- {
14
- internal static void Log(string message)
15
- {
16
- Debug.WriteLine("[CodePush] " + message, CodePushConstants.ReactNativeLogCategory);
17
- }
18
-
19
- internal static void LogBundleUrl(string path)
20
- {
21
- Log("Loading JS bundle from \"" + path + "\"");
22
- }
23
-
24
- static string _deviceId = String.Empty;
25
-
26
- internal static string GetDeviceId()
27
- {
28
- //It's quite long operation, cache it
29
- if (!String.IsNullOrEmpty(_deviceId))
30
- return _deviceId;
31
-
32
- _deviceId = GetDeviceIdImpl();
33
- return _deviceId;
34
- }
35
-
36
- internal static string GetAppVersion()
37
- {
38
- #if WINDOWS_UWP
39
- return Package.Current.Id.Version.Major + "." + Package.Current.Id.Version.Minor + "." + Package.Current.Id.Version.Build;
40
- #else
41
- return applicationInfo.Version;
42
- #endif
43
- }
44
-
45
- internal static string GetAppFolder()
46
- {
47
- #if WINDOWS_UWP
48
- return ApplicationData.Current.LocalFolder.Path;
49
- #else
50
- return AppDomain.CurrentDomain.BaseDirectory;
51
- #endif
52
- }
53
-
54
- internal static string GetAssetsBundlePrefix()
55
- {
56
- #if WINDOWS_UWP
57
- return CodePushConstants.AssetsBundlePrefix;
58
- #else
59
- return Path.Combine(GetAppFolder(), CodePushConstants.AssetsBundlePrefix);
60
- #endif
61
- }
62
-
63
- internal static string ExtractSubFolder(string fullPath)
64
- {
65
- var codePushSubPathArray = fullPath.Split(Path.DirectorySeparatorChar);
66
- return String.Join("/", codePushSubPathArray.SkipWhile((value, index) => codePushSubPathArray.Length - index > 4).ToArray());
67
- }
68
-
69
- }
70
- }
@@ -1,9 +0,0 @@
1
- namespace CodePush.ReactNative
2
- {
3
- enum InstallMode
4
- {
5
- Immediate,
6
- OnNextRestart,
7
- OnNextResume
8
- }
9
- }
@@ -1,44 +0,0 @@
1
- using ReactNative.Bridge;
2
- using System;
3
-
4
- namespace CodePush.ReactNative
5
- {
6
- internal class MinimumBackgroundListener : ILifecycleEventListener
7
- {
8
- private DateTimeOffset? _lastSuspendDate;
9
- private Action _resumeAction;
10
-
11
- internal int MinimumBackgroundDuration { get; set; }
12
-
13
- internal MinimumBackgroundListener(Action resumeAction, int minimumBackgroundDuration)
14
- {
15
- _resumeAction = resumeAction;
16
- MinimumBackgroundDuration = minimumBackgroundDuration;
17
- }
18
-
19
- public void OnDestroy()
20
- {
21
- }
22
-
23
- public void OnResume()
24
- {
25
- if (_lastSuspendDate != null)
26
- {
27
- // Determine how long the app was in the background and ensure
28
- // that it meets the minimum duration amount of time.
29
- double durationInBackground = (DateTimeOffset.Now - _lastSuspendDate.Value).TotalSeconds;
30
- if (durationInBackground >= MinimumBackgroundDuration)
31
- {
32
- _resumeAction.Invoke();
33
- }
34
- }
35
- }
36
-
37
- public void OnSuspend()
38
- {
39
- // Save the current time so that when the app is later
40
- // resumed, we can detect how long it was in the background.
41
- _lastSuspendDate = DateTimeOffset.Now;
42
- }
43
- }
44
- }