@traffical/js-client 0.17.0 → 0.18.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.
package/README.md CHANGED
@@ -29,7 +29,7 @@ const traffical = await createTrafficalClient({
29
29
  orgId: 'org_xxx',
30
30
  projectId: 'proj_xxx',
31
31
  env: 'production',
32
- apiKey: 'pk_xxx',
32
+ apiKey: 'traffical_pk_…',
33
33
  });
34
34
 
35
35
  // Get parameters
@@ -67,7 +67,7 @@ traffical.track('checkout_complete', { value: 1 }, { decisionId: decision.decisi
67
67
  orgId: 'org_xxx',
68
68
  projectId: 'proj_xxx',
69
69
  env: 'production',
70
- apiKey: 'pk_xxx',
70
+ apiKey: 'traffical_pk_…',
71
71
  }).then(function(traffical) {
72
72
  var params = traffical.getParams({
73
73
  context: { userId: 'user_123' },
@@ -167,7 +167,7 @@ The Traffical DevTools debug plugin uses these methods to let developers force p
167
167
  ## Features
168
168
 
169
169
  - **Error Boundary** - SDK errors never crash your app
170
- - **Exposure Deduplication** - Same user/variant = 1 exposure per session
170
+ - **Exposure Deduplication** - Same user/allocation = 1 exposure event per session
171
171
  - **Smart Batching** - Events batched and flushed efficiently
172
172
  - **Beacon on Unload** - Events sent reliably on page close
173
173
  - **Auto Stable ID** - Anonymous user identification via localStorage/cookie
@@ -187,7 +187,7 @@ const traffical = await createTrafficalClient({
187
187
  orgId: 'org_xxx',
188
188
  projectId: 'proj_xxx',
189
189
  env: 'production',
190
- apiKey: 'pk_xxx',
190
+ apiKey: 'traffical_pk_…',
191
191
  plugins: [
192
192
  createDOMBindingPlugin({
193
193
  observeMutations: true, // Watch for DOM changes (SPA support)
@@ -218,7 +218,7 @@ The plugin:
218
218
 
219
219
  ### Redirect Plugin
220
220
 
221
- Run URL split tests (redirect experiments) where visitors are redirected to different landing page variants. The redirect plugin automatically triggers a decision on init, performs the redirect, and sets an attribution cookie. The attribution plugin ensures conversions on the variant page are attributed back to the experiment.
221
+ Run URL split tests (redirect policies) where visitors are redirected to different landing page allocations. The redirect plugin automatically triggers a decision on init, performs the redirect, and sets an attribution cookie. The attribution plugin ensures conversions on the destination page are attributed back to the policy.
222
222
 
223
223
  ```typescript
224
224
  import {
@@ -231,7 +231,7 @@ const traffical = await createTrafficalClient({
231
231
  orgId: 'org_xxx',
232
232
  projectId: 'proj_xxx',
233
233
  env: 'production',
234
- apiKey: 'pk_xxx',
234
+ apiKey: 'traffical_pk_…',
235
235
  plugins: [
236
236
  createRedirectPlugin(),
237
237
  createRedirectAttributionPlugin(),
@@ -242,7 +242,7 @@ const traffical = await createTrafficalClient({
242
242
  // On entry pages, it redirects. On other pages, it's a no-op.
243
243
 
244
244
  // Track goals as usual — the attribution plugin injects
245
- // redirect experiment metadata into every track() call.
245
+ // redirect policy metadata into every track() call.
246
246
  traffical.track('add_to_cart', { value: 29.99 });
247
247
  ```
248
248
 
@@ -281,9 +281,9 @@ Track goal events from a separate GTM tag (e.g., triggered on "Add to Cart" clic
281
281
 
282
282
  1. **Init** — The redirect plugin's `onInitialize` hook receives the client and calls `decide()` automatically.
283
283
 
284
- 2. **Entry page** — `onBeforeDecision` injects `url.pathname` into the context. The policy condition (e.g., `url.pathname startsWith /products/pillow`) matches, `redirect.url` resolves to the variant URL. `onDecision` writes an attribution cookie (`traffical_rdr`) and calls `window.location.replace()`.
284
+ 2. **Entry page** — `onBeforeDecision` injects `url.pathname` into the context. The policy condition (e.g., `url.pathname startsWith /products/pillow`) matches, `redirect.url` resolves to the allocation's URL. `onDecision` writes an attribution cookie (`traffical_rdr`) and calls `window.location.replace()`.
285
285
 
286
- 3. **Variant page** — The SDK loads again, `decide()` runs, but the policy condition doesn't match the new URL, so `redirect.url` stays empty and no redirect happens. The redirect-attribution plugin reads the `traffical_rdr` cookie and injects the experiment metadata into every `track()` call.
286
+ 3. **Destination page** — The SDK loads again, `decide()` runs, but the policy condition doesn't match the new URL, so `redirect.url` stays empty and no redirect happens. The redirect-attribution plugin reads the `traffical_rdr` cookie and injects the policy metadata into every `track()` call.
287
287
 
288
288
  #### Configuration
289
289
 
package/dist/client.d.ts CHANGED
@@ -151,7 +151,7 @@ export interface TrafficalClientOptions {
151
151
  disableCloudEvents?: boolean;
152
152
  /**
153
153
  * When true, assignment logger calls are deduplicated per session
154
- * (same unit+policy+variant won't fire again). Default: true.
154
+ * (same unit+policy+allocation won't fire again). Default: true.
155
155
  */
156
156
  deduplicateAssignmentLogger?: boolean;
157
157
  /**
@@ -275,7 +275,7 @@ export declare class TrafficalClient<TEvents extends TrackEventMap = TrackEventM
275
275
  decide<T extends Record<string, ParameterValue>>(options: DecideOptions<T>): DecisionResult;
276
276
  /**
277
277
  * Tracks an exposure event.
278
- * Automatically deduplicates exposures for the same user/variant.
278
+ * Automatically deduplicates exposure events for the same user/allocation.
279
279
  *
280
280
  * Skips layers marked `attributionOnly` — those were resolved for
281
281
  * attribution/assignment purposes only (no parameters were requested
@@ -419,7 +419,7 @@ export declare class TrafficalClient<TEvents extends TrackEventMap = TrackEventM
419
419
  * - "cumulative": Collects layers from ALL cached decisions for this unit,
420
420
  * deduplicated by layerId:policyId (last-write-wins). This ensures cross-page
421
421
  * funnels (e.g., catalog -> PDP -> checkout) attribute correctly to all
422
- * experiments the user is exposed to. For per-entity dynamic allocation
422
+ * policies the user is exposed to. For per-entity dynamic allocation
423
423
  * policies, only the most recent allocation is kept to avoid attributing
424
424
  * rewards to allocations from other entities (e.g., different products).
425
425
  *
package/dist/client.js CHANGED
@@ -464,7 +464,7 @@ export class TrafficalClient {
464
464
  // ===========================================================================
465
465
  /**
466
466
  * Tracks an exposure event.
467
- * Automatically deduplicates exposures for the same user/variant.
467
+ * Automatically deduplicates exposure events for the same user/allocation.
468
468
  *
469
469
  * Skips layers marked `attributionOnly` — those were resolved for
470
470
  * attribution/assignment purposes only (no parameters were requested
@@ -1065,7 +1065,7 @@ export class TrafficalClient {
1065
1065
  * - "cumulative": Collects layers from ALL cached decisions for this unit,
1066
1066
  * deduplicated by layerId:policyId (last-write-wins). This ensures cross-page
1067
1067
  * funnels (e.g., catalog -> PDP -> checkout) attribute correctly to all
1068
- * experiments the user is exposed to. For per-entity dynamic allocation
1068
+ * policies the user is exposed to. For per-entity dynamic allocation
1069
1069
  * policies, only the most recent allocation is kept to avoid attributing
1070
1070
  * rewards to allocations from other entities (e.g., different products).
1071
1071
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ExposureDeduplicator - Prevents duplicate exposure events.
3
3
  *
4
- * Same user seeing same variant should only count as 1 exposure.
4
+ * Same user seeing the same allocation should only count as 1 exposure.
5
5
  * Uses session-based deduplication with localStorage persistence.
6
6
  */
7
7
  import type { StorageProvider } from "./storage.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ExposureDeduplicator - Prevents duplicate exposure events.
3
3
  *
4
- * Same user seeing same variant should only count as 1 exposure.
4
+ * Same user seeing the same allocation should only count as 1 exposure.
5
5
  * Uses session-based deduplication with localStorage persistence.
6
6
  */
7
7
  const STORAGE_KEY = "exposure_dedup";
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Features:
7
7
  * - Error boundary wrapping (P0) - SDK errors never crash your app
8
- * - Exposure deduplication (P0) - Same user/variant = 1 exposure
8
+ * - Exposure deduplication (P0) - Same user/allocation = 1 exposure event
9
9
  * - Smart event batching (P1) - Batches events, uses sendBeacon on unload
10
10
  * - Plugin system (P2) - Extensible via plugins
11
11
  * - DOM binding plugin - Auto-apply parameters to DOM elements
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Features:
7
7
  * - Error boundary wrapping (P0) - SDK errors never crash your app
8
- * - Exposure deduplication (P0) - Same user/variant = 1 exposure
8
+ * - Exposure deduplication (P0) - Same user/allocation = 1 exposure event
9
9
  * - Smart event batching (P1) - Batches events, uses sendBeacon on unload
10
10
  * - Plugin system (P2) - Extensible via plugins
11
11
  * - DOM binding plugin - Auto-apply parameters to DOM elements
@@ -53,6 +53,18 @@ export interface DebugState {
53
53
  lastDecisionId: string | null;
54
54
  /** Parameter overrides currently applied by the debug plugin. */
55
55
  overrides: Record<string, unknown>;
56
+ /**
57
+ * Context attributes the debug plugin merges into every decision's context
58
+ * (on top of whatever the host app passes). Lets an inspector satisfy
59
+ * targeting conditions the app itself never sets, e.g. `testMode exists`.
60
+ */
61
+ contextOverrides: Record<string, unknown>;
62
+ /**
63
+ * The context of the last real decision, as the app passed it (after the
64
+ * client's unit-key enrichment, before context overrides). `null` until the
65
+ * app has decided at least once.
66
+ */
67
+ lastContext: Record<string, unknown> | null;
56
68
  }
57
69
  export interface TrafficalDebugInstance {
58
70
  readonly id: string;
@@ -72,6 +84,18 @@ export interface TrafficalDebugInstance {
72
84
  clearOverride(key: string): void;
73
85
  clearAllOverrides(): void;
74
86
  getOverrides(): Record<string, unknown>;
87
+ /**
88
+ * Replace the context attributes merged into every decision. Re-decides
89
+ * immediately. Pass `{}` to clear.
90
+ */
91
+ setContextOverrides(context: Record<string, unknown>): void;
92
+ getContextOverrides(): Record<string, unknown>;
93
+ /**
94
+ * Re-run the app's last decision (same context and parameter set) so the
95
+ * inspector shows what the app would resolve right now. If the page uses
96
+ * the OpenFeature provider, the OpenFeature context is re-set so hooks
97
+ * bound to `PROVIDER_CONTEXT_CHANGED` re-render too.
98
+ */
75
99
  reDecide(): void;
76
100
  refresh(): Promise<void>;
77
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/plugins/debug.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/plugins/debug.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,21 @@ function emitRegistryEvent(event) {
67
67
  // Helpers
68
68
  // ---------------------------------------------------------------------------
69
69
  let _idCounter = 0;
70
+ /**
71
+ * The OpenFeature web SDK stores its API singleton on globalThis under a
72
+ * well-known symbol. Nudging its context makes `@traffical/openfeature-web`
73
+ * re-resolve every flag (through this client's `decide`, and therefore
74
+ * through the debug plugin's `onBeforeDecision`) and emit
75
+ * `PROVIDER_CONTEXT_CHANGED`, which is what host-app hooks re-render on.
76
+ */
77
+ const OPENFEATURE_API_SYMBOL = Symbol.for("@openfeature/web-sdk/api");
78
+ function getOpenFeatureApi() {
79
+ const api = globalThis[OPENFEATURE_API_SYMBOL];
80
+ if (api && typeof api.getContext === "function" && typeof api.setContext === "function") {
81
+ return api;
82
+ }
83
+ return null;
84
+ }
70
85
  function generateId() {
71
86
  return `traffical_${Date.now().toString(36)}_${(++_idCounter).toString(36)}`;
72
87
  }
@@ -87,6 +102,9 @@ export function createDebugPlugin(options = {}) {
87
102
  let _layers = [];
88
103
  let _lastDecisionId = null;
89
104
  let _effectiveUnitKey = null;
105
+ let _contextOverrides = {};
106
+ let _lastContext = null;
107
+ let _lastDefaults = null;
90
108
  const _events = [];
91
109
  let _stateListeners = [];
92
110
  let _eventListeners = [];
@@ -100,6 +118,8 @@ export function createDebugPlugin(options = {}) {
100
118
  layers: [..._layers],
101
119
  lastDecisionId: _lastDecisionId,
102
120
  overrides: _client?.getOverrides?.() ?? {},
121
+ contextOverrides: { ..._contextOverrides },
122
+ lastContext: _lastContext ? { ..._lastContext } : null,
103
123
  };
104
124
  }
105
125
  function notifyStateListeners() {
@@ -134,9 +154,30 @@ export function createDebugPlugin(options = {}) {
134
154
  }
135
155
  }
136
156
  function triggerReDecide() {
137
- if (_client) {
157
+ if (!_client)
158
+ return;
159
+ // Replay the app's last real decision. Unknown parameter keys keep the
160
+ // values we pass; known ones are re-resolved from the bundle, so the
161
+ // previous assignments are a faithful stand-in for the app's defaults.
162
+ // Before the app has decided once there is nothing to replay: an empty
163
+ // decision still refreshes layer/bucket info without resolving params.
164
+ try {
165
+ _client.decide({
166
+ context: _lastContext ? { ..._lastContext } : {},
167
+ defaults: _lastDefaults ? { ..._lastDefaults } : {},
168
+ });
169
+ }
170
+ catch {
171
+ // Best-effort
172
+ }
173
+ // OpenFeature-hosted apps resolve through the provider's bound context,
174
+ // not through the decision above. Re-setting the same context forces the
175
+ // provider to clear its memo and re-resolve, and fires
176
+ // PROVIDER_CONTEXT_CHANGED so the app's hooks pick up the new values.
177
+ const openFeature = getOpenFeatureApi();
178
+ if (openFeature) {
138
179
  try {
139
- _client.decide({ context: {}, defaults: {} });
180
+ void openFeature.setContext({ ...openFeature.getContext() }).catch(() => { });
140
181
  }
141
182
  catch {
142
183
  // Best-effort
@@ -208,6 +249,14 @@ export function createDebugPlugin(options = {}) {
208
249
  getOverrides() {
209
250
  return _client?.getOverrides?.() ?? {};
210
251
  },
252
+ setContextOverrides(context) {
253
+ _contextOverrides = { ...context };
254
+ notifyStateListeners();
255
+ triggerReDecide();
256
+ },
257
+ getContextOverrides() {
258
+ return { ..._contextOverrides };
259
+ },
211
260
  reDecide() {
212
261
  triggerReDecide();
213
262
  },
@@ -242,7 +291,14 @@ export function createDebugPlugin(options = {}) {
242
291
  debugInstance.meta.env = bundle.env;
243
292
  notifyStateListeners();
244
293
  },
294
+ onBeforeDecision(context) {
295
+ _lastContext = { ...context };
296
+ if (Object.keys(_contextOverrides).length === 0)
297
+ return;
298
+ return { ...context, ..._contextOverrides };
299
+ },
245
300
  onDecision(decision) {
301
+ _lastDefaults = { ...decision.assignments };
246
302
  _assignments = { ...decision.assignments };
247
303
  _layers = decision.metadata?.layers ? [...decision.metadata.layers] : [];
248
304
  _lastDecisionId = decision.decisionId;
@@ -273,6 +329,9 @@ export function createDebugPlugin(options = {}) {
273
329
  }
274
330
  _stateListeners = [];
275
331
  _eventListeners = [];
332
+ _contextOverrides = {};
333
+ _lastContext = null;
334
+ _lastDefaults = null;
276
335
  _client = null;
277
336
  },
278
337
  };
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/plugins/debug.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/plugins/debug.ts"],"names":[],"mappings":"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"}