@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.
- package/README.md +16 -6
- package/dist/assignment-logger.test.js +10 -1
- package/dist/assignment-logger.test.js.map +1 -1
- package/dist/canonical-options.test.d.ts +2 -0
- package/dist/canonical-options.test.d.ts.map +1 -0
- package/dist/canonical-options.test.js +167 -0
- package/dist/canonical-options.test.js.map +1 -0
- package/dist/client.d.ts +111 -17
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +280 -50
- package/dist/client.js.map +1 -1
- package/dist/contract-0.7.0.test.d.ts +2 -0
- package/dist/contract-0.7.0.test.d.ts.map +1 -0
- package/dist/contract-0.7.0.test.js +171 -0
- package/dist/contract-0.7.0.test.js.map +1 -0
- package/dist/event-batcher.d.ts +58 -2
- package/dist/event-batcher.d.ts.map +1 -1
- package/dist/event-batcher.js +157 -23
- package/dist/event-batcher.js.map +1 -1
- package/dist/event-batcher.test.js +66 -0
- package/dist/event-batcher.test.js.map +1 -1
- package/dist/event-logger.test.js +63 -3
- package/dist/event-logger.test.js.map +1 -1
- package/dist/malformed-bundle.test.d.ts +12 -0
- package/dist/malformed-bundle.test.d.ts.map +1 -0
- package/dist/malformed-bundle.test.js +110 -0
- package/dist/malformed-bundle.test.js.map +1 -0
- package/dist/track-exposure.test.d.ts +12 -0
- package/dist/track-exposure.test.d.ts.map +1 -0
- package/dist/track-exposure.test.js +112 -0
- package/dist/track-exposure.test.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-batcher.test.js","sourceRoot":"","sources":["../src/event-batcher.test.ts"],"names":[],"mappings":"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"}
|
|
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
|
|
107
|
-
|
|
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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;AACvC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAElC,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,WAAW;IACtB,GAAG,EAAE,YAAY;IACjB,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE;IACjD,UAAU,EAAE;QACV,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;KAC1F;IACD,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,sDAAsD;AACtD,MAAM,oBAAoB,GAAG;IAC3B,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,WAAW;IACtB,GAAG,EAAE,YAAY;IACjB,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,EAAE;IAC9C,UAAU,EAAE;QACV,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;KAC1F;IACD,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,4BAA4B;AAC5B,MAAM,uBAAuB,GAAG;IAC9B,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,WAAW;IACtB,GAAG,EAAE,YAAY;IACjB,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;IAC9B,UAAU,EAAE;QACV,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;KAC1F;IACD,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,WAAW;IACtB,GAAG,EAAE,YAAY;IACjB,MAAM,EAAE,mBAAmB;IAC3B,iBAAiB,EAAE,CAAC,CAAC,EAAE,sDAAsD;IAC7E,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF,+EAA+E;AAC/E,SAAS,WAAW,CAAC,MAAiB;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC;QACP,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;YACtB,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC;SACtB,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,KAAK,GAAG,SAAoC,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;IACjC,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,WAAW,CAAC,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAE/D,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAE7B,6EAA6E;QAC7E,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/E,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,WAAW,CAAC,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAE/D,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAE7B,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/E,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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.
|
|
1
|
+
export declare const SDK_VERSION = "0.10.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,
|
|
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
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
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.
|
|
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": "
|
|
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.
|
|
27
|
-
"@traffical/core-io": "0.6.
|
|
26
|
+
"@traffical/core": "0.11.0",
|
|
27
|
+
"@traffical/core-io": "0.6.1"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/bun": "latest",
|