pulse-updates 1.2.2 → 1.2.4

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.
@@ -680,6 +680,20 @@ class PulseController private constructor() {
680
680
  // Re-select the best update before reloading
681
681
  launchBestUpdate { success ->
682
682
  pulseLog(TAG, "Reload: launchBestUpdate success=$success")
683
+ if (!success) {
684
+ // Same fallback the cold-start path has always had, and for the same reason: with no
685
+ // launchable update left, launchAssetFile still points at whatever was running, so the
686
+ // host reload below would come straight back up on the bundle we are trying to leave.
687
+ //
688
+ // That is not hypothetical. Measured on a Pixel 6a (2026-08-26): an update that marks
689
+ // ITSELF unusable (Bastion's Layer-0 canary) marked itself FAILED, which emptied the
690
+ // launchable list, launchBestUpdate failed, and the app reloaded into the same broken
691
+ // bundle 29 times in a row — a splash screen that never resolves, which is worse than
692
+ // the problem it was trying to escape. Falling back to the bundle inside the APK gives
693
+ // the reload something good to land on.
694
+ pulseLogWarn(TAG, "Reload: no launchable update, falling back to embedded")
695
+ launchEmbedded()
696
+ }
683
697
  callback(success)
684
698
  }
685
699
  }
@@ -698,10 +712,27 @@ class PulseController private constructor() {
698
712
  runReaper()
699
713
  }
700
714
 
715
+ /**
716
+ * Report that THIS update is not usable, from JS.
717
+ *
718
+ * It used to only bump the failure counter, which nothing reads at selection time:
719
+ * launchableUpdates() filters on `status IN ('ready','embedded')`, so the update stayed
720
+ * selectable and the next launch booted the very bundle the caller had just declared broken.
721
+ * The API said "trigger rollback on next start" and did not. Now it marks the update FAILED —
722
+ * the same thing the native crash handler does — which is what actually takes it out of the
723
+ * running and falls back to the previous good update, or to the embedded one.
724
+ *
725
+ * The embedded bundle is never demoted: it is the floor, and excluding it would leave the app
726
+ * with nothing to launch.
727
+ */
701
728
  fun reportLaunchFailure(reason: String) {
702
729
  launchedUpdate?.let { update ->
703
730
  try {
704
731
  database?.recordFailedLaunch(update.updateId)
732
+ if (!update.isEmbedded) {
733
+ database?.setStatus(update.updateId, PulseUpdateStatus.FAILED)
734
+ pulseLogWarn(TAG, "reportLaunchFailure: marked ${update.updateId} FAILED ($reason)")
735
+ }
705
736
  } catch (e: Exception) {
706
737
  pulseLogWarn(TAG, "Failed to record launch failure: ${e.message}")
707
738
  }
@@ -713,7 +713,16 @@ public final class PulseController {
713
713
  /// Reload the app with the new update
714
714
  public func reload(completion: ((Bool) -> Void)? = nil) {
715
715
  // Re-select the best update before reloading
716
- launchBestUpdate { success in
716
+ launchBestUpdate { [weak self] success in
717
+ if !success {
718
+ // Same fallback the cold-start path has, and for the same reason: with no launchable
719
+ // update left, launchAssetUrl still points at whatever is running, so the reload comes
720
+ // straight back up on the bundle we are trying to leave. Measured on Android (Pixel 6a,
721
+ // 2026-08-26): an update that marked ITSELF unusable emptied the launchable list and the
722
+ // app reloaded into the same broken bundle 29 times — a splash that never resolves.
723
+ pulseLog("Reload: no launchable update, falling back to embedded")
724
+ self?.launchEmbedded()
725
+ }
717
726
  // Signal React Native to reload with the new bundle
718
727
  NotificationCenter.default.post(name: NSNotification.Name("PulseUpdatesReload"), object: nil)
719
728
  completion?(success)
@@ -769,6 +778,23 @@ public final class PulseController {
769
778
  errorRecovery?.handle(error: error)
770
779
  }
771
780
 
781
+ /// Mark THIS update unusable, from JS.
782
+ ///
783
+ /// The recovery pipeline only marks a failure when content never appeared, and even then it just
784
+ /// bumps the counter — which nothing reads when picking what to launch (the selection filters on
785
+ /// status). So an update the app itself declares broken stayed selectable and came back on the
786
+ /// next start. Flipping the status is what actually takes it out of the running.
787
+ ///
788
+ /// The embedded bundle is never demoted: it is the floor, and excluding it would leave nothing
789
+ /// to launch.
790
+ public func markLaunchFailed(_ reason: String) {
791
+ guard let update = launchedUpdate, !update.isEmbedded else { return }
792
+ try? database?.recordFailedLaunch(updateId: update.updateId)
793
+ try? database?.setStatus(.failed, forUpdateId: update.updateId)
794
+ reportEvent("launch_failure", updateId: update.updateId)
795
+ pulseLog("markLaunchFailed: marked \(update.updateId) failed (\(reason))")
796
+ }
797
+
772
798
  /// Report a fatal exception for error recovery handling
773
799
  public func reportException(_ exception: NSException) {
774
800
  errorRecovery?.handle(exception: exception)
@@ -219,6 +219,10 @@ public class PulseUpdates: RCTEventEmitter {
219
219
  func reportLaunchFailure(_ reason: String,
220
220
  resolve: @escaping RCTPromiseResolveBlock,
221
221
  reject: @escaping RCTPromiseRejectBlock) {
222
+ // Both halves: the recovery pipeline still sees the error (it drives its own policy), and the
223
+ // update is marked FAILED so the next selection actually skips it — which is what this API
224
+ // has always claimed to do.
225
+ PulseController.shared.markLaunchFailed(reason)
222
226
  let error = NSError(domain: "PulseUpdates", code: -1, userInfo: [NSLocalizedDescriptionKey: reason])
223
227
  PulseController.shared.reportError(error)
224
228
  resolve(nil)
@@ -7,6 +7,7 @@ exports.activateConfig = activateConfig;
7
7
  exports.canonicalizeConfigJson = canonicalizeConfigJson;
8
8
  exports.configureConfig = configureConfig;
9
9
  exports.fetchConfig = fetchConfig;
10
+ exports.flushExposures = flushExposures;
10
11
  exports.getAllConfig = getAllConfig;
11
12
  exports.getConfigBoolean = getConfigBoolean;
12
13
  exports.getConfigExperiments = getConfigExperiments;
@@ -18,8 +19,10 @@ exports.getConfigSource = getConfigSource;
18
19
  exports.getConfigString = getConfigString;
19
20
  exports.getConfigValue = getConfigValue;
20
21
  exports.getConfigVariant = getConfigVariant;
22
+ exports.getExposureDeliveryInfo = getExposureDeliveryInfo;
21
23
  exports.hasPendingConfig = hasPendingConfig;
22
24
  exports.onConfigChange = onConfigChange;
25
+ exports.pendingExposureCount = pendingExposureCount;
23
26
  exports.resetConfigForTests = resetConfigForTests;
24
27
  exports.setConfigDefaults = setConfigDefaults;
25
28
  exports.startConfigAutoRefresh = startConfigAutoRefresh;
@@ -75,6 +78,9 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
75
78
  const STORAGE_KEY = 'pulse.config.v1';
76
79
  const DEFAULT_POLL_MS = 5 * 60 * 1000;
77
80
  const DEFAULT_TIMEOUT_MS = 10_000;
81
+ const DEFAULT_EXPOSURE_RETRY_MS = 10_000;
82
+ const DEFAULT_EXPOSURE_STORAGE_KEY = 'pulse.exposures.v1';
83
+ const MAX_EXPOSURE_QUEUE = 50;
78
84
  let options = null;
79
85
  let defaults = {};
80
86
  let values = {};
@@ -98,6 +104,11 @@ let signatureKeyId = null;
98
104
  let pending = null;
99
105
  /** The arm set already reported this session, so a poll does not re-report it. */
100
106
  let reportedExposure = null;
107
+ let exposureQueue = [];
108
+ let deliveredExposureSignatures = new Set();
109
+ let exposureSending = false;
110
+ let exposureNextAttemptAt = 0;
111
+ let exposureTimer = null;
101
112
  let inFlight = null;
102
113
  let pollTimer = null;
103
114
  let configGeneration = 0;
@@ -114,6 +125,7 @@ function configureConfig(opts) {
114
125
  // may cross that boundary.
115
126
  configGeneration += 1;
116
127
  stopPolling();
128
+ stopExposureDelivery();
117
129
  options = opts;
118
130
  defaults = {
119
131
  ...(opts.defaults ?? {})
@@ -128,6 +140,10 @@ function configureConfig(opts) {
128
140
  signatureKeyId = null;
129
141
  pending = null;
130
142
  reportedExposure = null;
143
+ exposureQueue = readExposureQueue(opts);
144
+ deliveredExposureSignatures = readDeliveredExposureSignatures(opts);
145
+ exposureSending = false;
146
+ exposureNextAttemptAt = 0;
131
147
  inFlight = null;
132
148
  applyCachedPayload(readCache(opts.storage, opts.storageKey), opts);
133
149
  }
@@ -233,6 +249,8 @@ function hasPendingConfig() {
233
249
  */
234
250
  function startConfigAutoRefresh(appState) {
235
251
  void fetchConfig();
252
+ startExposureDelivery();
253
+ void flushExposures();
236
254
  const subscription = appState?.addEventListener('change', state => {
237
255
  if (state === 'active') void fetchConfig();
238
256
  });
@@ -247,6 +265,7 @@ function startConfigAutoRefresh(appState) {
247
265
  return () => {
248
266
  subscription?.remove();
249
267
  stopPolling();
268
+ stopExposureDelivery();
250
269
  };
251
270
  }
252
271
  function applySnapshot(next, opts) {
@@ -266,7 +285,7 @@ function applySnapshot(next, opts) {
266
285
  // Reported on apply, never on fetch: with activateOnFetch false a payload can sit
267
286
  // unapplied for the rest of a session, and an arm the app is not actually serving
268
287
  // is not an exposure.
269
- void reportExposure(opts);
288
+ queueExposure(opts);
270
289
 
271
290
  // Listeners drive re-renders and gate re-evaluation: firing them for an identical
272
291
  // payload is pure churn, and the 200-with-same-content case is common enough
@@ -292,32 +311,94 @@ function applySnapshot(next, opts) {
292
311
  * Failure is swallowed on purpose. This is a diagnostic, and no diagnostic is worth
293
312
  * a rejected promise on the path that delivers config to the app.
294
313
  */
295
- async function reportExposure(opts) {
314
+ function queueExposure(opts) {
296
315
  if (opts.reportExposure !== true) return;
297
316
  if (experiments.length === 0) return;
298
317
  const signature = experiments.map(e => `${e.key}=${e.variant}`).join(',');
299
- if (signature === reportedExposure) return;
300
- reportedExposure = signature;
318
+ if (signature === reportedExposure || deliveredExposureSignatures.has(signature) || exposureQueue.some(item => item.signature === signature)) return;
301
319
  const context = opts.getContext?.() ?? {};
302
320
  const assignments = {};
303
321
  for (const entry of experiments) assignments[entry.key] = entry.variant;
322
+ exposureQueue.push({
323
+ reportId: randomDeliveryId('exp'),
324
+ signature,
325
+ platform: context.platform,
326
+ appVersion: context.appVersion,
327
+ assignments,
328
+ attempts: 0
329
+ });
330
+ if (exposureQueue.length > MAX_EXPOSURE_QUEUE) {
331
+ exposureQueue = exposureQueue.slice(-MAX_EXPOSURE_QUEUE);
332
+ }
333
+ persistExposureQueue(opts, exposureQueue);
334
+ void flushExposures();
335
+ }
336
+
337
+ /** Flushes the durable exposure outbox. Safe to call on launch, resume or manually. */
338
+ async function flushExposures() {
339
+ if (!options || exposureSending || exposureQueue.length === 0 || Date.now() < exposureNextAttemptAt) return 0;
340
+ const opts = options;
341
+ const requestGeneration = configGeneration;
342
+ const item = exposureQueue[0];
343
+ exposureSending = true;
344
+ const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;
345
+ const timeout = controller ? setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS) : null;
304
346
  try {
305
- await fetch(`${opts.url.replace(/\/+$/, '')}/exposure`, {
347
+ const response = await fetch(`${opts.url.replace(/\/+$/, '')}/exposure`, {
306
348
  method: 'POST',
307
349
  headers: {
308
350
  'Content-Type': 'application/json'
309
351
  },
310
352
  body: JSON.stringify({
311
- platform: context.platform,
312
- appVersion: context.appVersion,
313
- assignments
314
- })
353
+ reportId: item.reportId,
354
+ platform: item.platform,
355
+ appVersion: item.appVersion,
356
+ assignments: item.assignments
357
+ }),
358
+ signal: controller?.signal
315
359
  });
316
- } catch {
317
- // A device that cannot report its arm still has the right arm.
318
- if (options === opts) reportedExposure = signature;
360
+ if (!response.ok) throw new Error(`Pulse exposure HTTP ${response.status}`);
361
+ if (requestGeneration === configGeneration && options === opts) {
362
+ exposureQueue = exposureQueue.filter(queued => queued.reportId !== item.reportId);
363
+ reportedExposure = item.signature;
364
+ deliveredExposureSignatures.add(item.signature);
365
+ persistDeliveredExposureSignatures(opts);
366
+ exposureNextAttemptAt = 0;
367
+ persistExposureQueue(opts, exposureQueue);
368
+ if (exposureQueue.length > 0) void flushExposures();
369
+ } else {
370
+ removeExposureFromStoredQueue(opts, item.reportId);
371
+ markStoredExposureDelivered(opts, item.signature);
372
+ }
373
+ return 1;
374
+ } catch (error) {
375
+ if (requestGeneration === configGeneration && options === opts) {
376
+ exposureQueue = exposureQueue.map(queued => queued.reportId === item.reportId ? {
377
+ ...queued,
378
+ attempts: queued.attempts + 1
379
+ } : queued);
380
+ const attempts = Math.min(item.attempts + 1, 6);
381
+ const base = Math.min(60_000, 1_000 * 2 ** Math.max(0, attempts - 1));
382
+ exposureNextAttemptAt = Date.now() + base;
383
+ persistExposureQueue(opts, exposureQueue);
384
+ }
385
+ opts.onError?.(error);
386
+ return 0;
387
+ } finally {
388
+ if (timeout) clearTimeout(timeout);
389
+ if (requestGeneration === configGeneration) exposureSending = false;
319
390
  }
320
391
  }
392
+ function pendingExposureCount() {
393
+ return exposureQueue.length;
394
+ }
395
+ function getExposureDeliveryInfo() {
396
+ return {
397
+ queueDepth: exposureQueue.length,
398
+ sending: exposureSending,
399
+ nextAttemptAt: exposureNextAttemptAt
400
+ };
401
+ }
321
402
 
322
403
  /**
323
404
  * Verifies the exact unsigned JSON object the server signs. A configured verifier
@@ -461,6 +542,85 @@ function stopPolling() {
461
542
  pollTimer = null;
462
543
  }
463
544
  }
545
+ function startExposureDelivery() {
546
+ stopExposureDelivery();
547
+ if (options?.reportExposure !== true) return;
548
+ exposureTimer = setInterval(() => void flushExposures(), DEFAULT_EXPOSURE_RETRY_MS);
549
+ exposureTimer.unref?.();
550
+ }
551
+ function stopExposureDelivery() {
552
+ if (exposureTimer) clearInterval(exposureTimer);
553
+ exposureTimer = null;
554
+ }
555
+ function exposureStorageKey(opts) {
556
+ if (opts.exposureStorageKey?.trim()) return opts.exposureStorageKey.trim();
557
+ if (opts.storageKey?.trim()) return `${opts.storageKey.trim()}.exposures`;
558
+ return DEFAULT_EXPOSURE_STORAGE_KEY;
559
+ }
560
+ function deliveredExposureStorageKey(opts) {
561
+ return `${exposureStorageKey(opts)}.delivered`;
562
+ }
563
+ function readExposureQueue(opts) {
564
+ if (!opts.storage) return [];
565
+ try {
566
+ const raw = opts.storage.getString(exposureStorageKey(opts));
567
+ if (!raw) return [];
568
+ const parsed = JSON.parse(raw);
569
+ if (!Array.isArray(parsed)) return [];
570
+ return parsed.filter(item => Boolean(item && typeof item === 'object' && typeof item.reportId === 'string' && typeof item.signature === 'string' && typeof item.assignments === 'object' && typeof item.attempts === 'number')).slice(-MAX_EXPOSURE_QUEUE);
571
+ } catch {
572
+ return [];
573
+ }
574
+ }
575
+ function persistExposureQueue(opts, queued) {
576
+ if (!opts.storage) return;
577
+ try {
578
+ opts.storage.set(exposureStorageKey(opts), JSON.stringify(queued));
579
+ } catch {
580
+ // Exposure delivery is diagnostic and may never make config adoption fail.
581
+ }
582
+ }
583
+ function readDeliveredExposureSignatures(opts) {
584
+ if (!opts.storage) return new Set();
585
+ try {
586
+ const raw = opts.storage.getString(deliveredExposureStorageKey(opts));
587
+ if (!raw) return new Set();
588
+ const parsed = JSON.parse(raw);
589
+ if (!Array.isArray(parsed)) return new Set();
590
+ return new Set(parsed.filter(value => typeof value === 'string').slice(-100));
591
+ } catch {
592
+ return new Set();
593
+ }
594
+ }
595
+ function persistDeliveredExposureSignatures(opts) {
596
+ if (!opts.storage) return;
597
+ try {
598
+ const values = [...deliveredExposureSignatures].slice(-100);
599
+ opts.storage.set(deliveredExposureStorageKey(opts), JSON.stringify(values));
600
+ } catch {
601
+ // The server-side reportId still protects retries in this process.
602
+ }
603
+ }
604
+ function markStoredExposureDelivered(opts, signature) {
605
+ if (!opts.storage) return;
606
+ try {
607
+ const stored = readDeliveredExposureSignatures(opts);
608
+ stored.add(signature);
609
+ opts.storage.set(deliveredExposureStorageKey(opts), JSON.stringify([...stored].slice(-100)));
610
+ } catch {
611
+ // A later server retry remains idempotent through its reportId.
612
+ }
613
+ }
614
+ function removeExposureFromStoredQueue(opts, reportId) {
615
+ if (!opts.storage) return;
616
+ const queued = readExposureQueue(opts).filter(item => item.reportId !== reportId);
617
+ persistExposureQueue(opts, queued);
618
+ }
619
+ function randomDeliveryId(prefix) {
620
+ const cryptoLike = globalThis.crypto;
621
+ if (typeof cryptoLike?.randomUUID === 'function') return `${prefix}-${cryptoLike.randomUUID()}`;
622
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 14)}`;
623
+ }
464
624
 
465
625
  // ─── Reads ────────────────────────────────────────────────────────────────────
466
626
 
@@ -580,8 +740,13 @@ function resetConfigForTests() {
580
740
  inFlight = null;
581
741
  pending = null;
582
742
  reportedExposure = null;
743
+ exposureQueue = [];
744
+ deliveredExposureSignatures = new Set();
745
+ exposureSending = false;
746
+ exposureNextAttemptAt = 0;
583
747
  listeners.clear();
584
748
  stopPolling();
749
+ stopExposureDelivery();
585
750
  }
586
751
 
587
752
  // ─── Internals ────────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"names":["_tweetnacl","_interopRequireDefault","require","e","__esModule","default","STORAGE_KEY","DEFAULT_POLL_MS","DEFAULT_TIMEOUT_MS","options","defaults","values","experiments","etag","fetchedAt","verifiedAt","source","signatureStatus","signatureKeyId","pending","reportedExposure","inFlight","pollTimer","configGeneration","listeners","Set","configureConfig","opts","stopPolling","applyCachedPayload","readCache","storage","storageKey","setConfigDefaults","more","fetchConfig","minInterval","minimumFetchIntervalMs","Date","now","requestGeneration","request","controller","AbortController","timer","setTimeout","abort","timeoutMs","response","fetch","url","method","headers","buildHeaders","signal","status","ok","Error","payload","json","verifyConfigPayload","payloadObject","nextValues","Array","isArray","get","snapshot","parseExperiments","activateOnFetch","applySnapshot","error","onError","clearTimeout","activateConfig","next","hasPendingConfig","startConfigAutoRefresh","appState","subscription","addEventListener","state","interval","pollIntervalMs","setInterval","unref","remove","changed","shallowEqual","sameExperiments","writeCache","signatureVerified","reportExposure","notify","length","signature","map","key","variant","join","context","getContext","assignments","entry","replace","body","JSON","stringify","platform","appVersion","setSignatureState","keyId","verificationConfigured","Boolean","requireSignature","signingPublicKey","signingKeyId","verifySignature","record","rawSignature","isConfigSignature","alg","toLowerCase","unsigned","locallyCanonical","canonicalizeConfigJson","canonical","parse","valid","nacl","sign","detached","verify","utf8Bytes","decodeBase64","sig","value","undefined","Object","keys","sort","atobLike","globalThis","atob","decoded","Uint8Array","from","char","charCodeAt","BufferCtor","Buffer","Encoder","TextEncoder","encode","encoded","unescape","encodeURIComponent","raw","filter","a","b","every","i","aKeys","bKeys","k","av","bv","clearInterval","getConfigValue","prototype","hasOwnProperty","call","fallback","getConfigBoolean","getConfigNumber","parsed","Number","isNaN","getConfigString","String","getAllConfig","getConfigJson","getConfigSource","getConfigExperiments","getConfigVariant","experimentKey","find","getConfigKeys","onConfigChange","listener","add","delete","getConfigInfo","keyCount","resetConfigForTests","clear","currentEtag","ctx","Accept","osVersion","language","deviceId","userId","userAttributes","getString","trim","parseCachedPayload","cached","set","forEach"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_tweetnacl","_interopRequireDefault","require","e","__esModule","default","STORAGE_KEY","DEFAULT_POLL_MS","DEFAULT_TIMEOUT_MS","DEFAULT_EXPOSURE_RETRY_MS","DEFAULT_EXPOSURE_STORAGE_KEY","MAX_EXPOSURE_QUEUE","options","defaults","values","experiments","etag","fetchedAt","verifiedAt","source","signatureStatus","signatureKeyId","pending","reportedExposure","exposureQueue","deliveredExposureSignatures","Set","exposureSending","exposureNextAttemptAt","exposureTimer","inFlight","pollTimer","configGeneration","listeners","configureConfig","opts","stopPolling","stopExposureDelivery","readExposureQueue","readDeliveredExposureSignatures","applyCachedPayload","readCache","storage","storageKey","setConfigDefaults","more","fetchConfig","minInterval","minimumFetchIntervalMs","Date","now","requestGeneration","request","controller","AbortController","timer","setTimeout","abort","timeoutMs","response","fetch","url","method","headers","buildHeaders","signal","status","ok","Error","payload","json","verifyConfigPayload","payloadObject","nextValues","Array","isArray","get","snapshot","parseExperiments","activateOnFetch","applySnapshot","error","onError","clearTimeout","activateConfig","next","hasPendingConfig","startConfigAutoRefresh","appState","startExposureDelivery","flushExposures","subscription","addEventListener","state","interval","pollIntervalMs","setInterval","unref","remove","changed","shallowEqual","sameExperiments","writeCache","signatureVerified","queueExposure","notify","reportExposure","length","signature","map","key","variant","join","has","some","item","context","getContext","assignments","entry","push","reportId","randomDeliveryId","platform","appVersion","attempts","slice","persistExposureQueue","timeout","replace","body","JSON","stringify","filter","queued","add","persistDeliveredExposureSignatures","removeExposureFromStoredQueue","markStoredExposureDelivered","Math","min","base","max","pendingExposureCount","getExposureDeliveryInfo","queueDepth","sending","nextAttemptAt","setSignatureState","keyId","verificationConfigured","Boolean","requireSignature","signingPublicKey","signingKeyId","verifySignature","record","rawSignature","isConfigSignature","alg","toLowerCase","unsigned","locallyCanonical","canonicalizeConfigJson","canonical","parse","valid","nacl","sign","detached","verify","utf8Bytes","decodeBase64","sig","value","undefined","Object","keys","sort","atobLike","globalThis","atob","decoded","Uint8Array","from","char","charCodeAt","BufferCtor","Buffer","Encoder","TextEncoder","encode","encoded","unescape","encodeURIComponent","raw","a","b","every","i","aKeys","bKeys","k","av","bv","clearInterval","exposureStorageKey","trim","deliveredExposureStorageKey","getString","parsed","set","stored","prefix","cryptoLike","crypto","randomUUID","random","toString","getConfigValue","prototype","hasOwnProperty","call","fallback","getConfigBoolean","getConfigNumber","Number","isNaN","getConfigString","String","getAllConfig","getConfigJson","getConfigSource","getConfigExperiments","getConfigVariant","experimentKey","find","getConfigKeys","onConfigChange","listener","delete","getConfigInfo","keyCount","resetConfigForTests","clear","currentEtag","ctx","Accept","osVersion","language","deviceId","userId","userAttributes","parseCachedPayload","cached","forEach"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createPulseDecisionClient = createPulseDecisionClient;
7
+ const DEFAULT_OUTCOME_FLUSH_MS = 10_000;
8
+ const DEFAULT_OUTCOME_MAX_QUEUE = 100;
9
+
7
10
  /** Generic decision protocol. Product-specific action handlers remain in each app. */
8
11
  function createPulseDecisionClient(options) {
9
12
  const fetcher = options.fetch ?? globalThis.fetch;
@@ -11,26 +14,77 @@ function createPulseDecisionClient(options) {
11
14
  const slug = encodeURIComponent(options.appSlug);
12
15
  const timeoutMs = Math.max(250, options.timeoutMs ?? 3_000);
13
16
  const executionMode = options.executionMode ?? 'shadow-only';
14
- const reportOutcome = async (decisionId, outcome, metadata) => {
17
+ const storageKey = options.storageKey?.trim() || `pulse.${options.appSlug.trim()}.outcomes.v1`;
18
+ const maxQueue = Math.max(1, options.maxQueue ?? DEFAULT_OUTCOME_MAX_QUEUE);
19
+ let outcomeQueue = readOutcomeQueue(options.storage, storageKey, maxQueue);
20
+ let outcomeSending = false;
21
+ let outcomeNextAttemptAt = 0;
22
+ let disposed = false;
23
+ const persistOutcomes = () => {
24
+ if (!options.storage) return;
25
+ try {
26
+ options.storage.set(storageKey, JSON.stringify(outcomeQueue));
27
+ } catch {
28
+ // A storage failure may reduce durability, but decision execution itself must
29
+ // remain available and the caller still receives the delivery result.
30
+ }
31
+ };
32
+ const flushOutcomes = async () => {
33
+ if (disposed || outcomeSending || outcomeQueue.length === 0 || Date.now() < outcomeNextAttemptAt) return 0;
34
+ outcomeSending = true;
35
+ const queued = outcomeQueue[0];
15
36
  try {
16
- const response = await timedFetch(fetcher, `${base}/pulse/decisions/${slug}/${encodeURIComponent(decisionId)}/outcome`, {
37
+ const response = await timedFetch(fetcher, `${base}/pulse/decisions/${slug}/${encodeURIComponent(queued.decisionId)}/outcome`, {
17
38
  method: 'POST',
18
39
  headers: {
19
40
  'Content-Type': 'application/json'
20
41
  },
21
42
  body: JSON.stringify({
22
- outcome,
23
- ...(metadata ? {
24
- metadata
43
+ outcome: queued.outcome,
44
+ ...(queued.metadata ? {
45
+ metadata: queued.metadata
25
46
  } : {})
26
47
  })
27
48
  }, timeoutMs);
28
- return response.ok;
49
+ if (!response.ok) throw new Error(`Pulse outcome HTTP ${response.status}`);
50
+
51
+ // A newer terminal state may have replaced this one while the request was in
52
+ // flight (accepted -> converted). Remove only the exact revision delivered.
53
+ outcomeQueue = outcomeQueue.filter(item => item.decisionId !== queued.decisionId || item.revision !== queued.revision);
54
+ outcomeNextAttemptAt = 0;
55
+ persistOutcomes();
56
+ return 1;
29
57
  } catch (error) {
58
+ const current = outcomeQueue.find(item => item.decisionId === queued.decisionId);
59
+ if (current?.revision === queued.revision) current.attempts += 1;
60
+ const attempts = Math.min(current?.attempts ?? queued.attempts + 1, 6);
61
+ const baseDelay = Math.min(60_000, 1_000 * 2 ** Math.max(0, attempts - 1));
62
+ outcomeNextAttemptAt = Date.now() + baseDelay;
63
+ persistOutcomes();
30
64
  options.onError?.(error);
31
- return false;
65
+ return 0;
66
+ } finally {
67
+ outcomeSending = false;
68
+ if (!disposed && outcomeNextAttemptAt === 0 && outcomeQueue.length > 0) void flushOutcomes();
32
69
  }
33
70
  };
71
+ const reportOutcome = async (decisionId, outcome, metadata) => {
72
+ if (!decisionId.trim() || disposed) return false;
73
+ const next = {
74
+ decisionId,
75
+ outcome,
76
+ metadata,
77
+ revision: randomKey(),
78
+ attempts: 0
79
+ };
80
+ const existing = outcomeQueue.findIndex(item => item.decisionId === decisionId);
81
+ if (existing >= 0) outcomeQueue[existing] = next;else outcomeQueue.push(next);
82
+ outcomeQueue = outcomeQueue.slice(-maxQueue);
83
+ outcomeNextAttemptAt = 0;
84
+ persistOutcomes();
85
+ await flushOutcomes();
86
+ return !outcomeQueue.some(item => item.decisionId === decisionId && item.revision === next.revision);
87
+ };
34
88
  const decide = async (trigger, request = {}) => {
35
89
  try {
36
90
  const context = await options.getContext();
@@ -83,11 +137,34 @@ function createPulseDecisionClient(options) {
83
137
  return null;
84
138
  }
85
139
  };
140
+ const timer = setInterval(() => void flushOutcomes(), options.flushIntervalMs ?? DEFAULT_OUTCOME_FLUSH_MS);
141
+ timer.unref?.();
142
+ void flushOutcomes();
86
143
  return {
87
144
  decide,
88
- reportOutcome
145
+ reportOutcome,
146
+ flushOutcomes,
147
+ pendingOutcomeCount: () => outcomeQueue.length,
148
+ dispose: async () => {
149
+ clearInterval(timer);
150
+ await flushOutcomes();
151
+ disposed = true;
152
+ persistOutcomes();
153
+ }
89
154
  };
90
155
  }
156
+ function readOutcomeQueue(storage, key, maxQueue) {
157
+ if (!storage) return [];
158
+ try {
159
+ const raw = storage.getString(key);
160
+ if (!raw) return [];
161
+ const parsed = JSON.parse(raw);
162
+ if (!Array.isArray(parsed)) return [];
163
+ return parsed.filter(item => Boolean(item && typeof item === 'object' && typeof item.decisionId === 'string' && typeof item.outcome === 'string' && typeof item.revision === 'string' && typeof item.attempts === 'number')).slice(-maxQueue);
164
+ } catch {
165
+ return [];
166
+ }
167
+ }
91
168
  function parseDecision(raw) {
92
169
  if (!raw || typeof raw !== 'object') throw new Error('Malformed Pulse decision');
93
170
  const value = raw;