pulse-updates 1.2.3 → 1.2.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.
- package/lib/commonjs/config.js +177 -12
- package/lib/commonjs/config.js.map +1 -1
- package/lib/commonjs/decisions.js +90 -8
- package/lib/commonjs/decisions.js.map +1 -1
- package/lib/commonjs/init.js +4 -1
- package/lib/commonjs/init.js.map +1 -1
- package/lib/module/config.js +174 -12
- package/lib/module/config.js.map +1 -1
- package/lib/module/decisions.js +90 -8
- package/lib/module/decisions.js.map +1 -1
- package/lib/module/init.js +5 -2
- package/lib/module/init.js.map +1 -1
- package/lib/typescript/config.d.ts +10 -0
- package/lib/typescript/config.d.ts.map +1 -1
- package/lib/typescript/decisions.d.ts +18 -0
- package/lib/typescript/decisions.d.ts.map +1 -1
- package/lib/typescript/init.d.ts +4 -1
- package/lib/typescript/init.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +205 -11
- package/src/decisions.ts +140 -10
- package/src/init.ts +16 -1
package/lib/module/init.js
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* installs — a targeting bug that looks like a rollout that "did not work".
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import { configureConfig, fetchConfig, startConfigAutoRefresh, getConfigInfo, getConfigBoolean, getConfigNumber, getConfigString, getConfigJson } from './config';
|
|
26
|
+
import { configureConfig, fetchConfig, startConfigAutoRefresh, getConfigInfo, getConfigBoolean, getConfigNumber, getConfigString, getConfigJson, getExposureDeliveryInfo } from './config';
|
|
27
27
|
import { configureTracking, disposeTracking, flushEvents, getTrackingInfo, track } from './track';
|
|
28
28
|
const DEVICE_ID_KEY = 'pulse.device-id';
|
|
29
29
|
let activeClient = null;
|
|
@@ -67,6 +67,8 @@ export function initPulse(opts) {
|
|
|
67
67
|
defaults: opts.defaults,
|
|
68
68
|
storage: opts.storage,
|
|
69
69
|
storageKey: `pulse.${slug}.config.v1`,
|
|
70
|
+
exposureStorageKey: `pulse.${slug}.exposures.v1`,
|
|
71
|
+
reportExposure: opts.reportExposure ?? true,
|
|
70
72
|
getContext,
|
|
71
73
|
pollIntervalMs: opts.pollIntervalMs,
|
|
72
74
|
onError: opts.onError,
|
|
@@ -137,6 +139,7 @@ export function initPulse(opts) {
|
|
|
137
139
|
deviceId,
|
|
138
140
|
config: getConfigInfo(),
|
|
139
141
|
events: getTrackingInfo(),
|
|
142
|
+
exposures: getExposureDeliveryInfo(),
|
|
140
143
|
analyticsConsent: hasConsent()
|
|
141
144
|
}),
|
|
142
145
|
config: {
|
|
@@ -169,7 +172,7 @@ export function initPulse(opts) {
|
|
|
169
172
|
*/
|
|
170
173
|
export async function initPulseAsync(opts) {
|
|
171
174
|
const slug = opts.appSlug.trim();
|
|
172
|
-
const keys = [`pulse.${slug}.device-id`, `pulse.${slug}.config.v1`, `pulse.${slug}.events.v1`, DEVICE_ID_KEY];
|
|
175
|
+
const keys = [`pulse.${slug}.device-id`, `pulse.${slug}.config.v1`, `pulse.${slug}.events.v1`, `pulse.${slug}.exposures.v1`, DEVICE_ID_KEY];
|
|
173
176
|
const loaded = await Promise.all(keys.map(async key => [key, await opts.storage.getItem(key)]));
|
|
174
177
|
const memory = new Map(loaded.filter(entry => entry[1] !== null));
|
|
175
178
|
const storage = {
|
package/lib/module/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["configureConfig","fetchConfig","startConfigAutoRefresh","getConfigInfo","getConfigBoolean","getConfigNumber","getConfigString","getConfigJson","configureTracking","disposeTracking","flushEvents","getTrackingInfo","track","DEVICE_ID_KEY","activeClient","stopActiveRefresh","initPulse","opts","base","apiUrl","replace","slug","appSlug","trim","configUrl","trackUrl","deviceStorageKey","deviceId","resolveDeviceId","storage","platform","detectPlatform","osVersion","detectOsVersion","appVersion","detectAppVersion","language","detectLanguage","userId","userAttributes","consentOverride","analyticsConsent","undefined","hasConsent","getContext","getUserId","getUserAttributes","url","defaults","storageKey","pollIntervalMs","onError","signingPublicKey","signingKeyId","requireSignature","requireConfigSignature","verifySignature","verifyConfigSignature","verifyWithNativeKey","flushIntervalMs","propertyAllowlist","eventPropertyAllowlist","redactProperties","redactEventProperties","appState","onIgnored","onIgnoredEvents","Error","stopRefresh","client","flush","setUser","nextUserId","attributes","sanitizeAttributes","clearUser","setAnalyticsConsent","granted","resetInstallId","randomId","set","health","config","events","boolean","number","string","json","refresh","dispose","initPulseAsync","keys","loaded","Promise","all","map","key","getItem","memory","Map","filter","entry","getString","get","value","setItem","existing","minted","clean","Object","fromEntries","entries","slice","length","bytes","Uint8Array","crypto","globalThis","getRandomValues","i","Math","floor","random","hex","Array","from","b","toString","padStart","join","rn","require","Platform","OS","version","Version","String","default","getVersion","canonicalPayload","signature","updates","verifyConfigSignatureAsync","localize","getLocales","languageTag","Intl","DateTimeFormat","resolvedOptions","locale"],"sourceRoot":"../../src","sources":["init.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["configureConfig","fetchConfig","startConfigAutoRefresh","getConfigInfo","getConfigBoolean","getConfigNumber","getConfigString","getConfigJson","getExposureDeliveryInfo","configureTracking","disposeTracking","flushEvents","getTrackingInfo","track","DEVICE_ID_KEY","activeClient","stopActiveRefresh","initPulse","opts","base","apiUrl","replace","slug","appSlug","trim","configUrl","trackUrl","deviceStorageKey","deviceId","resolveDeviceId","storage","platform","detectPlatform","osVersion","detectOsVersion","appVersion","detectAppVersion","language","detectLanguage","userId","userAttributes","consentOverride","analyticsConsent","undefined","hasConsent","getContext","getUserId","getUserAttributes","url","defaults","storageKey","exposureStorageKey","reportExposure","pollIntervalMs","onError","signingPublicKey","signingKeyId","requireSignature","requireConfigSignature","verifySignature","verifyConfigSignature","verifyWithNativeKey","flushIntervalMs","propertyAllowlist","eventPropertyAllowlist","redactProperties","redactEventProperties","appState","onIgnored","onIgnoredEvents","Error","stopRefresh","client","flush","setUser","nextUserId","attributes","sanitizeAttributes","clearUser","setAnalyticsConsent","granted","resetInstallId","randomId","set","health","config","events","exposures","boolean","number","string","json","refresh","dispose","initPulseAsync","keys","loaded","Promise","all","map","key","getItem","memory","Map","filter","entry","getString","get","value","setItem","existing","minted","clean","Object","fromEntries","entries","slice","length","bytes","Uint8Array","crypto","globalThis","getRandomValues","i","Math","floor","random","hex","Array","from","b","toString","padStart","join","rn","require","Platform","OS","version","Version","String","default","getVersion","canonicalPayload","signature","updates","verifyConfigSignatureAsync","localize","getLocales","languageTag","Intl","DateTimeFormat","resolvedOptions","locale"],"sourceRoot":"../../src","sources":["init.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -104,6 +104,8 @@ export interface ConfigOptions {
|
|
|
104
104
|
* the mistake that announces itself.
|
|
105
105
|
*/
|
|
106
106
|
reportExposure?: boolean;
|
|
107
|
+
/** Durable exposure outbox key. initPulse supplies an app-scoped value. */
|
|
108
|
+
exposureStorageKey?: string;
|
|
107
109
|
/** Network timeout per request. */
|
|
108
110
|
timeoutMs?: number;
|
|
109
111
|
/** Ed25519 public key, as raw 32-byte base64. Enables built-in verification. */
|
|
@@ -148,6 +150,14 @@ export declare function startConfigAutoRefresh(appState?: {
|
|
|
148
150
|
remove: () => void;
|
|
149
151
|
};
|
|
150
152
|
}): () => void;
|
|
153
|
+
/** Flushes the durable exposure outbox. Safe to call on launch, resume or manually. */
|
|
154
|
+
export declare function flushExposures(): Promise<number>;
|
|
155
|
+
export declare function pendingExposureCount(): number;
|
|
156
|
+
export declare function getExposureDeliveryInfo(): {
|
|
157
|
+
queueDepth: number;
|
|
158
|
+
sending: boolean;
|
|
159
|
+
nextAttemptAt: number;
|
|
160
|
+
};
|
|
151
161
|
/** Same recursive ordinal-key JSON form used by PulseServer's ManifestSigner. */
|
|
152
162
|
export declare function canonicalizeConfigJson(value: unknown): string;
|
|
153
163
|
/** The served value, or the registered default. Never a type's zero value. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/G,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,kFAAkF;IAClF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,aAAa,CAAC;IACjC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,14 @@ export interface PulseDecisionClientOptions {
|
|
|
39
39
|
/** Safe default. User-facing execution needs an explicit per-app opt-in. */
|
|
40
40
|
executionMode?: 'shadow-only' | 'allow-live';
|
|
41
41
|
handlers?: Record<string, DecisionHandler>;
|
|
42
|
+
/** Persists terminal outcomes across process death and offline periods. */
|
|
43
|
+
storage?: ConfigStorage;
|
|
44
|
+
/** App-scoped outcome outbox key. Defaults to one derived from appSlug. */
|
|
45
|
+
storageKey?: string;
|
|
46
|
+
/** Retry tick for pending outcomes. Default 10s. */
|
|
47
|
+
flushIntervalMs?: number;
|
|
48
|
+
/** Bound on decisions awaiting delivery. Default 100. */
|
|
49
|
+
maxQueue?: number;
|
|
42
50
|
onError?: (error: unknown) => void;
|
|
43
51
|
}
|
|
44
52
|
export interface DecideOptions {
|
|
@@ -49,7 +57,17 @@ export interface DecideOptions {
|
|
|
49
57
|
export interface PulseDecisionClient {
|
|
50
58
|
decide(trigger: string, options?: DecideOptions): Promise<PulseDecision | null>;
|
|
51
59
|
reportOutcome(decisionId: string, outcome: DecisionOutcome, metadata?: Record<string, unknown>): Promise<boolean>;
|
|
60
|
+
flushOutcomes(): Promise<number>;
|
|
61
|
+
pendingOutcomeCount(): number;
|
|
62
|
+
outcomeDeliveryInfo(): OutcomeDeliveryInfo;
|
|
63
|
+
dispose(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
export interface OutcomeDeliveryInfo {
|
|
66
|
+
queueDepth: number;
|
|
67
|
+
sending: boolean;
|
|
68
|
+
nextAttemptAt: number;
|
|
52
69
|
}
|
|
53
70
|
/** Generic decision protocol. Product-specific action handlers remain in each app. */
|
|
54
71
|
export declare function createPulseDecisionClient(options: PulseDecisionClientOptions): PulseDecisionClient;
|
|
72
|
+
import type { ConfigStorage } from './config';
|
|
55
73
|
//# sourceMappingURL=decisions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/decisions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AACjH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1G,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAExE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,aAAa,KACpB,IAAI,GAAG,qBAAqB,GAAG,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC;AAE1E,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAChF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/decisions.ts"],"names":[],"mappings":"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"}
|
package/lib/typescript/init.d.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* reliably on both platforms, and a version guessed wrong aims a rollout at the wrong
|
|
23
23
|
* installs — a targeting bug that looks like a rollout that "did not work".
|
|
24
24
|
*/
|
|
25
|
-
import { fetchConfig, type ConfigStorage, type ConfigValue, type ConfigSignature, getConfigInfo, getConfigBoolean, getConfigNumber, getConfigString, getConfigJson } from './config';
|
|
25
|
+
import { fetchConfig, type ConfigStorage, type ConfigValue, type ConfigSignature, getConfigInfo, getConfigBoolean, getConfigNumber, getConfigString, getConfigJson, getExposureDeliveryInfo } from './config';
|
|
26
26
|
import { getTrackingInfo, type TrackedEventInput } from './track';
|
|
27
27
|
export interface InitPulseOptions {
|
|
28
28
|
/** Where Pulse lives, e.g. https://pulse.example.com — no path. */
|
|
@@ -65,6 +65,8 @@ export interface InitPulseOptions {
|
|
|
65
65
|
verifyConfigSignature?: (canonicalPayload: string, signature: ConfigSignature) => boolean | Promise<boolean>;
|
|
66
66
|
/** Foreground poll interval for the config. 0 disables it; launch and resume still fetch. */
|
|
67
67
|
pollIntervalMs?: number;
|
|
68
|
+
/** Report experiment assignments through the durable outbox. Defaults to true. */
|
|
69
|
+
reportExposure?: boolean;
|
|
68
70
|
/** How often queued events are sent. Default 10s. */
|
|
69
71
|
flushIntervalMs?: number;
|
|
70
72
|
/** App-state hook, so the config refreshes on return from background. */
|
|
@@ -82,6 +84,7 @@ export interface PulseHealth {
|
|
|
82
84
|
deviceId: string;
|
|
83
85
|
config: ReturnType<typeof getConfigInfo>;
|
|
84
86
|
events: ReturnType<typeof getTrackingInfo>;
|
|
87
|
+
exposures: ReturnType<typeof getExposureDeliveryInfo>;
|
|
85
88
|
analyticsConsent: boolean;
|
|
86
89
|
}
|
|
87
90
|
export interface PulseClient {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAEL,WAAW,EAGX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -113,6 +113,8 @@ export interface ConfigOptions {
|
|
|
113
113
|
* the mistake that announces itself.
|
|
114
114
|
*/
|
|
115
115
|
reportExposure?: boolean;
|
|
116
|
+
/** Durable exposure outbox key. initPulse supplies an app-scoped value. */
|
|
117
|
+
exposureStorageKey?: string;
|
|
116
118
|
/** Network timeout per request. */
|
|
117
119
|
timeoutMs?: number;
|
|
118
120
|
/** Ed25519 public key, as raw 32-byte base64. Enables built-in verification. */
|
|
@@ -150,9 +152,21 @@ interface ConfigSnapshot {
|
|
|
150
152
|
experiments: ConfigExperiment[];
|
|
151
153
|
}
|
|
152
154
|
|
|
155
|
+
interface QueuedExposure {
|
|
156
|
+
reportId: string;
|
|
157
|
+
signature: string;
|
|
158
|
+
platform?: string;
|
|
159
|
+
appVersion?: string;
|
|
160
|
+
assignments: Record<string, string>;
|
|
161
|
+
attempts: number;
|
|
162
|
+
}
|
|
163
|
+
|
|
153
164
|
const STORAGE_KEY = 'pulse.config.v1';
|
|
154
165
|
const DEFAULT_POLL_MS = 5 * 60 * 1000;
|
|
155
166
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
167
|
+
const DEFAULT_EXPOSURE_RETRY_MS = 10_000;
|
|
168
|
+
const DEFAULT_EXPOSURE_STORAGE_KEY = 'pulse.exposures.v1';
|
|
169
|
+
const MAX_EXPOSURE_QUEUE = 50;
|
|
156
170
|
|
|
157
171
|
let options: ConfigOptions | null = null;
|
|
158
172
|
let defaults: Record<string, ConfigValue> = {};
|
|
@@ -177,6 +191,11 @@ let signatureKeyId: string | null = null;
|
|
|
177
191
|
let pending: ConfigSnapshot | null = null;
|
|
178
192
|
/** The arm set already reported this session, so a poll does not re-report it. */
|
|
179
193
|
let reportedExposure: string | null = null;
|
|
194
|
+
let exposureQueue: QueuedExposure[] = [];
|
|
195
|
+
let deliveredExposureSignatures = new Set<string>();
|
|
196
|
+
let exposureSending = false;
|
|
197
|
+
let exposureNextAttemptAt = 0;
|
|
198
|
+
let exposureTimer: ReturnType<typeof setInterval> | null = null;
|
|
180
199
|
let inFlight: Promise<boolean> | null = null;
|
|
181
200
|
let pollTimer: ReturnType<typeof setInterval> | null = null;
|
|
182
201
|
let configGeneration = 0;
|
|
@@ -193,6 +212,7 @@ export function configureConfig(opts: ConfigOptions): void {
|
|
|
193
212
|
// may cross that boundary.
|
|
194
213
|
configGeneration += 1;
|
|
195
214
|
stopPolling();
|
|
215
|
+
stopExposureDelivery();
|
|
196
216
|
options = opts;
|
|
197
217
|
defaults = { ...(opts.defaults ?? {}) };
|
|
198
218
|
values = {};
|
|
@@ -205,6 +225,10 @@ export function configureConfig(opts: ConfigOptions): void {
|
|
|
205
225
|
signatureKeyId = null;
|
|
206
226
|
pending = null;
|
|
207
227
|
reportedExposure = null;
|
|
228
|
+
exposureQueue = readExposureQueue(opts);
|
|
229
|
+
deliveredExposureSignatures = readDeliveredExposureSignatures(opts);
|
|
230
|
+
exposureSending = false;
|
|
231
|
+
exposureNextAttemptAt = 0;
|
|
208
232
|
inFlight = null;
|
|
209
233
|
|
|
210
234
|
applyCachedPayload(readCache(opts.storage, opts.storageKey), opts);
|
|
@@ -322,6 +346,8 @@ export function startConfigAutoRefresh(appState?: {
|
|
|
322
346
|
addEventListener: (type: 'change', handler: (state: string) => void) => { remove: () => void };
|
|
323
347
|
}): () => void {
|
|
324
348
|
void fetchConfig();
|
|
349
|
+
startExposureDelivery();
|
|
350
|
+
void flushExposures();
|
|
325
351
|
|
|
326
352
|
const subscription = appState?.addEventListener('change', (state) => {
|
|
327
353
|
if (state === 'active') void fetchConfig();
|
|
@@ -339,6 +365,7 @@ export function startConfigAutoRefresh(appState?: {
|
|
|
339
365
|
return () => {
|
|
340
366
|
subscription?.remove();
|
|
341
367
|
stopPolling();
|
|
368
|
+
stopExposureDelivery();
|
|
342
369
|
};
|
|
343
370
|
}
|
|
344
371
|
|
|
@@ -360,7 +387,7 @@ function applySnapshot(next: ConfigSnapshot, opts: ConfigOptions): boolean {
|
|
|
360
387
|
// Reported on apply, never on fetch: with activateOnFetch false a payload can sit
|
|
361
388
|
// unapplied for the rest of a session, and an arm the app is not actually serving
|
|
362
389
|
// is not an exposure.
|
|
363
|
-
|
|
390
|
+
queueExposure(opts);
|
|
364
391
|
|
|
365
392
|
// Listeners drive re-renders and gate re-evaluation: firing them for an identical
|
|
366
393
|
// payload is pure churn, and the 200-with-same-content case is common enough
|
|
@@ -386,34 +413,100 @@ function applySnapshot(next: ConfigSnapshot, opts: ConfigOptions): boolean {
|
|
|
386
413
|
* Failure is swallowed on purpose. This is a diagnostic, and no diagnostic is worth
|
|
387
414
|
* a rejected promise on the path that delivers config to the app.
|
|
388
415
|
*/
|
|
389
|
-
|
|
416
|
+
function queueExposure(opts: ConfigOptions): void {
|
|
390
417
|
if (opts.reportExposure !== true) return;
|
|
391
418
|
if (experiments.length === 0) return;
|
|
392
419
|
|
|
393
420
|
const signature = experiments.map((e) => `${e.key}=${e.variant}`).join(',');
|
|
394
|
-
if (signature === reportedExposure)
|
|
395
|
-
|
|
421
|
+
if (signature === reportedExposure || deliveredExposureSignatures.has(signature) ||
|
|
422
|
+
exposureQueue.some((item) => item.signature === signature)) return;
|
|
396
423
|
|
|
397
424
|
const context = opts.getContext?.() ?? {};
|
|
398
425
|
const assignments: Record<string, string> = {};
|
|
399
426
|
for (const entry of experiments) assignments[entry.key] = entry.variant;
|
|
400
427
|
|
|
428
|
+
exposureQueue.push({
|
|
429
|
+
reportId: randomDeliveryId('exp'),
|
|
430
|
+
signature,
|
|
431
|
+
platform: context.platform,
|
|
432
|
+
appVersion: context.appVersion,
|
|
433
|
+
assignments,
|
|
434
|
+
attempts: 0,
|
|
435
|
+
});
|
|
436
|
+
if (exposureQueue.length > MAX_EXPOSURE_QUEUE) {
|
|
437
|
+
exposureQueue = exposureQueue.slice(-MAX_EXPOSURE_QUEUE);
|
|
438
|
+
}
|
|
439
|
+
persistExposureQueue(opts, exposureQueue);
|
|
440
|
+
void flushExposures();
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Flushes the durable exposure outbox. Safe to call on launch, resume or manually. */
|
|
444
|
+
export async function flushExposures(): Promise<number> {
|
|
445
|
+
if (!options || exposureSending || exposureQueue.length === 0 || Date.now() < exposureNextAttemptAt) return 0;
|
|
446
|
+
|
|
447
|
+
const opts = options;
|
|
448
|
+
const requestGeneration = configGeneration;
|
|
449
|
+
const item = exposureQueue[0]!;
|
|
450
|
+
exposureSending = true;
|
|
451
|
+
|
|
452
|
+
const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;
|
|
453
|
+
const timeout = controller
|
|
454
|
+
? setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS)
|
|
455
|
+
: null;
|
|
456
|
+
|
|
401
457
|
try {
|
|
402
|
-
await fetch(`${opts.url.replace(/\/+$/, '')}/exposure`, {
|
|
458
|
+
const response = await fetch(`${opts.url.replace(/\/+$/, '')}/exposure`, {
|
|
403
459
|
method: 'POST',
|
|
404
460
|
headers: { 'Content-Type': 'application/json' },
|
|
405
461
|
body: JSON.stringify({
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
462
|
+
reportId: item.reportId,
|
|
463
|
+
platform: item.platform,
|
|
464
|
+
appVersion: item.appVersion,
|
|
465
|
+
assignments: item.assignments,
|
|
409
466
|
}),
|
|
467
|
+
signal: controller?.signal,
|
|
410
468
|
});
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
if (options === opts)
|
|
469
|
+
if (!response.ok) throw new Error(`Pulse exposure HTTP ${response.status}`);
|
|
470
|
+
|
|
471
|
+
if (requestGeneration === configGeneration && options === opts) {
|
|
472
|
+
exposureQueue = exposureQueue.filter((queued) => queued.reportId !== item.reportId);
|
|
473
|
+
reportedExposure = item.signature;
|
|
474
|
+
deliveredExposureSignatures.add(item.signature);
|
|
475
|
+
persistDeliveredExposureSignatures(opts);
|
|
476
|
+
exposureNextAttemptAt = 0;
|
|
477
|
+
persistExposureQueue(opts, exposureQueue);
|
|
478
|
+
if (exposureQueue.length > 0) void flushExposures();
|
|
479
|
+
} else {
|
|
480
|
+
removeExposureFromStoredQueue(opts, item.reportId);
|
|
481
|
+
markStoredExposureDelivered(opts, item.signature);
|
|
482
|
+
}
|
|
483
|
+
return 1;
|
|
484
|
+
} catch (error) {
|
|
485
|
+
if (requestGeneration === configGeneration && options === opts) {
|
|
486
|
+
exposureQueue = exposureQueue.map((queued) => queued.reportId === item.reportId
|
|
487
|
+
? { ...queued, attempts: queued.attempts + 1 }
|
|
488
|
+
: queued);
|
|
489
|
+
const attempts = Math.min(item.attempts + 1, 6);
|
|
490
|
+
const base = Math.min(60_000, 1_000 * 2 ** Math.max(0, attempts - 1));
|
|
491
|
+
exposureNextAttemptAt = Date.now() + base;
|
|
492
|
+
persistExposureQueue(opts, exposureQueue);
|
|
493
|
+
}
|
|
494
|
+
opts.onError?.(error);
|
|
495
|
+
return 0;
|
|
496
|
+
} finally {
|
|
497
|
+
if (timeout) clearTimeout(timeout);
|
|
498
|
+
if (requestGeneration === configGeneration) exposureSending = false;
|
|
414
499
|
}
|
|
415
500
|
}
|
|
416
501
|
|
|
502
|
+
export function pendingExposureCount(): number {
|
|
503
|
+
return exposureQueue.length;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
export function getExposureDeliveryInfo(): { queueDepth: number; sending: boolean; nextAttemptAt: number } {
|
|
507
|
+
return { queueDepth: exposureQueue.length, sending: exposureSending, nextAttemptAt: exposureNextAttemptAt };
|
|
508
|
+
}
|
|
509
|
+
|
|
417
510
|
/**
|
|
418
511
|
* Verifies the exact unsigned JSON object the server signs. A configured verifier
|
|
419
512
|
* also rejects a bad optional signature: accepting a payload that claims to be
|
|
@@ -587,6 +680,102 @@ function stopPolling(): void {
|
|
|
587
680
|
}
|
|
588
681
|
}
|
|
589
682
|
|
|
683
|
+
function startExposureDelivery(): void {
|
|
684
|
+
stopExposureDelivery();
|
|
685
|
+
if (options?.reportExposure !== true) return;
|
|
686
|
+
exposureTimer = setInterval(() => void flushExposures(), DEFAULT_EXPOSURE_RETRY_MS);
|
|
687
|
+
(exposureTimer as unknown as { unref?: () => void }).unref?.();
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
function stopExposureDelivery(): void {
|
|
691
|
+
if (exposureTimer) clearInterval(exposureTimer);
|
|
692
|
+
exposureTimer = null;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
function exposureStorageKey(opts: ConfigOptions): string {
|
|
696
|
+
if (opts.exposureStorageKey?.trim()) return opts.exposureStorageKey.trim();
|
|
697
|
+
if (opts.storageKey?.trim()) return `${opts.storageKey.trim()}.exposures`;
|
|
698
|
+
return DEFAULT_EXPOSURE_STORAGE_KEY;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
function deliveredExposureStorageKey(opts: ConfigOptions): string {
|
|
702
|
+
return `${exposureStorageKey(opts)}.delivered`;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
function readExposureQueue(opts: ConfigOptions): QueuedExposure[] {
|
|
706
|
+
if (!opts.storage) return [];
|
|
707
|
+
try {
|
|
708
|
+
const raw = opts.storage.getString(exposureStorageKey(opts));
|
|
709
|
+
if (!raw) return [];
|
|
710
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
711
|
+
if (!Array.isArray(parsed)) return [];
|
|
712
|
+
return parsed.filter((item): item is QueuedExposure => Boolean(
|
|
713
|
+
item && typeof item === 'object' &&
|
|
714
|
+
typeof (item as QueuedExposure).reportId === 'string' &&
|
|
715
|
+
typeof (item as QueuedExposure).signature === 'string' &&
|
|
716
|
+
typeof (item as QueuedExposure).assignments === 'object' &&
|
|
717
|
+
typeof (item as QueuedExposure).attempts === 'number',
|
|
718
|
+
)).slice(-MAX_EXPOSURE_QUEUE);
|
|
719
|
+
} catch {
|
|
720
|
+
return [];
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
function persistExposureQueue(opts: ConfigOptions, queued: QueuedExposure[]): void {
|
|
725
|
+
if (!opts.storage) return;
|
|
726
|
+
try {
|
|
727
|
+
opts.storage.set(exposureStorageKey(opts), JSON.stringify(queued));
|
|
728
|
+
} catch {
|
|
729
|
+
// Exposure delivery is diagnostic and may never make config adoption fail.
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
function readDeliveredExposureSignatures(opts: ConfigOptions): Set<string> {
|
|
734
|
+
if (!opts.storage) return new Set();
|
|
735
|
+
try {
|
|
736
|
+
const raw = opts.storage.getString(deliveredExposureStorageKey(opts));
|
|
737
|
+
if (!raw) return new Set();
|
|
738
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
739
|
+
if (!Array.isArray(parsed)) return new Set();
|
|
740
|
+
return new Set(parsed.filter((value): value is string => typeof value === 'string').slice(-100));
|
|
741
|
+
} catch {
|
|
742
|
+
return new Set();
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
function persistDeliveredExposureSignatures(opts: ConfigOptions): void {
|
|
747
|
+
if (!opts.storage) return;
|
|
748
|
+
try {
|
|
749
|
+
const values = [...deliveredExposureSignatures].slice(-100);
|
|
750
|
+
opts.storage.set(deliveredExposureStorageKey(opts), JSON.stringify(values));
|
|
751
|
+
} catch {
|
|
752
|
+
// The server-side reportId still protects retries in this process.
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
function markStoredExposureDelivered(opts: ConfigOptions, signature: string): void {
|
|
757
|
+
if (!opts.storage) return;
|
|
758
|
+
try {
|
|
759
|
+
const stored = readDeliveredExposureSignatures(opts);
|
|
760
|
+
stored.add(signature);
|
|
761
|
+
opts.storage.set(deliveredExposureStorageKey(opts), JSON.stringify([...stored].slice(-100)));
|
|
762
|
+
} catch {
|
|
763
|
+
// A later server retry remains idempotent through its reportId.
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
function removeExposureFromStoredQueue(opts: ConfigOptions, reportId: string): void {
|
|
768
|
+
if (!opts.storage) return;
|
|
769
|
+
const queued = readExposureQueue(opts).filter((item) => item.reportId !== reportId);
|
|
770
|
+
persistExposureQueue(opts, queued);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
function randomDeliveryId(prefix: string): string {
|
|
774
|
+
const cryptoLike = globalThis.crypto as { randomUUID?: () => string } | undefined;
|
|
775
|
+
if (typeof cryptoLike?.randomUUID === 'function') return `${prefix}-${cryptoLike.randomUUID()}`;
|
|
776
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 14)}`;
|
|
777
|
+
}
|
|
778
|
+
|
|
590
779
|
// ─── Reads ────────────────────────────────────────────────────────────────────
|
|
591
780
|
|
|
592
781
|
/** The served value, or the registered default. Never a type's zero value. */
|
|
@@ -714,8 +903,13 @@ export function resetConfigForTests(): void {
|
|
|
714
903
|
inFlight = null;
|
|
715
904
|
pending = null;
|
|
716
905
|
reportedExposure = null;
|
|
906
|
+
exposureQueue = [];
|
|
907
|
+
deliveredExposureSignatures = new Set();
|
|
908
|
+
exposureSending = false;
|
|
909
|
+
exposureNextAttemptAt = 0;
|
|
717
910
|
listeners.clear();
|
|
718
911
|
stopPolling();
|
|
912
|
+
stopExposureDelivery();
|
|
719
913
|
}
|
|
720
914
|
|
|
721
915
|
// ─── Internals ────────────────────────────────────────────────────────────────
|