react-native-stallion 2.4.0-alpha.3 → 2.4.0-alpha.5

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 (46) hide show
  1. package/android/src/main/cpp/CMakeLists.txt +41 -0
  2. package/android/src/main/cpp/bspatch_bridge.c +268 -0
  3. package/android/src/main/cpp/bspatch_bridge.h +26 -0
  4. package/android/src/main/cpp/bzip2/blocksort.c +1094 -0
  5. package/android/src/main/cpp/bzip2/bzlib.c +1572 -0
  6. package/android/src/main/cpp/bzip2/bzlib.h +282 -0
  7. package/android/src/main/cpp/bzip2/bzlib_private.h +509 -0
  8. package/android/src/main/cpp/bzip2/compress.c +672 -0
  9. package/android/src/main/cpp/bzip2/crctable.c +104 -0
  10. package/android/src/main/cpp/bzip2/decompress.c +652 -0
  11. package/android/src/main/cpp/bzip2/huffman.c +205 -0
  12. package/android/src/main/cpp/bzip2/randtable.c +84 -0
  13. package/android/src/main/cpp/stallion_bspatch_jni.cpp +39 -0
  14. package/android/src/main/java/com/stallion/StallionModule.java +13 -1
  15. package/android/src/main/java/com/stallion/networkmanager/StallionPatchHandler.java +222 -0
  16. package/android/src/main/java/com/stallion/networkmanager/StallionSyncHandler.java +88 -16
  17. package/android/src/main/java/com/stallion/storage/StallionMeta.java +12 -0
  18. package/android/src/main/java/com/stallion/storage/StallionStateManager.java +25 -0
  19. package/android/src/main/java/com/stallion/utils/StallionBSPatch.java +30 -0
  20. package/ios/Stallion.xcodeproj/project.pbxproj +6 -0
  21. package/ios/main/Stallion-Bridging-Header.h +1 -0
  22. package/ios/main/Stallion.m +22 -0
  23. package/ios/main/Stallion.swift +8 -1
  24. package/ios/main/StallionBSPatch.swift +35 -0
  25. package/ios/main/StallionMeta.h +1 -0
  26. package/ios/main/StallionMeta.m +12 -0
  27. package/ios/main/StallionModule.m +3 -3
  28. package/ios/main/StallionPatchHandler.swift +206 -0
  29. package/ios/main/StallionSignatureVerification.swift +1 -1
  30. package/ios/main/StallionStateManager.h +3 -0
  31. package/ios/main/StallionStateManager.m +3 -0
  32. package/ios/main/StallionSyncHandler.swift +86 -10
  33. package/ios/main/bspatch.c +270 -0
  34. package/ios/main/bspatch_bridge.h +25 -0
  35. package/package.json +1 -1
  36. package/react-native-stallion.podspec +3 -1
  37. package/src/index.js +2 -0
  38. package/src/index.js.map +1 -1
  39. package/src/main/utils/StallionNativeUtils.js +3 -0
  40. package/src/main/utils/StallionNativeUtils.js.map +1 -1
  41. package/types/index.d.ts +1 -0
  42. package/types/index.d.ts.map +1 -1
  43. package/types/main/utils/StallionNativeUtils.d.ts +2 -1
  44. package/types/main/utils/StallionNativeUtils.d.ts.map +1 -1
  45. package/types/types/utils.types.d.ts +1 -0
  46. package/types/types/utils.types.d.ts.map +1 -1
@@ -37,7 +37,7 @@ class StallionSignatureVerification {
37
37
  guard let payloadData = base64UrlDecode(payload),
38
38
  let payloadJson = try JSONSerialization.jsonObject(with: payloadData) as? [String: Any],
39
39
  let expectedHash = payloadJson["packageHash"] as? String else { return false }
40
-
40
+
41
41
  let actualHash = try computeCodePushStyleHash(folderPath: downloadedBundlePath)
42
42
  return expectedHash == actualHash
43
43
 
@@ -16,6 +16,9 @@
16
16
  @property (nonatomic, assign) BOOL isMounted;
17
17
  @property (nonatomic, copy) NSString *pendingReleaseUrl;
18
18
  @property (nonatomic, copy) NSString *pendingReleaseHash;
19
+ @property (nonatomic, copy) NSString *pendingReleaseDiffUrl;
20
+ @property (nonatomic, assign) BOOL pendingReleaseIsBundlePatched;
21
+ @property (nonatomic, copy) NSString *pendingReleaseBundleDiffId;
19
22
 
20
23
  + (instancetype)sharedInstance;
21
24
  + (void)initializeInstance;
@@ -44,6 +44,9 @@ static StallionStateManager *_instance = nil;
44
44
  _isMounted = NO;
45
45
  _pendingReleaseUrl = @"";
46
46
  _pendingReleaseHash = @"";
47
+ _pendingReleaseDiffUrl = nil;
48
+ _pendingReleaseIsBundlePatched = NO;
49
+ _pendingReleaseBundleDiffId = nil;
47
50
 
48
51
  // Reset mount state on initialization (ensures mount marker file is deleted for new session)
49
52
  [self setIsMounted:NO];
@@ -151,21 +151,55 @@ class StallionSyncHandler {
151
151
  !newReleaseUrl.isEmpty,
152
152
  !newReleaseHash.isEmpty else { return }
153
153
 
154
+ // Extract diffData if it exists
155
+ var diffUrl: String? = nil
156
+ var isBundlePatched: Bool = false
157
+ var bundleDiffId: String? = nil
158
+ if let diffData = newReleaseData["bundleDiff"] as? [String: Any] {
159
+ if let extractedDiffUrl = diffData["url"] as? String,
160
+ !extractedDiffUrl.isEmpty {
161
+ diffUrl = extractedDiffUrl
162
+ }
163
+ isBundlePatched = diffData["isBundlePatched"] as? Bool ?? false
164
+ if let extractedId = diffData["id"] as? String,
165
+ !extractedId.isEmpty {
166
+ bundleDiffId = extractedId
167
+ }
168
+ }
169
+
154
170
  let stateManager = StallionStateManager.sharedInstance()
155
171
  let lastRolledBackHash = stateManager?.stallionMeta?.getLastRolledBackHash() ?? ""
156
172
  let lastUnverifiedHash = stateManager?.stallionConfig?.lastUnverifiedHash ?? ""
157
173
 
158
174
  if newReleaseHash != lastRolledBackHash && newReleaseHash != lastUnverifiedHash {
159
175
  if stateManager?.isMounted == true {
160
- downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: newReleaseUrl)
176
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: newReleaseUrl, diffUrl: diffUrl, isBundlePatched: isBundlePatched, bundleDiffId: bundleDiffId)
161
177
  } else {
162
178
  stateManager?.pendingReleaseUrl = newReleaseUrl
163
179
  stateManager?.pendingReleaseHash = newReleaseHash
180
+ stateManager?.pendingReleaseDiffUrl = diffUrl
181
+ stateManager?.pendingReleaseIsBundlePatched = isBundlePatched
182
+ stateManager?.pendingReleaseBundleDiffId = bundleDiffId
164
183
  }
165
184
  }
166
185
  }
167
186
 
187
+ // Overloaded method for backward compatibility
168
188
  static func downloadNewRelease(newReleaseHash: String, newReleaseUrl: String) {
189
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: newReleaseUrl, diffUrl: nil, isBundlePatched: false, bundleDiffId: nil)
190
+ }
191
+
192
+ // Overloaded method for backward compatibility
193
+ static func downloadNewRelease(newReleaseHash: String, newReleaseUrl: String, diffUrl: String?) {
194
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: newReleaseUrl, diffUrl: diffUrl, isBundlePatched: false, bundleDiffId: nil)
195
+ }
196
+
197
+ // Overloaded method for backward compatibility
198
+ static func downloadNewRelease(newReleaseHash: String, newReleaseUrl: String, diffUrl: String?, isBundlePatched: Bool) {
199
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: newReleaseUrl, diffUrl: diffUrl, isBundlePatched: isBundlePatched, bundleDiffId: nil)
200
+ }
201
+
202
+ static func downloadNewRelease(newReleaseHash: String, newReleaseUrl: String, diffUrl: String?, isBundlePatched: Bool, bundleDiffId: String?) {
169
203
  guard let stateManager = StallionStateManager.sharedInstance(),
170
204
  let config = stateManager.stallionConfig else { return }
171
205
 
@@ -181,11 +215,22 @@ class StallionSyncHandler {
181
215
  let downloadPath = config.filesDirectory + "/" + StallionConstants.PROD_DIRECTORY + "/" + StallionConstants.TEMP_FOLDER_SLOT
182
216
  let projectId = config.projectId ?? ""
183
217
 
218
+ // Use diffUrl if it exists, otherwise use newReleaseUrl
219
+ let urlToDownload = (diffUrl != nil && !diffUrl!.isEmpty) ? diffUrl! : newReleaseUrl
184
220
  let publicSigningKey = config.publicSigningKey ?? ""
185
221
 
186
- guard let fromUrl = URL(string: newReleaseUrl + "?projectId=" + projectId) else { return }
222
+ // Track if this is a diff download
223
+ let isDiffDownload = (diffUrl != nil && !diffUrl!.isEmpty)
224
+ // Store original newReleaseUrl for potential retry
225
+ let originalNewReleaseUrl = newReleaseUrl
226
+ // Store isBundlePatched flag for patch handler
227
+ let isBundlePatchedFlag = isBundlePatched
228
+ // Store bundleDiffId for events
229
+ let bundleDiffIdForEvents = bundleDiffId
230
+
231
+ guard let fromUrl = URL(string: urlToDownload + "?projectId=" + projectId) else { return }
187
232
 
188
- emitDownloadStarted(releaseHash: newReleaseHash)
233
+ emitDownloadStarted(releaseHash: newReleaseHash, bundleDiffId: bundleDiffIdForEvents)
189
234
 
190
235
  StallionFileDownloader().downloadBundle(
191
236
  url: fromUrl,
@@ -196,6 +241,31 @@ class StallionSyncHandler {
196
241
  resolve: { _ in
197
242
  completeDownload()
198
243
 
244
+ // If this was a diff download, handle patch
245
+ if isDiffDownload {
246
+ // Get base bundle path from current slot
247
+ guard let slotPath = stateManager.stallionMeta?.getCurrentProdSlotPath() else {
248
+ // No valid slot path (e.g., default slot), skip patch and retry with full bundle
249
+ StallionFileManager.deleteFileOrFolderSilently(downloadPath)
250
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: originalNewReleaseUrl, diffUrl: nil, isBundlePatched: false, bundleDiffId: nil)
251
+ return
252
+ }
253
+
254
+ do {
255
+ let baseBundlePath = config.filesDirectory + "/" + StallionConstants.PROD_DIRECTORY + "/" + slotPath
256
+
257
+ // Invoke patch handler with isBundlePatched flag
258
+ try StallionPatchHandler.applyPatch(baseBundlePath: baseBundlePath, diffPath: downloadPath, isBundlePatched: isBundlePatchedFlag)
259
+ } catch {
260
+ // Patch application failed, retry with full bundle download
261
+ // Clean up the failed diff download
262
+ StallionFileManager.deleteFileOrFolderSilently(downloadPath)
263
+ // Retry download with full bundle (no diffUrl)
264
+ downloadNewRelease(newReleaseHash: newReleaseHash, newReleaseUrl: originalNewReleaseUrl, diffUrl: nil, isBundlePatched: false, bundleDiffId: nil)
265
+ return
266
+ }
267
+ }
268
+
199
269
  if(publicSigningKey != nil && !publicSigningKey.isEmpty) {
200
270
  if(
201
271
  !StallionSignatureVerification.verifyReleaseSignature(
@@ -217,7 +287,7 @@ class StallionSyncHandler {
217
287
  StallionSlotManager.stabilizeProd()
218
288
  }
219
289
  stateManager.syncStallionMeta()
220
- emitDownloadSuccess(releaseHash: newReleaseHash)
290
+ emitDownloadSuccess(releaseHash: newReleaseHash, bundleDiffId: bundleDiffIdForEvents)
221
291
  },
222
292
  reject: { code, prefix, error in
223
293
  completeDownload()
@@ -256,18 +326,24 @@ class StallionSyncHandler {
256
326
  )
257
327
  }
258
328
 
259
- private static func emitDownloadSuccess(releaseHash: String) {
260
- let successPayload: NSDictionary = ["releaseHash": releaseHash]
329
+ private static func emitDownloadSuccess(releaseHash: String, bundleDiffId: String?) {
330
+ var successPayload: [String: Any] = ["releaseHash": releaseHash]
331
+ if let bundleDiffId = bundleDiffId, !bundleDiffId.isEmpty {
332
+ successPayload["diffId"] = bundleDiffId
333
+ }
261
334
  Stallion.sendEventToRn(eventName: StallionConstants.NativeEventTypesProd.DOWNLOAD_COMPLETE_PROD,
262
- eventBody: successPayload,
335
+ eventBody: successPayload as NSDictionary,
263
336
  shouldCache: true
264
337
  )
265
338
  }
266
339
 
267
- private static func emitDownloadStarted(releaseHash: String) {
268
- let startedPayload: NSDictionary = ["releaseHash": releaseHash]
340
+ private static func emitDownloadStarted(releaseHash: String, bundleDiffId: String?) {
341
+ var startedPayload: [String: Any] = ["releaseHash": releaseHash]
342
+ if let bundleDiffId = bundleDiffId, !bundleDiffId.isEmpty {
343
+ startedPayload["diffId"] = bundleDiffId
344
+ }
269
345
  Stallion.sendEventToRn(eventName: StallionConstants.NativeEventTypesProd.DOWNLOAD_STARTED_PROD,
270
- eventBody: startedPayload,
346
+ eventBody: startedPayload as NSDictionary,
271
347
  shouldCache: true
272
348
  )
273
349
  }
@@ -0,0 +1,270 @@
1
+ //
2
+ // bspatch.c
3
+ // react-native-stallion
4
+ //
5
+ // Based on original bsdiff/bspatch by Colin Percival
6
+ // Adapted for iOS library use with bzip2-compressed BSDIFF40 format
7
+ //
8
+
9
+ #include "bspatch_bridge.h"
10
+
11
+ #include <bzlib.h>
12
+ #include <stdlib.h>
13
+ #include <stdio.h>
14
+ #include <string.h>
15
+ #include <errno.h>
16
+ #include <sys/types.h>
17
+ #include <unistd.h>
18
+ #include <fcntl.h>
19
+
20
+ // Error codes (negative)
21
+ #define BSPATCH_ERR_OPEN_OLD -1
22
+ #define BSPATCH_ERR_OPEN_NEW -2
23
+ #define BSPATCH_ERR_OPEN_PATCH -3
24
+ #define BSPATCH_ERR_READ_HDR -4
25
+ #define BSPATCH_ERR_BAD_MAGIC -5
26
+ #define BSPATCH_ERR_READ_CTRL -6
27
+ #define BSPATCH_ERR_READ_DIFF -7
28
+ #define BSPATCH_ERR_READ_EXTRA -8
29
+ #define BSPATCH_ERR_SEEK_OLD -9
30
+ #define BSPATCH_ERR_WRITE_NEW -10
31
+ #define BSPATCH_ERR_BZ2_ERROR -11
32
+ #define BSPATCH_ERR_OVERFLOW -12
33
+
34
+ /* Type compatibility */
35
+ #ifndef u_char
36
+ #define u_char unsigned char
37
+ #endif
38
+
39
+ static off_t offtin(u_char *buf)
40
+ {
41
+ off_t y;
42
+
43
+ y=buf[7]&0x7F;
44
+ y=y*256;y+=buf[6];
45
+ y=y*256;y+=buf[5];
46
+ y=y*256;y+=buf[4];
47
+ y=y*256;y+=buf[3];
48
+ y=y*256;y+=buf[2];
49
+ y=y*256;y+=buf[1];
50
+ y=y*256;y+=buf[0];
51
+
52
+ if(buf[7]&0x80) y=-y;
53
+
54
+ return y;
55
+ }
56
+
57
+ int bspatch_apply(const char *oldPath, const char *newPath, const char *patchPath) {
58
+ FILE * f = NULL, * cpf = NULL, * dpf = NULL, * epf = NULL;
59
+ BZFILE * cpfbz2 = NULL, * dpfbz2 = NULL, * epfbz2 = NULL;
60
+ int cbz2err, dbz2err, ebz2err;
61
+ int fd = -1;
62
+ ssize_t oldsize,newsize;
63
+ ssize_t bzctrllen,bzdatalen;
64
+ u_char header[32],buf[8];
65
+ u_char *old = NULL, *new = NULL;
66
+ off_t oldpos,newpos;
67
+ off_t ctrl[3];
68
+ off_t lenread;
69
+ off_t i;
70
+ int ret = 0;
71
+
72
+ /*
73
+ File format:
74
+ 0 8 "BSDIFF40"
75
+ 8 8 X
76
+ 16 8 Y
77
+ 24 8 sizeof(newfile)
78
+ 32 X bzip2(control block)
79
+ 32+X Y bzip2(diff block)
80
+ 32+X+Y ??? bzip2(extra block)
81
+ with control block a set of triples (x,y,z) meaning "add x bytes
82
+ from oldfile to x bytes from the diff block; copy y bytes from the
83
+ extra block; seek forwards in oldfile by z bytes".
84
+ */
85
+
86
+ /* Open patch file */
87
+ if ((f = fopen(patchPath, "rb")) == NULL) {
88
+ ret = BSPATCH_ERR_OPEN_PATCH;
89
+ goto cleanup;
90
+ }
91
+
92
+ /* Read header */
93
+ if (fread(header, 1, 32, f) < 32) {
94
+ ret = BSPATCH_ERR_READ_HDR;
95
+ goto cleanup;
96
+ }
97
+
98
+ /* Check for appropriate magic */
99
+ if (memcmp(header, "BSDIFF40", 8) != 0) {
100
+ ret = BSPATCH_ERR_BAD_MAGIC;
101
+ goto cleanup;
102
+ }
103
+
104
+ /* Read lengths from header */
105
+ bzctrllen=offtin(header+8);
106
+ bzdatalen=offtin(header+16);
107
+ newsize=offtin(header+24);
108
+ if((bzctrllen<0) || (bzdatalen<0) || (newsize<0)) {
109
+ ret = BSPATCH_ERR_OVERFLOW;
110
+ goto cleanup;
111
+ }
112
+
113
+ /* Close patch file and re-open it via libbzip2 at the right places */
114
+ if (fclose(f)) {
115
+ ret = BSPATCH_ERR_OPEN_PATCH;
116
+ goto cleanup;
117
+ }
118
+ f = NULL;
119
+
120
+ /* Open control stream */
121
+ if ((cpf = fopen(patchPath, "rb")) == NULL) {
122
+ ret = BSPATCH_ERR_OPEN_PATCH;
123
+ goto cleanup;
124
+ }
125
+ if (fseeko(cpf, 32, SEEK_SET)) {
126
+ ret = BSPATCH_ERR_OPEN_PATCH;
127
+ goto cleanup;
128
+ }
129
+ if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) {
130
+ ret = BSPATCH_ERR_BZ2_ERROR;
131
+ goto cleanup;
132
+ }
133
+
134
+ /* Open diff stream */
135
+ if ((dpf = fopen(patchPath, "rb")) == NULL) {
136
+ ret = BSPATCH_ERR_OPEN_PATCH;
137
+ goto cleanup;
138
+ }
139
+ if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)) {
140
+ ret = BSPATCH_ERR_OPEN_PATCH;
141
+ goto cleanup;
142
+ }
143
+ if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) {
144
+ ret = BSPATCH_ERR_BZ2_ERROR;
145
+ goto cleanup;
146
+ }
147
+
148
+ /* Open extra stream */
149
+ if ((epf = fopen(patchPath, "rb")) == NULL) {
150
+ ret = BSPATCH_ERR_OPEN_PATCH;
151
+ goto cleanup;
152
+ }
153
+ if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) {
154
+ ret = BSPATCH_ERR_OPEN_PATCH;
155
+ goto cleanup;
156
+ }
157
+ if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) {
158
+ ret = BSPATCH_ERR_BZ2_ERROR;
159
+ goto cleanup;
160
+ }
161
+
162
+ /* Load old file into memory */
163
+ if(((fd=open(oldPath,O_RDONLY,0))<0) ||
164
+ ((oldsize=lseek(fd,0,SEEK_END))==-1) ||
165
+ ((old=malloc(oldsize+1))==NULL) ||
166
+ (lseek(fd,0,SEEK_SET)!=0) ||
167
+ (read(fd,old,oldsize)!=oldsize) ||
168
+ (close(fd)==-1)) {
169
+ if (fd >= 0) close(fd);
170
+ fd = -1;
171
+ ret = BSPATCH_ERR_OPEN_OLD;
172
+ goto cleanup;
173
+ }
174
+ fd = -1;
175
+
176
+ /* Allocate memory for new file */
177
+ if((new=malloc(newsize+1))==NULL) {
178
+ ret = BSPATCH_ERR_OVERFLOW;
179
+ goto cleanup;
180
+ }
181
+
182
+ oldpos=0;newpos=0;
183
+ while(newpos<newsize) {
184
+ /* Read control data */
185
+ for(i=0;i<=2;i++) {
186
+ lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8);
187
+ if ((lenread < 8) || ((cbz2err != BZ_OK) &&
188
+ (cbz2err != BZ_STREAM_END))) {
189
+ ret = BSPATCH_ERR_READ_CTRL;
190
+ goto cleanup;
191
+ }
192
+ ctrl[i]=offtin(buf);
193
+ };
194
+
195
+ /* Sanity-check */
196
+ if(newpos+ctrl[0]>newsize) {
197
+ ret = BSPATCH_ERR_OVERFLOW;
198
+ goto cleanup;
199
+ }
200
+
201
+ /* Read diff string */
202
+ lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]);
203
+ if ((lenread < ctrl[0]) ||
204
+ ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) {
205
+ ret = BSPATCH_ERR_READ_DIFF;
206
+ goto cleanup;
207
+ }
208
+
209
+ /* Add old data to diff string */
210
+ for(i=0;i<ctrl[0];i++)
211
+ if((oldpos+i>=0) && (oldpos+i<oldsize))
212
+ new[newpos+i]+=old[oldpos+i];
213
+
214
+ /* Adjust pointers */
215
+ newpos+=ctrl[0];
216
+ oldpos+=ctrl[0];
217
+
218
+ /* Sanity-check */
219
+ if(newpos+ctrl[1]>newsize) {
220
+ ret = BSPATCH_ERR_OVERFLOW;
221
+ goto cleanup;
222
+ }
223
+
224
+ /* Read extra string */
225
+ lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]);
226
+ if ((lenread < ctrl[1]) ||
227
+ ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) {
228
+ ret = BSPATCH_ERR_READ_EXTRA;
229
+ goto cleanup;
230
+ }
231
+
232
+ /* Adjust pointers */
233
+ newpos+=ctrl[1];
234
+ oldpos+=ctrl[2];
235
+ };
236
+
237
+ /* Clean up the bzip2 reads */
238
+ BZ2_bzReadClose(&cbz2err, cpfbz2);
239
+ cpfbz2 = NULL;
240
+ BZ2_bzReadClose(&dbz2err, dpfbz2);
241
+ dpfbz2 = NULL;
242
+ BZ2_bzReadClose(&ebz2err, epfbz2);
243
+ epfbz2 = NULL;
244
+
245
+ /* Write the new file */
246
+ if(((fd=open(newPath,O_CREAT|O_TRUNC|O_WRONLY,0666))<0) ||
247
+ (write(fd,new,newsize)!=newsize) || (close(fd)==-1)) {
248
+ if (fd >= 0) close(fd);
249
+ fd = -1;
250
+ ret = BSPATCH_ERR_WRITE_NEW;
251
+ goto cleanup;
252
+ }
253
+ fd = -1;
254
+
255
+ ret = 0;
256
+
257
+ cleanup:
258
+ if (cpfbz2) BZ2_bzReadClose(&cbz2err, cpfbz2);
259
+ if (dpfbz2) BZ2_bzReadClose(&dbz2err, dpfbz2);
260
+ if (epfbz2) BZ2_bzReadClose(&ebz2err, epfbz2);
261
+ if (f) fclose(f);
262
+ if (cpf) fclose(cpf);
263
+ if (dpf) fclose(dpf);
264
+ if (epf) fclose(epf);
265
+ if (fd >= 0) close(fd);
266
+ if (new) free(new);
267
+ if (old) free(old);
268
+
269
+ return ret;
270
+ }
@@ -0,0 +1,25 @@
1
+ //
2
+ // bspatch_bridge.h
3
+ // react-native-stallion
4
+ //
5
+ // Created by Thor963 on 04/11/25.
6
+ //
7
+
8
+ #ifndef BSPATCH_BRIDGE_H
9
+ #define BSPATCH_BRIDGE_H
10
+
11
+ #include <stddef.h>
12
+
13
+ #ifdef __cplusplus
14
+ extern "C" {
15
+ #endif
16
+
17
+ // Apply a bsdiff patch file to oldPath, writing the result to newPath.
18
+ // Returns 0 on success, negative values on error.
19
+ int bspatch_apply(const char *oldPath, const char *newPath, const char *patchPath);
20
+
21
+ #ifdef __cplusplus
22
+ }
23
+ #endif
24
+
25
+ #endif /* BSPATCH_BRIDGE_H */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-stallion",
3
- "version": "2.4.0-alpha.3",
3
+ "version": "2.4.0-alpha.5",
4
4
  "description": "Offical React Native SDK for Stallion",
5
5
  "main": "index",
6
6
  "types": "types/index.d.ts",
@@ -39,7 +39,7 @@ Pod::Spec.new do |s|
39
39
  isStallionEnabled = true
40
40
 
41
41
  if isStallionEnabled then
42
- s.source_files = "ios/main/**/*.{h,m,mm,swift}"
42
+ s.source_files = "ios/main/**/*.{h,m,mm,swift,c}"
43
43
  else
44
44
  s.source_files = "ios/noop/**/*.{h,m,mm,swift}"
45
45
  puts "Stallion is disabled, falling back to noop version. Check your stallion.config.js file"
@@ -48,6 +48,8 @@ Pod::Spec.new do |s|
48
48
  s.dependency "React-Core"
49
49
  if isStallionEnabled then
50
50
  s.dependency "ZIPFoundation"
51
+ # Link libbz2 for bspatch (bsdiff/bspatch uses bzip2 compression)
52
+ s.libraries = "bz2"
51
53
  end
52
54
 
53
55
  if respond_to?(:install_modules_dependencies, true)
package/src/index.js CHANGED
@@ -8,6 +8,7 @@ import useStallionModalNoop from './noop/useStallionModal';
8
8
  import withStallionMain from './main/utils/withStallion';
9
9
  import useStallionModalMain from './main/utils/useStallionModal';
10
10
  import { stallionEventEmitter } from './main/utils/StallionEventEmitter';
11
+ import { getActiveReleaseHashNative } from './main/utils/StallionNativeUtils';
11
12
  export let withStallion;
12
13
  export let useStallionModal;
13
14
  if (StallionNativeModule !== null && StallionNativeModule !== void 0 && StallionNativeModule.getStallionConfig) {
@@ -22,4 +23,5 @@ export { sync, restart } from './main/utils/StallionNativeUtils';
22
23
  export { useStallionUpdate } from './main/utils/useStallionUpdate';
23
24
  export const addEventListener = stallionEventEmitter.addEventListener.bind(stallionEventEmitter);
24
25
  export const removeEventListener = stallionEventEmitter.removeEventListener.bind(stallionEventEmitter);
26
+ export const ACTIVE_RELEASE_HASH = getActiveReleaseHashNative();
25
27
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["StallionNativeModule","STALLION_DISABLED_ERROR","withStallionNoop","useStallionModalNoop","withStallionMain","useStallionModalMain","stallionEventEmitter","withStallion","useStallionModal","getStallionConfig","console","warn","sync","restart","useStallionUpdate","addEventListener","bind","removeEventListener"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,OAAOA,oBAAoB,IACzBC,uBAAuB,QAClB,wBAAwB;;AAE/B;AACA,OAAOC,gBAAgB,MAAM,qBAAqB;AAClD,OAAOC,oBAAoB,MAAM,yBAAyB;;AAE1D;AACA,OAAOC,gBAAgB,MAAM,2BAA2B;AACxD,OAAOC,oBAAoB,MAAM,+BAA+B;AAGhE,SAASC,oBAAoB,QAAQ,mCAAmC;AAExE,OAAO,IAAIC,YAA2B;AACtC,OAAO,IAAIC,gBAAyC;AAEpD,IAAIR,oBAAoB,aAApBA,oBAAoB,eAApBA,oBAAoB,CAAES,iBAAiB,EAAE;EAC3CF,YAAY,GAAGH,gBAAgB;EAC/BI,gBAAgB,GAAGH,oBAAoB;AACzC,CAAC,MAAM;EACLK,OAAO,CAACC,IAAI,CAACV,uBAAuB,CAAC;EACrCM,YAAY,GAAGL,gBAAgB;EAC/BM,gBAAgB,GAAGL,oBAAoB;AACzC;AAEA,SAASS,IAAI,EAAEC,OAAO,QAAQ,kCAAkC;AAChE,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,OAAO,MAAMC,gBAAgB,GAC3BT,oBAAoB,CAACS,gBAAgB,CAACC,IAAI,CAACV,oBAAoB,CAAC;AAClE,OAAO,MAAMW,mBAAmB,GAC9BX,oBAAoB,CAACW,mBAAmB,CAACD,IAAI,CAACV,oBAAoB,CAAC"}
1
+ {"version":3,"names":["StallionNativeModule","STALLION_DISABLED_ERROR","withStallionNoop","useStallionModalNoop","withStallionMain","useStallionModalMain","stallionEventEmitter","getActiveReleaseHashNative","withStallion","useStallionModal","getStallionConfig","console","warn","sync","restart","useStallionUpdate","addEventListener","bind","removeEventListener","ACTIVE_RELEASE_HASH"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,OAAOA,oBAAoB,IACzBC,uBAAuB,QAClB,wBAAwB;;AAE/B;AACA,OAAOC,gBAAgB,MAAM,qBAAqB;AAClD,OAAOC,oBAAoB,MAAM,yBAAyB;;AAE1D;AACA,OAAOC,gBAAgB,MAAM,2BAA2B;AACxD,OAAOC,oBAAoB,MAAM,+BAA+B;AAGhE,SAASC,oBAAoB,QAAQ,mCAAmC;AACxE,SAASC,0BAA0B,QAAQ,kCAAkC;AAE7E,OAAO,IAAIC,YAA2B;AACtC,OAAO,IAAIC,gBAAyC;AAEpD,IAAIT,oBAAoB,aAApBA,oBAAoB,eAApBA,oBAAoB,CAAEU,iBAAiB,EAAE;EAC3CF,YAAY,GAAGJ,gBAAgB;EAC/BK,gBAAgB,GAAGJ,oBAAoB;AACzC,CAAC,MAAM;EACLM,OAAO,CAACC,IAAI,CAACX,uBAAuB,CAAC;EACrCO,YAAY,GAAGN,gBAAgB;EAC/BO,gBAAgB,GAAGN,oBAAoB;AACzC;AAEA,SAASU,IAAI,EAAEC,OAAO,QAAQ,kCAAkC;AAChE,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,OAAO,MAAMC,gBAAgB,GAC3BV,oBAAoB,CAACU,gBAAgB,CAACC,IAAI,CAACX,oBAAoB,CAAC;AAClE,OAAO,MAAMY,mBAAmB,GAC9BZ,oBAAoB,CAACY,mBAAmB,CAACD,IAAI,CAACX,oBAAoB,CAAC;AAErE,OAAO,MAAMa,mBAAmB,GAAGZ,0BAA0B,CAAC,CAAC"}
@@ -36,4 +36,7 @@ export const restart = () => {
36
36
  var _StallionNativeModule;
37
37
  StallionNativeModule === null || StallionNativeModule === void 0 ? void 0 : (_StallionNativeModule = StallionNativeModule.restart) === null || _StallionNativeModule === void 0 ? void 0 : _StallionNativeModule.call(StallionNativeModule);
38
38
  };
39
+ export const getActiveReleaseHashNative = () => {
40
+ return (StallionNativeModule === null || StallionNativeModule === void 0 ? void 0 : StallionNativeModule.getActiveReleaseHash()) || null;
41
+ };
39
42
  //# sourceMappingURL=StallionNativeUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["StallionNativeModule","setSdkTokenNative","updateSdkToken","getStallionMetaNative","Promise","resolve","reject","getStallionMeta","then","metaString","JSON","parse","_","catch","getStallionConfigNative","getStallionConfig","configString","toggleStallionSwitchNative","toggleStallionSwitch","downloadBundleNative","downloadStageBundle","onLaunchNative","onLaunch","sync","popEventsNative","popEvents","acknowledgeEventsNative","acknowledgeEvents","restart","_StallionNativeModule","call"],"sourceRoot":"../../../../src","sources":["main/utils/StallionNativeUtils.ts"],"mappings":"AAAA,OAAOA,oBAAoB,MAAM,4BAA4B;AAW7D,OAAO,MAAMC,iBAAqC,GAChDD,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEE,cAAc;AAEtC,OAAO,MAAMC,qBAA6C,GAAGA,CAAA,KAAM;EACjE,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCN,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEO,eAAe,CAAC,CAAC,CACpCC,IAAI,CAAEC,UAAkB,IAAK;MAC5B,IAAI;QACFJ,OAAO,CAACK,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC,CAAC;MACjC,CAAC,CAAC,OAAOG,CAAC,EAAE;QACVN,MAAM,CAAC,qBAAqB,CAAC;MAC/B;IACF,CAAC,CAAC,CACDO,KAAK,CAAC,MAAM;MACXP,MAAM,CAAC,6BAA6B,CAAC;IACvC,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMQ,uBAAiD,GAAGA,CAAA,KAAM;EACrE,OAAO,IAAIV,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCN,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEe,iBAAiB,CAAC,CAAC,CACtCP,IAAI,CAAEQ,YAAoB,IAAK;MAC9B,IAAI;QACFX,OAAO,CAACK,IAAI,CAACC,KAAK,CAACK,YAAY,CAAC,CAAC;MACnC,CAAC,CAAC,OAAOJ,CAAC,EAAE;QACVN,MAAM,CAAC,uBAAuB,CAAC;MACjC;IACF,CAAC,CAAC,CACDO,KAAK,CAAC,MAAM;MACXP,MAAM,CAAC,+BAA+B,CAAC;IACzC,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMW,0BAAuD,GAClEjB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEkB,oBAAoB;AAE5C,OAAO,MAAMC,oBAA2C,GACtDnB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEoB,mBAAmB;AAE3C,OAAO,MAAMC,cAAqC,GAChDrB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEsB,QAAQ;AAEhC,OAAO,MAAMC,IAAgB,GAAGvB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEuB,IAAI;AAE1D,OAAO,MAAMC,eAAsC,GACjDxB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEyB,SAAS;AAEjC,OAAO,MAAMC,uBAA8D,GACzE1B,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAE2B,iBAAiB;AAEzC,OAAO,MAAMC,OAAO,GAAGA,CAAA,KAAM;EAAA,IAAAC,qBAAA;EAC3B7B,oBAAoB,aAApBA,oBAAoB,wBAAA6B,qBAAA,GAApB7B,oBAAoB,CAAE4B,OAAO,cAAAC,qBAAA,uBAA7BA,qBAAA,CAAAC,IAAA,CAAA9B,oBAAgC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"names":["StallionNativeModule","setSdkTokenNative","updateSdkToken","getStallionMetaNative","Promise","resolve","reject","getStallionMeta","then","metaString","JSON","parse","_","catch","getStallionConfigNative","getStallionConfig","configString","toggleStallionSwitchNative","toggleStallionSwitch","downloadBundleNative","downloadStageBundle","onLaunchNative","onLaunch","sync","popEventsNative","popEvents","acknowledgeEventsNative","acknowledgeEvents","restart","_StallionNativeModule","call","getActiveReleaseHashNative","getActiveReleaseHash"],"sourceRoot":"../../../../src","sources":["main/utils/StallionNativeUtils.ts"],"mappings":"AAAA,OAAOA,oBAAoB,MAAM,4BAA4B;AAY7D,OAAO,MAAMC,iBAAqC,GAChDD,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEE,cAAc;AAEtC,OAAO,MAAMC,qBAA6C,GAAGA,CAAA,KAAM;EACjE,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCN,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEO,eAAe,CAAC,CAAC,CACpCC,IAAI,CAAEC,UAAkB,IAAK;MAC5B,IAAI;QACFJ,OAAO,CAACK,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC,CAAC;MACjC,CAAC,CAAC,OAAOG,CAAC,EAAE;QACVN,MAAM,CAAC,qBAAqB,CAAC;MAC/B;IACF,CAAC,CAAC,CACDO,KAAK,CAAC,MAAM;MACXP,MAAM,CAAC,6BAA6B,CAAC;IACvC,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMQ,uBAAiD,GAAGA,CAAA,KAAM;EACrE,OAAO,IAAIV,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCN,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEe,iBAAiB,CAAC,CAAC,CACtCP,IAAI,CAAEQ,YAAoB,IAAK;MAC9B,IAAI;QACFX,OAAO,CAACK,IAAI,CAACC,KAAK,CAACK,YAAY,CAAC,CAAC;MACnC,CAAC,CAAC,OAAOJ,CAAC,EAAE;QACVN,MAAM,CAAC,uBAAuB,CAAC;MACjC;IACF,CAAC,CAAC,CACDO,KAAK,CAAC,MAAM;MACXP,MAAM,CAAC,+BAA+B,CAAC;IACzC,CAAC,CAAC;EACN,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMW,0BAAuD,GAClEjB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEkB,oBAAoB;AAE5C,OAAO,MAAMC,oBAA2C,GACtDnB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEoB,mBAAmB;AAE3C,OAAO,MAAMC,cAAqC,GAChDrB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEsB,QAAQ;AAEhC,OAAO,MAAMC,IAAgB,GAAGvB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEuB,IAAI;AAE1D,OAAO,MAAMC,eAAsC,GACjDxB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEyB,SAAS;AAEjC,OAAO,MAAMC,uBAA8D,GACzE1B,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAE2B,iBAAiB;AAEzC,OAAO,MAAMC,OAAO,GAAGA,CAAA,KAAM;EAAA,IAAAC,qBAAA;EAC3B7B,oBAAoB,aAApBA,oBAAoB,wBAAA6B,qBAAA,GAApB7B,oBAAoB,CAAE4B,OAAO,cAAAC,qBAAA,uBAA7BA,qBAAA,CAAAC,IAAA,CAAA9B,oBAAgC,CAAC;AACnC,CAAC;AAED,OAAO,MAAM+B,0BAAuD,GAAGA,CAAA,KAAM;EAC3E,OAAO,CAAA/B,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEgC,oBAAoB,CAAC,CAAC,KAAI,IAAI;AAC7D,CAAC"}
package/types/index.d.ts CHANGED
@@ -5,4 +5,5 @@ export { sync, restart } from './main/utils/StallionNativeUtils';
5
5
  export { useStallionUpdate } from './main/utils/useStallionUpdate';
6
6
  export declare const addEventListener: (listener: (data?: import("./main/state/useStallionEvents").IStallionNativeEventData | undefined) => void) => void;
7
7
  export declare const removeEventListener: (listenerToRemove: (data?: import("./main/state/useStallionEvents").IStallionNativeEventData | undefined) => void) => void;
8
+ export declare const ACTIVE_RELEASE_HASH: string | null;
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGvE,eAAO,IAAI,YAAY,EAAE,aAAa,CAAC;AACvC,eAAO,IAAI,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAWrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,eAAO,MAAM,gBAAgB,oHACqC,CAAC;AACnE,eAAO,MAAM,mBAAmB,4HACqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIvE,eAAO,IAAI,YAAY,EAAE,aAAa,CAAC;AACvC,eAAO,IAAI,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAWrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,eAAO,MAAM,gBAAgB,oHACqC,CAAC;AACnE,eAAO,MAAM,mBAAmB,4HACqC,CAAC;AAEtE,eAAO,MAAM,mBAAmB,eAA+B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { TDownloadBundleNative, TSetSdkTokenNative, TGetStallionMetaNative, TToggleStallionSwitchNative, TOnLaunchBundleNative, TGetStallionConfigNative } from 'src/types/utils.types';
1
+ import { TDownloadBundleNative, TSetSdkTokenNative, TGetStallionMetaNative, TToggleStallionSwitchNative, TOnLaunchBundleNative, TGetStallionConfigNative, TGetActiveReleaseHashNative } from 'src/types/utils.types';
2
2
  export declare const setSdkTokenNative: TSetSdkTokenNative;
3
3
  export declare const getStallionMetaNative: TGetStallionMetaNative;
4
4
  export declare const getStallionConfigNative: TGetStallionConfigNative;
@@ -9,4 +9,5 @@ export declare const sync: () => void;
9
9
  export declare const popEventsNative: () => Promise<string>;
10
10
  export declare const acknowledgeEventsNative: (eventIds: string) => Promise<string>;
11
11
  export declare const restart: () => void;
12
+ export declare const getActiveReleaseHashNative: TGetActiveReleaseHashNative;
12
13
  //# sourceMappingURL=StallionNativeUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StallionNativeUtils.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/StallionNativeUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,iBAAiB,EAAE,kBACM,CAAC;AAEvC,eAAO,MAAM,qBAAqB,EAAE,sBAcnC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,wBAcrC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,2BACG,CAAC;AAE7C,eAAO,MAAM,oBAAoB,EAAE,qBACQ,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,qBACG,CAAC;AAEjC,eAAO,MAAM,IAAI,EAAE,MAAM,IAAiC,CAAC;AAE3D,eAAO,MAAM,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CACjB,CAAC;AAElC,eAAO,MAAM,uBAAuB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CACjC,CAAC;AAE1C,eAAO,MAAM,OAAO,YAEnB,CAAC"}
1
+ {"version":3,"file":"StallionNativeUtils.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/StallionNativeUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,EAC5B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,iBAAiB,EAAE,kBACM,CAAC;AAEvC,eAAO,MAAM,qBAAqB,EAAE,sBAcnC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,wBAcrC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,2BACG,CAAC;AAE7C,eAAO,MAAM,oBAAoB,EAAE,qBACQ,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,qBACG,CAAC;AAEjC,eAAO,MAAM,IAAI,EAAE,MAAM,IAAiC,CAAC;AAE3D,eAAO,MAAM,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CACjB,CAAC;AAElC,eAAO,MAAM,uBAAuB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CACjC,CAAC;AAE1C,eAAO,MAAM,OAAO,YAEnB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,2BAExC,CAAC"}
@@ -24,6 +24,7 @@ export type TGetStallionConfigNative = () => Promise<IStallionConfigJson>;
24
24
  export type TToggleStallionSwitchNative = (switchState: SWITCH_STATES) => Promise<string>;
25
25
  export type TDownloadBundleNative = (bundleInfo: IBundleInfo) => Promise<string>;
26
26
  export type TOnLaunchBundleNative = (stallionInitParams: string) => void;
27
+ export type TGetActiveReleaseHashNative = () => string | null;
27
28
  export interface IUseStallionUpdate {
28
29
  isRestartRequired: boolean;
29
30
  currentlyRunningBundle: IUpdateMeta | null;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,MAAM,MAAM,aAAa,GAAG,CAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,CAAC,EAAE,mBAAmB,KAC5B,KAAK,CAAC,aAAa,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC7B,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,aAAa,KACvB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAClC,UAAU,EAAE,WAAW,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC"}
1
+ {"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,MAAM,MAAM,aAAa,GAAG,CAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,CAAC,EAAE,mBAAmB,KAC5B,KAAK,CAAC,aAAa,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC7B,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,aAAa,KACvB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAClC,UAAU,EAAE,WAAW,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,2BAA2B,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC"}