@traffical/node 0.8.0 → 0.10.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 (36) hide show
  1. package/README.md +16 -6
  2. package/dist/assignment-logger.test.js +10 -1
  3. package/dist/assignment-logger.test.js.map +1 -1
  4. package/dist/canonical-options.test.d.ts +2 -0
  5. package/dist/canonical-options.test.d.ts.map +1 -0
  6. package/dist/canonical-options.test.js +167 -0
  7. package/dist/canonical-options.test.js.map +1 -0
  8. package/dist/client.d.ts +111 -17
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +280 -50
  11. package/dist/client.js.map +1 -1
  12. package/dist/contract-0.7.0.test.d.ts +2 -0
  13. package/dist/contract-0.7.0.test.d.ts.map +1 -0
  14. package/dist/contract-0.7.0.test.js +171 -0
  15. package/dist/contract-0.7.0.test.js.map +1 -0
  16. package/dist/event-batcher.d.ts +58 -2
  17. package/dist/event-batcher.d.ts.map +1 -1
  18. package/dist/event-batcher.js +157 -23
  19. package/dist/event-batcher.js.map +1 -1
  20. package/dist/event-batcher.test.js +66 -0
  21. package/dist/event-batcher.test.js.map +1 -1
  22. package/dist/event-logger.test.js +63 -3
  23. package/dist/event-logger.test.js.map +1 -1
  24. package/dist/malformed-bundle.test.d.ts +12 -0
  25. package/dist/malformed-bundle.test.d.ts.map +1 -0
  26. package/dist/malformed-bundle.test.js +110 -0
  27. package/dist/malformed-bundle.test.js.map +1 -0
  28. package/dist/track-exposure.test.d.ts +12 -0
  29. package/dist/track-exposure.test.d.ts.map +1 -0
  30. package/dist/track-exposure.test.js +112 -0
  31. package/dist/track-exposure.test.js.map +1 -0
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.d.ts.map +1 -1
  34. package/dist/version.js +1 -1
  35. package/dist/version.js.map +1 -1
  36. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"event-batcher.test.js","sourceRoot":"","sources":["../src/event-batcher.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,SAAS,gBAAgB,CAAC,YAAiC,EAAE;IAC3D,OAAO;QACL,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,YAAY;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAyB;IACzC;QACE,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;SACvE;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,aAAsC,CAAC;IAE3C,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,gBAAgB,GAA2B,EAAE,CAAC;QAEpD,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CACV,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,cAAc,EAAE,YAAY;SAC7B,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CACF,CACK,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,QAAQ,EAAE,0CAA0C;YACpD,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,eAAe,EAAE,MAAM;YACvB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC7B,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAElD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,gBAAgB,GAA2B,EAAE,CAAC;QAEpD,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CACV,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CACF,CACK,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,QAAQ,EAAE,0CAA0C;YACpD,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,eAAe,EAAE,MAAM;YACvB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC7B,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC/E,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,QAAQ,CACvB,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,EAC7D,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;gBAClC,KAAK,EAAE,GAAG,EAAE;oBACV,UAAU,GAAG,IAAI,CAAC;oBAClB,OAAO,YAAY,EAAE,CAAC;gBACxB,CAAC;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAQ,CAAC;QAEV,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,QAAQ,EAAE,0CAA0C;YACpD,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,gBAAgB,GAA2B,EAAE,CAAC;QAEpD,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAC1C,CACK,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,QAAQ,EAAE,0CAA0C;YACpD,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,eAAe,EAAE,MAAM;YACvB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC7B,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"event-batcher.test.js","sourceRoot":"","sources":["../src/event-batcher.test.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,64 @@ describe("Node TrafficalClient eventLogger", () => {
68
68
  expect(decisions[0]?.unitKey).toBe("user-1");
69
69
  await client.destroy();
70
70
  });
71
+ test("decision and exposure events carry configVersion", async () => {
72
+ setupFetchMock();
73
+ const events = [];
74
+ const client = new TrafficalClient({
75
+ ...clientOpts,
76
+ eventLogger: (event) => events.push(event),
77
+ });
78
+ await client.initialize();
79
+ const decision = client.decide({
80
+ context: { userId: "user-1" },
81
+ defaults: { "ui.color": "#000" },
82
+ });
83
+ client.trackExposure(decision);
84
+ const decisionEvent = events.find((e) => e.type === "decision");
85
+ const exposureEvent = events.find((e) => e.type === "exposure");
86
+ expect(decisionEvent).toBeDefined();
87
+ expect(exposureEvent).toBeDefined();
88
+ // Server mode: getConfigVersion() surfaces the resolve stateVersion.
89
+ expect(decisionEvent.configVersion).toBe(serverResolveResponse.stateVersion);
90
+ expect(exposureEvent.configVersion).toBe(serverResolveResponse.stateVersion);
91
+ await client.destroy();
92
+ });
93
+ test("configVersion is snapshotted at decide() time, not event-build time", async () => {
94
+ // The mock serves stateVersion v1 first, then v2 after the refresh.
95
+ let stateVersion = "2024-01-01T00:00:00Z";
96
+ const fetchMock = mock(async () => {
97
+ return {
98
+ ok: true,
99
+ status: 200,
100
+ statusText: "OK",
101
+ json: async () => ({ ...serverResolveResponse, stateVersion }),
102
+ headers: new Headers({ ETag: '"v1"' }),
103
+ };
104
+ });
105
+ globalThis.fetch = fetchMock;
106
+ const events = [];
107
+ const client = new TrafficalClient({
108
+ ...clientOpts,
109
+ eventLogger: (event) => events.push(event),
110
+ });
111
+ await client.initialize();
112
+ // Decide against v1, THEN refresh to v2 before the exposure is built.
113
+ const decision = client.decide({
114
+ context: { userId: "user-1" },
115
+ defaults: { "ui.color": "#000" },
116
+ });
117
+ expect(decision.metadata.configVersion).toBe("2024-01-01T00:00:00Z");
118
+ stateVersion = "2024-06-01T00:00:00Z";
119
+ await client.refreshConfig();
120
+ expect(client.getConfigVersion()).toBe("2024-06-01T00:00:00Z");
121
+ client.trackExposure(decision);
122
+ // The exposure event carries the decision-time snapshot (v1), not the
123
+ // stateVersion current at event-build time (v2).
124
+ const exposureEvent = events.find((e) => e.type === "exposure");
125
+ expect(exposureEvent).toBeDefined();
126
+ expect(exposureEvent.configVersion).toBe("2024-01-01T00:00:00Z");
127
+ await client.destroy();
128
+ });
71
129
  test("trackExposure() and track() emit exposure + track events", async () => {
72
130
  setupFetchMock();
73
131
  const events = [];
@@ -96,15 +154,17 @@ describe("Node TrafficalClient eventLogger", () => {
96
154
  eventLogger: (event) => events.push(event),
97
155
  });
98
156
  await client.initialize();
99
- const callsAfterInit = fetchMock.mock.calls.length;
100
157
  const decision = client.decide({
101
158
  context: { userId: "user-1" },
102
159
  defaults: { "ui.color": "#000" },
103
160
  });
104
161
  client.trackExposure(decision);
105
162
  await client.flushEvents();
106
- // No additional fetch calls for event delivery (only resolve happened at init).
107
- expect(fetchMock.mock.calls.length).toBe(callsAfterInit);
163
+ // No fetch calls to the EVENT-delivery endpoint (disableCloudEvents). A
164
+ // per-call /v1/resolve may fire in server mode, but nothing hits
165
+ // /v1/events/batch.
166
+ const eventBatchCalls = fetchMock.mock.calls.filter((c) => String(c[0]).includes("/v1/events"));
167
+ expect(eventBatchCalls).toHaveLength(0);
108
168
  expect(events.length).toBeGreaterThan(0);
109
169
  await client.destroy();
110
170
  });
@@ -1 +1 @@
1
- {"version":3,"file":"event-logger.test.js","sourceRoot":"","sources":["../src/event-logger.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-logger.test.js","sourceRoot":"","sources":["../src/event-logger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Malformed-bundle DISCARD (S8).
3
+ *
4
+ * A 200 response can still carry a structurally invalid bundle (truncated CDN
5
+ * write, partial deploy). Serving it would corrupt every bucket assignment, so
6
+ * `_fetchConfig` validates the hashing/shape and, on failure, discards the body,
7
+ * logs a rate-limited warning, and KEEPS the previous last-good bundle. These
8
+ * tests initialize against a good bundle, then feed a malformed 200 on refresh
9
+ * and assert the good bundle is still served.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=malformed-bundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malformed-bundle.test.d.ts","sourceRoot":"","sources":["../src/malformed-bundle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Malformed-bundle DISCARD (S8).
3
+ *
4
+ * A 200 response can still carry a structurally invalid bundle (truncated CDN
5
+ * write, partial deploy). Serving it would corrupt every bucket assignment, so
6
+ * `_fetchConfig` validates the hashing/shape and, on failure, discards the body,
7
+ * logs a rate-limited warning, and KEEPS the previous last-good bundle. These
8
+ * tests initialize against a good bundle, then feed a malformed 200 on refresh
9
+ * and assert the good bundle is still served.
10
+ */
11
+ import { describe, test, expect, afterEach, mock } from "bun:test";
12
+ import { TrafficalClient } from "./client.js";
13
+ const originalFetch = globalThis.fetch;
14
+ const originalWarn = console.warn;
15
+ const goodBundle = {
16
+ version: "2024-01-01T00:00:00Z",
17
+ orgId: "org_test",
18
+ projectId: "proj_test",
19
+ env: "production",
20
+ hashing: { unitKey: "userId", bucketCount: 1000 },
21
+ parameters: [
22
+ { key: "ui.color", type: "string", default: "#AAA", layerId: "layer_1", namespace: "ui" },
23
+ ],
24
+ layers: [],
25
+ };
26
+ // bucketCount 0 is invalid (must be an integer >= 1).
27
+ const malformedBucketCount = {
28
+ version: "2024-09-09T00:00:00Z",
29
+ orgId: "org_test",
30
+ projectId: "proj_test",
31
+ env: "production",
32
+ hashing: { unitKey: "userId", bucketCount: 0 },
33
+ parameters: [
34
+ { key: "ui.color", type: "string", default: "#ZZZ", layerId: "layer_1", namespace: "ui" },
35
+ ],
36
+ layers: [],
37
+ };
38
+ // unitKey missing entirely.
39
+ const malformedMissingUnitKey = {
40
+ version: "2024-09-09T00:00:00Z",
41
+ orgId: "org_test",
42
+ projectId: "proj_test",
43
+ env: "production",
44
+ hashing: { bucketCount: 1000 },
45
+ parameters: [
46
+ { key: "ui.color", type: "string", default: "#ZZZ", layerId: "layer_1", namespace: "ui" },
47
+ ],
48
+ layers: [],
49
+ };
50
+ const clientOpts = {
51
+ orgId: "org_test",
52
+ projectId: "proj_test",
53
+ env: "production",
54
+ apiKey: "traffical_sk_test",
55
+ refreshIntervalMs: -1, // Disable background refresh; drive refetch manually.
56
+ trackDecisions: false,
57
+ };
58
+ /** Fetch mock that returns `bodies[callIndex]` (last body sticks) as a 200. */
59
+ function queuedFetch(bodies) {
60
+ let call = 0;
61
+ const fetchMock = mock(async () => {
62
+ const body = bodies[Math.min(call, bodies.length - 1)];
63
+ call++;
64
+ return {
65
+ ok: true,
66
+ status: 200,
67
+ statusText: "OK",
68
+ json: async () => body,
69
+ headers: new Headers({ ETag: `"v${call}"` }),
70
+ };
71
+ });
72
+ globalThis.fetch = fetchMock;
73
+ return fetchMock;
74
+ }
75
+ afterEach(() => {
76
+ globalThis.fetch = originalFetch;
77
+ console.warn = originalWarn;
78
+ });
79
+ describe("Node malformed-bundle DISCARD", () => {
80
+ test("bucketCount 0 on refresh is discarded; last-good bundle is still served", async () => {
81
+ const warnings = [];
82
+ console.warn = (...args) => warnings.push(args.map(String).join(" "));
83
+ queuedFetch([goodBundle, malformedBucketCount]);
84
+ const client = new TrafficalClient(clientOpts);
85
+ await client.initialize();
86
+ expect(client.getConfigVersion()).toBe("2024-01-01T00:00:00Z");
87
+ await client.refreshConfig();
88
+ // Malformed 200 discarded: version + resolved value stay on the good bundle.
89
+ expect(client.getConfigVersion()).toBe("2024-01-01T00:00:00Z");
90
+ const params = client.getParams({ userId: "user-1" }, { "ui.color": "#000" });
91
+ expect(params["ui.color"]).toBe("#AAA");
92
+ expect(warnings.some((w) => w.includes("malformed config bundle"))).toBe(true);
93
+ await client.destroy();
94
+ });
95
+ test("missing unitKey on refresh is discarded; last-good bundle is still served", async () => {
96
+ const warnings = [];
97
+ console.warn = (...args) => warnings.push(args.map(String).join(" "));
98
+ queuedFetch([goodBundle, malformedMissingUnitKey]);
99
+ const client = new TrafficalClient(clientOpts);
100
+ await client.initialize();
101
+ expect(client.getConfigVersion()).toBe("2024-01-01T00:00:00Z");
102
+ await client.refreshConfig();
103
+ expect(client.getConfigVersion()).toBe("2024-01-01T00:00:00Z");
104
+ const params = client.getParams({ userId: "user-1" }, { "ui.color": "#000" });
105
+ expect(params["ui.color"]).toBe("#AAA");
106
+ expect(warnings.some((w) => w.includes("malformed config bundle"))).toBe(true);
107
+ await client.destroy();
108
+ });
109
+ });
110
+ //# sourceMappingURL=malformed-bundle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malformed-bundle.test.js","sourceRoot":"","sources":["../src/malformed-bundle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests for the Node SDK exposure path (enh #3 — parity with the browser SDK):
3
+ * - trackExposure() skips `attributionOnly` layers (experiments the user was
4
+ * assigned to for attribution but not actually shown).
5
+ * - trackExposure() deduplicates per (unit, policy, allocation) within a session.
6
+ * - getUnitKeyField() / getParameterLayerId() read the loaded bundle.
7
+ *
8
+ * Uses a two-layer bundle where every unit matches a policy in both layers.
9
+ * Requesting only `flagA` (layer_a) leaves layer_b resolved attribution-only.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=track-exposure.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-exposure.test.d.ts","sourceRoot":"","sources":["../src/track-exposure.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Tests for the Node SDK exposure path (enh #3 — parity with the browser SDK):
3
+ * - trackExposure() skips `attributionOnly` layers (experiments the user was
4
+ * assigned to for attribution but not actually shown).
5
+ * - trackExposure() deduplicates per (unit, policy, allocation) within a session.
6
+ * - getUnitKeyField() / getParameterLayerId() read the loaded bundle.
7
+ *
8
+ * Uses a two-layer bundle where every unit matches a policy in both layers.
9
+ * Requesting only `flagA` (layer_a) leaves layer_b resolved attribution-only.
10
+ */
11
+ import { describe, test, expect } from "bun:test";
12
+ import { TrafficalClient } from "./client.js";
13
+ const bundle = {
14
+ version: "2026-01-01T00:00:00Z",
15
+ orgId: "org_1",
16
+ projectId: "proj_1",
17
+ env: "production",
18
+ hashing: { unitKey: "userId", bucketCount: 1000 },
19
+ parameters: [
20
+ { key: "flagA", type: "string", default: "a-default", layerId: "layer_a", namespace: "" },
21
+ { key: "flagB", type: "string", default: "b-default", layerId: "layer_b", namespace: "" },
22
+ ],
23
+ layers: [
24
+ {
25
+ id: "layer_a",
26
+ policies: [
27
+ {
28
+ id: "pol_a",
29
+ state: "running",
30
+ kind: "static",
31
+ conditions: [],
32
+ allocations: [
33
+ { id: "alloc_a", name: "treatment", bucketRange: [0, 999], overrides: { flagA: "a-treatment" } },
34
+ ],
35
+ },
36
+ ],
37
+ },
38
+ {
39
+ id: "layer_b",
40
+ policies: [
41
+ {
42
+ id: "pol_b",
43
+ state: "running",
44
+ kind: "static",
45
+ conditions: [],
46
+ allocations: [
47
+ { id: "alloc_b", name: "control", bucketRange: [0, 999], overrides: { flagB: "b-control" } },
48
+ ],
49
+ },
50
+ ],
51
+ },
52
+ ],
53
+ };
54
+ const baseOpts = {
55
+ orgId: "org_1",
56
+ projectId: "proj_1",
57
+ env: "production",
58
+ apiKey: "traffical_sk_test",
59
+ refreshIntervalMs: -1,
60
+ trackDecisions: false, // keep captured events to exposures only
61
+ disableCloudEvents: true,
62
+ localConfig: bundle,
63
+ };
64
+ describe("Node bundle accessors", () => {
65
+ test("getUnitKeyField / getParameterLayerId read from the bundle", () => {
66
+ const client = new TrafficalClient(baseOpts);
67
+ expect(client.getUnitKeyField()).toBe("userId");
68
+ expect(client.getParameterLayerId("flagA")).toBe("layer_a");
69
+ expect(client.getParameterLayerId("flagB")).toBe("layer_b");
70
+ expect(client.getParameterLayerId("nope")).toBeNull();
71
+ });
72
+ });
73
+ describe("Node trackExposure", () => {
74
+ test("skips attribution-only layers", async () => {
75
+ const events = [];
76
+ const client = new TrafficalClient({ ...baseOpts, eventLogger: (e) => events.push(e) });
77
+ // Request only flagA → layer_b resolves attribution-only.
78
+ const decision = client.decide({ context: { userId: "u1" }, defaults: { flagA: "x" } });
79
+ // sanity: the decision saw layer_b as attribution-only
80
+ expect(decision.metadata.layers.some((l) => l.attributionOnly)).toBe(true);
81
+ client.trackExposure(decision);
82
+ const exposures = events.filter((e) => e.type === "exposure");
83
+ expect(exposures).toHaveLength(1);
84
+ const policyIds = exposures[0].layers.map((l) => l.policyId);
85
+ expect(policyIds).toContain("pol_a"); // shown
86
+ expect(policyIds).not.toContain("pol_b"); // attribution-only → skipped
87
+ await client.destroy();
88
+ });
89
+ test("deduplicates repeated exposures for the same unit+policy+allocation", async () => {
90
+ const events = [];
91
+ const client = new TrafficalClient({ ...baseOpts, eventLogger: (e) => events.push(e) });
92
+ const decision = client.decide({ context: { userId: "u1" }, defaults: { flagA: "x" } });
93
+ client.trackExposure(decision);
94
+ client.trackExposure(decision); // duplicate → no second exposure event
95
+ expect(events.filter((e) => e.type === "exposure")).toHaveLength(1);
96
+ await client.destroy();
97
+ });
98
+ test("deduplicateExposures: false emits every exposure", async () => {
99
+ const events = [];
100
+ const client = new TrafficalClient({
101
+ ...baseOpts,
102
+ deduplicateExposures: false,
103
+ eventLogger: (e) => events.push(e),
104
+ });
105
+ const decision = client.decide({ context: { userId: "u1" }, defaults: { flagA: "x" } });
106
+ client.trackExposure(decision);
107
+ client.trackExposure(decision);
108
+ expect(events.filter((e) => e.type === "exposure")).toHaveLength(2);
109
+ await client.destroy();
110
+ });
111
+ });
112
+ //# sourceMappingURL=track-exposure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-exposure.test.js","sourceRoot":"","sources":["../src/track-exposure.test.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const SDK_VERSION = "0.8.0";
1
+ export declare const SDK_VERSION = "0.10.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,UAAU,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,WAAW,CAAC"}
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Auto-generated from package.json — do not edit manually.
2
- export const SDK_VERSION = "0.8.0";
2
+ export const SDK_VERSION = "0.10.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@traffical/node",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Traffical SDK for Node.js - HTTP client with caching and event tracking",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,12 +19,12 @@
19
19
  "build": "bun run generate-version && tsc",
20
20
  "generate-version": "bun run ../../scripts/generate-version.ts",
21
21
  "dev": "tsc --watch",
22
- "test": "echo 'No tests yet'",
23
- "typecheck": "tsc --noEmit"
22
+ "test": "bun run generate-version && bun test",
23
+ "typecheck": "bun run generate-version && tsc --noEmit"
24
24
  },
25
25
  "dependencies": {
26
- "@traffical/core": "0.10.0",
27
- "@traffical/core-io": "0.6.0"
26
+ "@traffical/core": "0.11.0",
27
+ "@traffical/core-io": "0.6.1"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/bun": "latest",