pulse-updates 1.0.8 → 1.0.9

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.
@@ -541,8 +541,18 @@ class PulseController private constructor() {
541
541
  result.fold(
542
542
  onSuccess = { checkResult ->
543
543
  if (checkResult.isAvailable && checkResult.manifest != null) {
544
+ // Compare commitTime: if embedded is newer, don't show update
545
+ val embeddedCommitTime = embeddedManifest?.commitTime ?: 0L
546
+ val otaCommitTime = checkResult.manifest.commitTime?.time ?: 0L
547
+
548
+ if (embeddedCommitTime > 0 && otaCommitTime > 0 && embeddedCommitTime >= otaCommitTime) {
549
+ pulseLog(TAG, "checkForUpdate: embedded is newer or same (embedded=$embeddedCommitTime >= ota=$otaCommitTime), no update needed")
550
+ callback(Result.success(CheckResult(isAvailable = false)))
551
+ return@checkForUpdate
552
+ }
553
+
544
554
  lastCheckManifest = checkResult.manifest
545
- pulseLog(TAG, "checkForUpdate: cached manifest for fetch")
555
+ pulseLog(TAG, "checkForUpdate: cached manifest for fetch (ota=$otaCommitTime > embedded=$embeddedCommitTime)")
546
556
  }
547
557
  },
548
558
  onFailure = { }
@@ -749,6 +759,11 @@ class PulseController private constructor() {
749
759
  bundleHash = update.bundleHash,
750
760
  scopeKey = update.scopeKey
751
761
  )
762
+
763
+ // Load manifest from database for metadata (build number, etc.)
764
+ update.manifest?.let { manifest ->
765
+ launchedManifestJson = manifest.toString()
766
+ }
752
767
  }
753
768
  }
754
769
 
@@ -517,9 +517,25 @@ public final class PulseController {
517
517
  config: config,
518
518
  currentUpdateId: launchedUpdate?.updateId
519
519
  ) { [weak self] (result: Result<PulseCheckResult, Error>) in
520
+ guard let self = self else {
521
+ completion(result)
522
+ return
523
+ }
524
+
520
525
  // Cache the manifest for subsequent fetchUpdate call
521
- if case .success(let checkResult) = result, checkResult.isAvailable {
522
- self?.lastCheckManifest = checkResult.manifest
526
+ if case .success(let checkResult) = result, checkResult.isAvailable, let otaManifest = checkResult.manifest {
527
+ // Compare commitTime: if embedded is newer, don't show update
528
+ let embeddedCommitTime = self.embeddedManifest?.commitTime ?? Date.distantPast
529
+ let otaCommitTime = otaManifest.commitTime ?? Date.distantPast
530
+
531
+ if embeddedCommitTime >= otaCommitTime {
532
+ pulseLog("checkForUpdate: embedded is newer or same (embedded=\(embeddedCommitTime) >= ota=\(otaCommitTime)), no update needed")
533
+ completion(.success(PulseCheckResult(isAvailable: false)))
534
+ return
535
+ }
536
+
537
+ self.lastCheckManifest = otaManifest
538
+ pulseLog("checkForUpdate: cached manifest for fetch (ota=\(otaCommitTime) > embedded=\(embeddedCommitTime))")
523
539
  }
524
540
  completion(result)
525
541
  }
@@ -805,6 +821,13 @@ public final class PulseController {
805
821
  bundleHash: update.bundleHash,
806
822
  scopeKey: update.scopeKey
807
823
  )
824
+
825
+ // Load manifest from database for metadata (build number, etc.)
826
+ if let manifest = update.manifest,
827
+ let data = try? JSONSerialization.data(withJSONObject: manifest, options: []),
828
+ let jsonString = String(data: data, encoding: .utf8) {
829
+ self.launchedManifestJson = jsonString
830
+ }
808
831
  }
809
832
  }
810
833
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulse-updates",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "OTA updates for React Native - lightweight alternative to expo-updates",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -226,6 +226,13 @@ async function main() {
226
226
  const isDrawable = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(type);
227
227
  assetInfo.resourcesFolder = isDrawable ? 'drawable' : 'raw';
228
228
  assetInfo.resourcesFilename = getAndroidResourceIdentifier(relative, name);
229
+ // Also set mainBundleDir/mainBundleFilename for Kotlin code compatibility
230
+ // Assets are copied to pulse/assets/<relative_path> in the APK
231
+ const relativeDir = path.dirname(relative);
232
+ assetInfo.mainBundleDir = relativeDir && relativeDir !== '.'
233
+ ? `pulse/assets/${relativeDir}`
234
+ : 'pulse/assets';
235
+ assetInfo.mainBundleFilename = path.basename(relative);
229
236
  }
230
237
 
231
238
  assets.push(assetInfo);