pulse-updates 1.1.0 → 1.2.0

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 (64) hide show
  1. package/README.md +50 -10
  2. package/SECURITY.md +42 -0
  3. package/android/src/main/java/app/pulse/updates/PulseController.kt +6 -2
  4. package/android/src/main/java/app/pulse/updates/PulseUpdatesModule.kt +25 -0
  5. package/app.plugin.js +47 -0
  6. package/ios/PulseUpdates/PulseController.swift +7 -2
  7. package/ios/PulseUpdates/PulseUpdates.m +7 -0
  8. package/ios/PulseUpdates/PulseUpdates.swift +22 -0
  9. package/lib/commonjs/NativePulseUpdates.js.map +1 -1
  10. package/lib/commonjs/PulseUpdates.js +36 -0
  11. package/lib/commonjs/PulseUpdates.js.map +1 -1
  12. package/lib/commonjs/config.js +175 -21
  13. package/lib/commonjs/config.js.map +1 -1
  14. package/lib/commonjs/decisions.js +128 -0
  15. package/lib/commonjs/decisions.js.map +1 -0
  16. package/lib/commonjs/index.js +12 -0
  17. package/lib/commonjs/index.js.map +1 -1
  18. package/lib/commonjs/init.js +164 -12
  19. package/lib/commonjs/init.js.map +1 -1
  20. package/lib/commonjs/track.js +154 -12
  21. package/lib/commonjs/track.js.map +1 -1
  22. package/lib/commonjs/usePulseUpdates.js +21 -16
  23. package/lib/commonjs/usePulseUpdates.js.map +1 -1
  24. package/lib/module/NativePulseUpdates.js.map +1 -1
  25. package/lib/module/PulseUpdates.js +33 -0
  26. package/lib/module/PulseUpdates.js.map +1 -1
  27. package/lib/module/config.js +174 -21
  28. package/lib/module/config.js.map +1 -1
  29. package/lib/module/decisions.js +122 -0
  30. package/lib/module/decisions.js.map +1 -0
  31. package/lib/module/index.js +1 -0
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/init.js +165 -14
  34. package/lib/module/init.js.map +1 -1
  35. package/lib/module/track.js +152 -12
  36. package/lib/module/track.js.map +1 -1
  37. package/lib/module/usePulseUpdates.js +21 -16
  38. package/lib/module/usePulseUpdates.js.map +1 -1
  39. package/lib/typescript/NativePulseUpdates.d.ts +1 -0
  40. package/lib/typescript/NativePulseUpdates.d.ts.map +1 -1
  41. package/lib/typescript/PulseUpdates.d.ts +20 -0
  42. package/lib/typescript/PulseUpdates.d.ts.map +1 -1
  43. package/lib/typescript/config.d.ts +22 -0
  44. package/lib/typescript/config.d.ts.map +1 -1
  45. package/lib/typescript/decisions.d.ts +55 -0
  46. package/lib/typescript/decisions.d.ts.map +1 -0
  47. package/lib/typescript/index.d.ts +1 -0
  48. package/lib/typescript/index.d.ts.map +1 -1
  49. package/lib/typescript/init.d.ts +51 -4
  50. package/lib/typescript/init.d.ts.map +1 -1
  51. package/lib/typescript/track.d.ts +29 -1
  52. package/lib/typescript/track.d.ts.map +1 -1
  53. package/lib/typescript/usePulseUpdates.d.ts.map +1 -1
  54. package/logo.png +0 -0
  55. package/package.json +14 -3
  56. package/scripts/publish.mjs +68 -3
  57. package/src/NativePulseUpdates.ts +1 -0
  58. package/src/PulseUpdates.ts +54 -0
  59. package/src/config.ts +234 -21
  60. package/src/decisions.ts +179 -0
  61. package/src/index.ts +1 -0
  62. package/src/init.ts +240 -11
  63. package/src/track.ts +191 -13
  64. package/src/usePulseUpdates.ts +21 -16
@@ -23,10 +23,16 @@
23
23
  const DEFAULT_FLUSH_MS = 10_000;
24
24
  const DEFAULT_MAX_BATCH = 100;
25
25
  const DEFAULT_MAX_QUEUE = 500;
26
+ const DEFAULT_TIMEOUT_MS = 10_000;
27
+ const DEFAULT_MAX_ATTEMPTS = 10;
28
+ const DEFAULT_STORAGE_KEY = 'pulse.events.v1';
26
29
  let options = null;
27
30
  let queue = [];
28
31
  let timer = null;
29
32
  let sending = false;
33
+ let nextAttemptAt = 0;
34
+ let lifecycleSubscription = null;
35
+ let trackingGeneration = 0;
30
36
 
31
37
  /** Turns a config url into the track url; leaves an explicit track url alone. */
32
38
  function trackUrl(url) {
@@ -34,8 +40,14 @@ function trackUrl(url) {
34
40
  return trimmed.includes('/pulse/config/') ? trimmed.replace('/pulse/config/', '/pulse/track/') : trimmed;
35
41
  }
36
42
  export function configureTracking(opts) {
43
+ disposeTracking();
37
44
  options = opts;
45
+ queue = readQueue(opts);
46
+ nextAttemptAt = 0;
38
47
  startTimer();
48
+ lifecycleSubscription = opts.appState?.addEventListener('change', state => {
49
+ if (state !== 'active') void flushEvents();
50
+ }) ?? null;
39
51
  }
40
52
 
41
53
  /**
@@ -45,18 +57,32 @@ export function configureTracking(opts) {
45
57
  */
46
58
  export function track(event, props, time) {
47
59
  if (!options || !event) return;
60
+ if (options.hasConsent?.() === false) {
61
+ options.onDropped?.(1, 'no-consent');
62
+ return;
63
+ }
48
64
  const flat = {};
65
+ const allow = options.propertyAllowlist ? new Set(options.propertyAllowlist) : null;
66
+ const redact = new Set(options.redactProperties ?? []);
49
67
  for (const [key, value] of Object.entries(props ?? {})) {
50
68
  if (value === null || value === undefined) continue;
51
- flat[key] = typeof value === 'string' ? value : String(value);
69
+ if (allow && !allow.has(key)) continue;
70
+ flat[key] = redact.has(key) ? '[REDACTED]' : typeof value === 'string' ? value : String(value);
52
71
  }
53
72
  queue.push({
73
+ id: randomEventId(),
54
74
  event,
55
75
  time: (time ?? new Date()).toISOString(),
56
- props: flat
76
+ props: flat,
77
+ attempts: 0
57
78
  });
58
79
  const maxQueue = options.maxQueue ?? DEFAULT_MAX_QUEUE;
59
- if (queue.length > maxQueue) queue = queue.slice(queue.length - maxQueue);
80
+ if (queue.length > maxQueue) {
81
+ const dropped = queue.length - maxQueue;
82
+ queue = queue.slice(dropped);
83
+ options.onDropped?.(dropped, 'queue-full');
84
+ }
85
+ persistQueue();
60
86
  if (queue.length >= (options.maxBatch ?? DEFAULT_MAX_BATCH)) void flushEvents();
61
87
  }
62
88
 
@@ -68,8 +94,9 @@ export function track(event, props, time) {
68
94
  * after launch, when the first events of a session are the ones a funnel needs most.
69
95
  */
70
96
  export async function flushEvents() {
71
- if (!options || sending || queue.length === 0) return 0;
97
+ if (!options || sending || queue.length === 0 || Date.now() < nextAttemptAt) return 0;
72
98
  const opts = options;
99
+ const requestGeneration = trackingGeneration;
73
100
  const ctx = opts.getContext?.() ?? {};
74
101
 
75
102
  // Without a device id the server cannot put the event in an arm, and an empty id
@@ -78,7 +105,10 @@ export async function flushEvents() {
78
105
  if (!ctx.deviceId) return 0;
79
106
  const batch = queue.slice(0, opts.maxBatch ?? DEFAULT_MAX_BATCH);
80
107
  queue = queue.slice(batch.length);
108
+ persistQueue();
81
109
  sending = true;
110
+ const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;
111
+ const timeout = controller ? setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS) : null;
82
112
  try {
83
113
  const response = await fetch(trackUrl(opts.url), {
84
114
  method: 'POST',
@@ -91,27 +121,37 @@ export async function flushEvents() {
91
121
  platform: ctx.platform,
92
122
  appVersion: ctx.appVersion,
93
123
  events: batch.map(e => ({
124
+ id: e.id,
94
125
  event: e.event,
95
126
  time: e.time,
96
127
  props: e.props
97
128
  }))
98
- })
129
+ }),
130
+ signal: controller?.signal
99
131
  });
100
132
  if (!response.ok) {
101
133
  // Rate limited or briefly down: keep the events, try on the next tick.
102
- queue = [...batch, ...queue];
134
+ if (requestGeneration === trackingGeneration && options === opts) {
135
+ requeueWithBackoff(batch, response.status);
136
+ } else {
137
+ restoreStaleBatch(opts, batch, response.status);
138
+ }
103
139
  if (response.status !== 429) opts.onError?.(new Error(`Pulse track failed: ${response.status}`));
104
140
  return 0;
105
141
  }
106
142
  const body = await response.json();
143
+ if (requestGeneration !== trackingGeneration || options !== opts) return body.accepted ?? 0;
107
144
  if (body.ignored && body.ignored.length > 0) opts.onIgnored?.(body.ignored);
145
+ nextAttemptAt = 0;
146
+ persistQueue();
108
147
  return body.accepted ?? 0;
109
148
  } catch (error) {
110
- queue = [...batch, ...queue];
149
+ if (requestGeneration === trackingGeneration && options === opts) requeueWithBackoff(batch);else restoreStaleBatch(opts, batch);
111
150
  opts.onError?.(error);
112
151
  return 0;
113
152
  } finally {
114
- sending = false;
153
+ if (timeout) clearTimeout(timeout);
154
+ if (requestGeneration === trackingGeneration) sending = false;
115
155
  }
116
156
  }
117
157
 
@@ -119,14 +159,31 @@ export async function flushEvents() {
119
159
  export function pendingEventCount() {
120
160
  return queue.length;
121
161
  }
162
+ export function getTrackingInfo() {
163
+ return {
164
+ queueDepth: queue.length,
165
+ sending,
166
+ nextAttemptAt
167
+ };
168
+ }
169
+
170
+ /** Stop timers and listeners while preserving the durable outbox. */
171
+ export function disposeTracking() {
172
+ trackingGeneration += 1;
173
+ if (timer) clearInterval(timer);
174
+ timer = null;
175
+ lifecycleSubscription?.remove();
176
+ lifecycleSubscription = null;
177
+ persistQueue();
178
+ options = null;
179
+ sending = false;
180
+ }
122
181
  export function stopTracking() {
123
- if (timer) {
124
- clearInterval(timer);
125
- timer = null;
126
- }
182
+ disposeTracking();
127
183
  options = null;
128
184
  queue = [];
129
185
  sending = false;
186
+ nextAttemptAt = 0;
130
187
  }
131
188
  function startTimer() {
132
189
  if (timer) clearInterval(timer);
@@ -136,4 +193,87 @@ function startTimer() {
136
193
  // and a CLI importing this should still be able to exit.
137
194
  timer.unref?.();
138
195
  }
196
+ function requeueWithBackoff(batch, status) {
197
+ if (!options) return;
198
+ const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
199
+ const retryable = [];
200
+ let dropped = 0;
201
+ for (const event of batch) {
202
+ const next = {
203
+ ...event,
204
+ attempts: event.attempts + 1
205
+ };
206
+ if (next.attempts >= maxAttempts && status !== 429) dropped++;else retryable.push(next);
207
+ }
208
+ queue = [...retryable, ...queue];
209
+ if (dropped > 0) options.onDropped?.(dropped, 'max-attempts');
210
+ const attempts = retryable.reduce((max, event) => Math.max(max, event.attempts), 1);
211
+ const base = Math.min(60_000, 1_000 * 2 ** Math.min(attempts - 1, 6));
212
+ nextAttemptAt = Date.now() + base + Math.floor(Math.random() * Math.max(1, base / 4));
213
+ persistQueue();
214
+ }
215
+
216
+ /**
217
+ * An old request may fail after another app has been configured. Its rows belong in
218
+ * the old app's outbox, never in the new app's in-memory queue. When the same app was
219
+ * merely reconfigured, merge them back into the live queue so it need not restart to
220
+ * see them; otherwise persist directly under the captured app-scoped key.
221
+ */
222
+ function restoreStaleBatch(opts, batch, status) {
223
+ const maxAttempts = opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
224
+ const retryable = [];
225
+ let dropped = 0;
226
+ for (const event of batch) {
227
+ const next = {
228
+ ...event,
229
+ attempts: event.attempts + 1
230
+ };
231
+ if (next.attempts >= maxAttempts && status !== 429) dropped++;else retryable.push(next);
232
+ }
233
+ if (dropped > 0) opts.onDropped?.(dropped, 'max-attempts');
234
+ if (retryable.length === 0) return;
235
+ const currentOptions = options;
236
+ const sameOutbox = currentOptions?.storage === opts.storage && currentOptions !== null && storageKey(currentOptions) === storageKey(opts);
237
+ if (sameOutbox) {
238
+ queue = [...retryable, ...queue].slice(-(options?.maxQueue ?? DEFAULT_MAX_QUEUE));
239
+ persistQueue();
240
+ return;
241
+ }
242
+ if (!opts.storage) return;
243
+ try {
244
+ const stored = readQueue(opts);
245
+ const restored = [...retryable, ...stored].slice(-(opts.maxQueue ?? DEFAULT_MAX_QUEUE));
246
+ opts.storage.set(storageKey(opts), JSON.stringify(restored));
247
+ } catch {
248
+ // Best effort only; a telemetry recovery must not affect the new app session.
249
+ }
250
+ }
251
+ function storageKey(opts) {
252
+ return opts.storageKey?.trim() || DEFAULT_STORAGE_KEY;
253
+ }
254
+ function readQueue(opts) {
255
+ if (!opts.storage) return [];
256
+ try {
257
+ const raw = opts.storage.getString(storageKey(opts));
258
+ if (!raw) return [];
259
+ const parsed = JSON.parse(raw);
260
+ if (!Array.isArray(parsed)) return [];
261
+ return parsed.filter(item => Boolean(item && typeof item === 'object' && typeof item.id === 'string' && typeof item.event === 'string' && typeof item.time === 'string' && typeof item.props === 'object' && typeof item.attempts === 'number')).slice(-(opts.maxQueue ?? DEFAULT_MAX_QUEUE));
262
+ } catch {
263
+ return [];
264
+ }
265
+ }
266
+ function persistQueue() {
267
+ if (!options?.storage) return;
268
+ try {
269
+ options.storage.set(storageKey(options), JSON.stringify(queue));
270
+ } catch {
271
+ // Telemetry persistence must never become an app failure.
272
+ }
273
+ }
274
+ function randomEventId() {
275
+ const cryptoLike = globalThis.crypto;
276
+ if (typeof cryptoLike?.randomUUID === 'function') return cryptoLike.randomUUID();
277
+ return `evt-${Date.now()}-${Math.random().toString(36).slice(2, 14)}`;
278
+ }
139
279
  //# sourceMappingURL=track.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_FLUSH_MS","DEFAULT_MAX_BATCH","DEFAULT_MAX_QUEUE","options","queue","timer","sending","trackUrl","url","trimmed","replace","includes","configureTracking","opts","startTimer","track","event","props","time","flat","key","value","Object","entries","undefined","String","push","Date","toISOString","maxQueue","length","slice","maxBatch","flushEvents","ctx","getContext","deviceId","batch","response","fetch","method","headers","body","JSON","stringify","userId","platform","appVersion","events","map","e","ok","status","onError","Error","json","ignored","onIgnored","accepted","error","pendingEventCount","stopTracking","clearInterval","every","flushIntervalMs","setInterval","unref"],"sourceRoot":"../../src","sources":["track.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["DEFAULT_FLUSH_MS","DEFAULT_MAX_BATCH","DEFAULT_MAX_QUEUE","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_ATTEMPTS","DEFAULT_STORAGE_KEY","options","queue","timer","sending","nextAttemptAt","lifecycleSubscription","trackingGeneration","trackUrl","url","trimmed","replace","includes","configureTracking","opts","disposeTracking","readQueue","startTimer","appState","addEventListener","state","flushEvents","track","event","props","time","hasConsent","onDropped","flat","allow","propertyAllowlist","Set","redact","redactProperties","key","value","Object","entries","undefined","has","String","push","id","randomEventId","Date","toISOString","attempts","maxQueue","length","dropped","slice","persistQueue","maxBatch","now","requestGeneration","ctx","getContext","deviceId","batch","controller","AbortController","timeout","setTimeout","abort","timeoutMs","response","fetch","method","headers","body","JSON","stringify","userId","platform","appVersion","events","map","e","signal","ok","requeueWithBackoff","status","restoreStaleBatch","onError","Error","json","accepted","ignored","onIgnored","error","clearTimeout","pendingEventCount","getTrackingInfo","queueDepth","clearInterval","remove","stopTracking","every","flushIntervalMs","setInterval","unref","maxAttempts","retryable","next","reduce","max","Math","base","min","floor","random","currentOptions","sameOutbox","storage","storageKey","stored","restored","set","trim","raw","getString","parsed","parse","Array","isArray","filter","item","Boolean","cryptoLike","globalThis","crypto","randomUUID","toString"],"sourceRoot":"../../src","sources":["track.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import { useEffect, useState, useCallback } from 'react';
2
2
  import * as PulseUpdates from './PulseUpdates';
3
3
  export function usePulseUpdates() {
4
+ const [nativeState, setNativeState] = useState(PulseUpdates.getUpdatesState);
4
5
  const [isChecking, setIsChecking] = useState(false);
5
6
  const [isDownloading, setIsDownloading] = useState(false);
6
7
  const [availableUpdate, setAvailableUpdate] = useState(null);
@@ -9,10 +10,14 @@ export function usePulseUpdates() {
9
10
 
10
11
  // Refresh state on mount to get latest values after configure
11
12
  useEffect(() => {
12
- PulseUpdates.refreshStateAsync().catch(() => {});
13
+ const unsubscribe = PulseUpdates.onUpdatesStateChange(() => {
14
+ setNativeState(PulseUpdates.getUpdatesState());
15
+ });
16
+ void PulseUpdates.refreshStateAsync();
17
+ return unsubscribe;
13
18
  }, []);
14
19
  useEffect(() => {
15
- if (!PulseUpdates.isEnabled) return;
20
+ if (!nativeState.isEnabled) return;
16
21
  const subscription = PulseUpdates.addUpdateListener(event => {
17
22
  switch (event.type) {
18
23
  case 'updateAvailable':
@@ -30,9 +35,9 @@ export function usePulseUpdates() {
30
35
  }
31
36
  });
32
37
  return () => subscription.remove();
33
- }, []);
38
+ }, [nativeState.isEnabled]);
34
39
  const checkForUpdate = useCallback(async () => {
35
- if (!PulseUpdates.isEnabled) {
40
+ if (!nativeState.isEnabled) {
36
41
  return {
37
42
  isAvailable: false
38
43
  };
@@ -57,9 +62,9 @@ export function usePulseUpdates() {
57
62
  } finally {
58
63
  setIsChecking(false);
59
64
  }
60
- }, []);
65
+ }, [nativeState.isEnabled]);
61
66
  const downloadUpdate = useCallback(async () => {
62
- if (!PulseUpdates.isEnabled) {
67
+ if (!nativeState.isEnabled) {
63
68
  return {
64
69
  isNew: false
65
70
  };
@@ -81,21 +86,21 @@ export function usePulseUpdates() {
81
86
  } finally {
82
87
  setIsDownloading(false);
83
88
  }
84
- }, []);
89
+ }, [nativeState.isEnabled]);
85
90
  const reload = useCallback(async () => {
86
- if (!PulseUpdates.isEnabled) return;
91
+ if (!nativeState.isEnabled) return;
87
92
  await PulseUpdates.reloadAsync();
88
- }, []);
93
+ }, [nativeState.isEnabled]);
89
94
  return {
90
- isEnabled: PulseUpdates.isEnabled,
95
+ isEnabled: nativeState.isEnabled,
91
96
  isChecking,
92
97
  isDownloading,
93
- updateId: PulseUpdates.updateId,
94
- runtimeVersion: PulseUpdates.runtimeVersion,
95
- channel: PulseUpdates.channel,
96
- manifest: PulseUpdates.manifest,
97
- isEmbeddedLaunch: PulseUpdates.isEmbeddedLaunch,
98
- createdAt: PulseUpdates.createdAt,
98
+ updateId: nativeState.updateId,
99
+ runtimeVersion: nativeState.runtimeVersion,
100
+ channel: nativeState.channel,
101
+ manifest: nativeState.manifest,
102
+ isEmbeddedLaunch: nativeState.isEmbeddedLaunch,
103
+ createdAt: nativeState.createdAt,
99
104
  build: PulseUpdates.getUpdateBuild(),
100
105
  availableUpdate,
101
106
  downloadedUpdate,
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","useCallback","PulseUpdates","usePulseUpdates","isChecking","setIsChecking","isDownloading","setIsDownloading","availableUpdate","setAvailableUpdate","downloadedUpdate","setDownloadedUpdate","error","setError","refreshStateAsync","catch","isEnabled","subscription","addUpdateListener","event","type","manifest","Error","remove","checkForUpdate","isAvailable","result","checkForUpdateAsync","e","err","String","failedReason","message","downloadUpdate","isNew","fetchUpdateAsync","reload","reloadAsync","updateId","runtimeVersion","channel","isEmbeddedLaunch","createdAt","build","getUpdateBuild"],"sourceRoot":"../../src","sources":["usePulseUpdates.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useState","useCallback","PulseUpdates","usePulseUpdates","nativeState","setNativeState","getUpdatesState","isChecking","setIsChecking","isDownloading","setIsDownloading","availableUpdate","setAvailableUpdate","downloadedUpdate","setDownloadedUpdate","error","setError","unsubscribe","onUpdatesStateChange","refreshStateAsync","isEnabled","subscription","addUpdateListener","event","type","manifest","Error","remove","checkForUpdate","isAvailable","result","checkForUpdateAsync","e","err","String","failedReason","message","downloadUpdate","isNew","fetchUpdateAsync","reload","reloadAsync","updateId","runtimeVersion","channel","isEmbeddedLaunch","createdAt","build","getUpdateBuild"],"sourceRoot":"../../src","sources":["usePulseUpdates.ts"],"mappings":"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","ignoreList":[]}
@@ -26,6 +26,7 @@ export interface Spec extends TurboModule {
26
26
  reloadAsync(): Promise<void>;
27
27
  markAppReady(): Promise<void>;
28
28
  reportLaunchFailure(reason: string): Promise<void>;
29
+ verifySignatureAsync(canonicalPayload: string, alg: string, keyId: string, signature: string): Promise<boolean>;
29
30
  addListener(eventName: string): void;
30
31
  removeListeners(count: number): void;
31
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NativePulseUpdates.d.ts","sourceRoot":"","sources":["../../src/NativePulseUpdates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,SAAS,CACP,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,IAAI,CAAC;IAGR,aAAa,IAAI,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,WAAW,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;KACzC,CAAC,CAAC;IAGH,mBAAmB,IAAI,OAAO,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IAEH,gBAAgB,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IAEH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGnD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAA6D"}
1
+ {"version":3,"file":"NativePulseUpdates.d.ts","sourceRoot":"","sources":["../../src/NativePulseUpdates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,SAAS,CACP,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,IAAI,CAAC;IAGR,aAAa,IAAI,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,WAAW,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;KACzC,CAAC,CAAC;IAGH,mBAAmB,IAAI,OAAO,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IAEH,gBAAgB,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IAEH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGhH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAA6D"}
@@ -1,4 +1,18 @@
1
1
  import type { PulseManifest, PulseUpdatesConfig, UpdateCheckResult, UpdateFetchResult } from './types';
2
+ export interface PulseNativeState {
3
+ isEnabled: boolean;
4
+ updateId: string | null;
5
+ runtimeVersion: string | null;
6
+ channel: string | null;
7
+ isEmbeddedLaunch: boolean;
8
+ manifest: PulseManifest | null;
9
+ createdAt: Date | null;
10
+ localAssets: Record<string, string> | null;
11
+ }
12
+ /** A stable read surface for React and for diagnostics. */
13
+ export declare function getUpdatesState(): PulseNativeState;
14
+ /** Subscribe to native-state refreshes without depending on mutable ES exports. */
15
+ export declare function onUpdatesStateChange(listener: () => void): () => void;
2
16
  /**
3
17
  * Configure pulse-updates with the given options.
4
18
  *
@@ -59,6 +73,12 @@ export declare function markAppReady(): Promise<void>;
59
73
  * Report a launch failure to trigger rollback on next start.
60
74
  */
61
75
  export declare function reportLaunchFailure(reason: string): Promise<void>;
76
+ /** Verify config/decision payloads with the public key already pinned in native config. */
77
+ export declare function verifyConfigSignatureAsync(canonicalPayload: string, signature: {
78
+ alg: string;
79
+ keyId: string;
80
+ sig: string;
81
+ }): Promise<boolean>;
62
82
  /**
63
83
  * Get the build number from the current update's metadata.
64
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PulseUpdates.d.ts","sourceRoot":"","sources":["../../src/PulseUpdates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAiBvG;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAyB1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAGD,eAAO,IAAI,SAAS,SAAQ,CAAC;AAC7B,eAAO,IAAI,QAAQ,EAAE,MAAM,GAAG,IAAW,CAAC;AAC1C,eAAO,IAAI,cAAc,EAAE,MAAM,GAAG,IAAW,CAAC;AAChD,eAAO,IAAI,OAAO,EAAE,MAAM,GAAG,IAAW,CAAC;AACzC,eAAO,IAAI,gBAAgB,SAAO,CAAC;AAEnC,eAAO,IAAI,qBAAqB,SAAO,CAAC;AACxC,eAAO,IAAI,QAAQ,EAAE,aAAa,GAAG,IAAW,CAAC;AACjD,eAAO,IAAI,SAAS,EAAE,IAAI,GAAG,IAAW,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,IAAI,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAW,CAAC;AAE7D;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6CvD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAyBtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAqBnE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAUlD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvD;AAYD,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,kBAAkB,GAClB,aAAa,GACb,mBAAmB,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GACrC;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAMxB"}
1
+ {"version":3,"file":"PulseUpdates.d.ts","sourceRoot":"","sources":["../../src/PulseUpdates.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,14 @@ export interface ConfigExperiment {
32
32
  key: string;
33
33
  variant: string;
34
34
  }
35
+ export interface ConfigSignature {
36
+ alg: string;
37
+ keyId: string;
38
+ sig: string;
39
+ /** Exact canonical response bytes covered by the signature, when supplied by PulseServer. */
40
+ canonical?: string;
41
+ }
42
+ export type ConfigSignatureStatus = 'not-configured' | 'verified' | 'cached-verified' | 'unsigned' | 'invalid';
35
43
  export interface ConfigStorage {
36
44
  getString(key: string): string | null | undefined;
37
45
  set(key: string, value: string): void;
@@ -66,6 +74,8 @@ export interface ConfigOptions {
66
74
  defaults?: Record<string, ConfigValue>;
67
75
  /** Persistence for the last good payload. Without it the cache is memory-only. */
68
76
  storage?: ConfigStorage;
77
+ /** App-scoped key for multi-app/white-label hosts. */
78
+ storageKey?: string;
69
79
  /** Read fresh on every request: the country or plan can change between launches. */
70
80
  getContext?: () => ConfigContext;
71
81
  /** Foreground poll interval. 0 disables polling (launch + resume still fetch). */
@@ -96,6 +106,14 @@ export interface ConfigOptions {
96
106
  reportExposure?: boolean;
97
107
  /** Network timeout per request. */
98
108
  timeoutMs?: number;
109
+ /** Ed25519 public key, as raw 32-byte base64. Enables built-in verification. */
110
+ signingPublicKey?: string;
111
+ /** Optional key-id pin. A response signed by another key is rejected. */
112
+ signingKeyId?: string;
113
+ /** Reject unsigned/unverifiable payloads and keep the last good snapshot. */
114
+ requireSignature?: boolean;
115
+ /** Custom verifier for hosts that keep keys in a secure native module. */
116
+ verifySignature?: (canonicalPayload: string, signature: ConfigSignature) => boolean | Promise<boolean>;
99
117
  onError?: (error: unknown) => void;
100
118
  }
101
119
  /**
@@ -130,6 +148,8 @@ export declare function startConfigAutoRefresh(appState?: {
130
148
  remove: () => void;
131
149
  };
132
150
  }): () => void;
151
+ /** Same recursive ordinal-key JSON form used by PulseServer's ManifestSigner. */
152
+ export declare function canonicalizeConfigJson(value: unknown): string;
133
153
  /** The served value, or the registered default. Never a type's zero value. */
134
154
  export declare function getConfigValue(key: string): ConfigValue;
135
155
  export declare function getConfigBoolean(key: string): boolean;
@@ -161,6 +181,8 @@ export declare function getConfigInfo(): {
161
181
  verifiedAt: number;
162
182
  etag: string | null;
163
183
  keyCount: number;
184
+ signatureStatus: ConfigSignatureStatus;
185
+ signatureKeyId: string | null;
164
186
  };
165
187
  /** Test seam: drops every piece of module state. */
166
188
  export declare function resetConfigForTests(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type DecisionChannel = 'in_app' | 'encore' | 'replio' | 'email' | 'push' | 'sms' | 'whatsapp' | 'webhook';
2
+ export type DecisionOutcome = 'pending' | 'delivered' | 'dismissed' | 'accepted' | 'converted' | 'failed';
3
+ export interface DecisionContext {
4
+ userId?: string;
5
+ deviceId?: string;
6
+ platform?: string;
7
+ appVersion?: string;
8
+ country?: string;
9
+ language?: string;
10
+ osVersion?: string;
11
+ attributes?: Record<string, string>;
12
+ }
13
+ export interface DecisionAction {
14
+ kind: string;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface PulseDecision {
18
+ decisionId: string;
19
+ replayed: boolean;
20
+ execute: boolean;
21
+ mode: 'shadow' | 'live' | string;
22
+ verdict: string;
23
+ reasonCode: string;
24
+ policyKey?: string | null;
25
+ policyVersion?: number | null;
26
+ action?: DecisionAction | null;
27
+ }
28
+ export interface DecisionHandlerResult {
29
+ outcome?: DecisionOutcome;
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export type DecisionHandler = (action: DecisionAction, decision: PulseDecision) => void | DecisionHandlerResult | Promise<void | DecisionHandlerResult>;
33
+ export interface PulseDecisionClientOptions {
34
+ apiUrl: string;
35
+ appSlug: string;
36
+ getContext: () => DecisionContext | Promise<DecisionContext>;
37
+ fetch?: typeof globalThis.fetch;
38
+ timeoutMs?: number;
39
+ /** Safe default. User-facing execution needs an explicit per-app opt-in. */
40
+ executionMode?: 'shadow-only' | 'allow-live';
41
+ handlers?: Record<string, DecisionHandler>;
42
+ onError?: (error: unknown) => void;
43
+ }
44
+ export interface DecideOptions {
45
+ channel?: DecisionChannel;
46
+ idempotencyKey?: string;
47
+ attributes?: Record<string, string>;
48
+ }
49
+ export interface PulseDecisionClient {
50
+ decide(trigger: string, options?: DecideOptions): Promise<PulseDecision | null>;
51
+ reportOutcome(decisionId: string, outcome: DecisionOutcome, metadata?: Record<string, unknown>): Promise<boolean>;
52
+ }
53
+ /** Generic decision protocol. Product-specific action handlers remain in each app. */
54
+ export declare function createPulseDecisionClient(options: PulseDecisionClientOptions): PulseDecisionClient;
55
+ //# sourceMappingURL=decisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/decisions.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,5 @@ export { initializeAssetResolver, updateLocalAssets } from './assetResolver';
5
5
  export * from './config';
6
6
  export * from './track';
7
7
  export * from './init';
8
+ export * from './decisions';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}