@qoretechnologies/reqraft 0.10.56 → 0.10.57-pr.127.g0edd18d
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/.claude/CLAUDE.md +1 -0
- package/README.md +20 -0
- package/design/TRACKING.md +278 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/browser/attach.d.ts +8 -0
- package/dist/tracking/browser/attach.d.ts.map +1 -0
- package/dist/tracking/browser/attach.js +182 -0
- package/dist/tracking/browser/attach.js.map +1 -0
- package/dist/tracking/browser/env.d.ts +14 -0
- package/dist/tracking/browser/env.d.ts.map +1 -0
- package/dist/tracking/browser/env.js +150 -0
- package/dist/tracking/browser/env.js.map +1 -0
- package/dist/tracking/core/consent.d.ts +21 -0
- package/dist/tracking/core/consent.d.ts.map +1 -0
- package/dist/tracking/core/consent.js +39 -0
- package/dist/tracking/core/consent.js.map +1 -0
- package/dist/tracking/core/engagement.d.ts +20 -0
- package/dist/tracking/core/engagement.d.ts.map +1 -0
- package/dist/tracking/core/engagement.js +52 -0
- package/dist/tracking/core/engagement.js.map +1 -0
- package/dist/tracking/core/experiments.d.ts +109 -0
- package/dist/tracking/core/experiments.d.ts.map +1 -0
- package/dist/tracking/core/experiments.js +294 -0
- package/dist/tracking/core/experiments.js.map +1 -0
- package/dist/tracking/core/hash.d.ts +16 -0
- package/dist/tracking/core/hash.d.ts.map +1 -0
- package/dist/tracking/core/hash.js +31 -0
- package/dist/tracking/core/hash.js.map +1 -0
- package/dist/tracking/core/ids.d.ts +6 -0
- package/dist/tracking/core/ids.d.ts.map +1 -0
- package/dist/tracking/core/ids.js +31 -0
- package/dist/tracking/core/ids.js.map +1 -0
- package/dist/tracking/core/observable.d.ts +12 -0
- package/dist/tracking/core/observable.d.ts.map +1 -0
- package/dist/tracking/core/observable.js +32 -0
- package/dist/tracking/core/observable.js.map +1 -0
- package/dist/tracking/core/queue.d.ts +47 -0
- package/dist/tracking/core/queue.d.ts.map +1 -0
- package/dist/tracking/core/queue.js +205 -0
- package/dist/tracking/core/queue.js.map +1 -0
- package/dist/tracking/core/sections.d.ts +54 -0
- package/dist/tracking/core/sections.d.ts.map +1 -0
- package/dist/tracking/core/sections.js +156 -0
- package/dist/tracking/core/sections.js.map +1 -0
- package/dist/tracking/core/storage.d.ts +15 -0
- package/dist/tracking/core/storage.d.ts.map +1 -0
- package/dist/tracking/core/storage.js +72 -0
- package/dist/tracking/core/storage.js.map +1 -0
- package/dist/tracking/core/tracker.d.ts +122 -0
- package/dist/tracking/core/tracker.d.ts.map +1 -0
- package/dist/tracking/core/tracker.js +390 -0
- package/dist/tracking/core/tracker.js.map +1 -0
- package/dist/tracking/core/types.d.ts +130 -0
- package/dist/tracking/core/types.d.ts.map +1 -0
- package/dist/tracking/core/types.js +69 -0
- package/dist/tracking/core/types.js.map +1 -0
- package/dist/tracking/core/utm.d.ts +6 -0
- package/dist/tracking/core/utm.d.ts.map +1 -0
- package/dist/tracking/core/utm.js +30 -0
- package/dist/tracking/core/utm.js.map +1 -0
- package/dist/tracking/index.d.ts +46 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +91 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/markup.d.ts +12 -0
- package/dist/tracking/markup.d.ts.map +1 -0
- package/dist/tracking/markup.js +19 -0
- package/dist/tracking/markup.js.map +1 -0
- package/dist/tracking/react/Experiment.d.ts +23 -0
- package/dist/tracking/react/Experiment.d.ts.map +1 -0
- package/dist/tracking/react/Experiment.js +28 -0
- package/dist/tracking/react/Experiment.js.map +1 -0
- package/dist/tracking/react/TrackingProvider.d.ts +26 -0
- package/dist/tracking/react/TrackingProvider.d.ts.map +1 -0
- package/dist/tracking/react/TrackingProvider.js +45 -0
- package/dist/tracking/react/TrackingProvider.js.map +1 -0
- package/dist/tracking/react/hooks.d.ts +39 -0
- package/dist/tracking/react/hooks.d.ts.map +1 -0
- package/dist/tracking/react/hooks.js +96 -0
- package/dist/tracking/react/hooks.js.map +1 -0
- package/dist/tracking/react/index.d.ts +7 -0
- package/dist/tracking/react/index.d.ts.map +1 -0
- package/dist/tracking/react/index.js +17 -0
- package/dist/tracking/react/index.js.map +1 -0
- package/dist/tracking/testing.d.ts +40 -0
- package/dist/tracking/testing.d.ts.map +1 -0
- package/dist/tracking/testing.js +140 -0
- package/dist/tracking/testing.js.map +1 -0
- package/dist/tracking/ui/ExperimentCard.d.ts +47 -0
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentCard.js +305 -0
- package/dist/tracking/ui/ExperimentCard.js.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts +53 -0
- package/dist/tracking/ui/ExperimentsOverlay.d.ts.map +1 -0
- package/dist/tracking/ui/ExperimentsOverlay.js +359 -0
- package/dist/tracking/ui/ExperimentsOverlay.js.map +1 -0
- package/dist/tracking/ui/anchor.d.ts +107 -0
- package/dist/tracking/ui/anchor.d.ts.map +1 -0
- package/dist/tracking/ui/anchor.js +108 -0
- package/dist/tracking/ui/anchor.js.map +1 -0
- package/dist/tracking/ui/card.d.ts +87 -0
- package/dist/tracking/ui/card.d.ts.map +1 -0
- package/dist/tracking/ui/card.js +287 -0
- package/dist/tracking/ui/card.js.map +1 -0
- package/dist/tracking/ui/client.d.ts +42 -0
- package/dist/tracking/ui/client.d.ts.map +1 -0
- package/dist/tracking/ui/client.js +123 -0
- package/dist/tracking/ui/client.js.map +1 -0
- package/dist/tracking/ui/index.d.ts +20 -0
- package/dist/tracking/ui/index.d.ts.map +1 -0
- package/dist/tracking/ui/index.js +54 -0
- package/dist/tracking/ui/index.js.map +1 -0
- package/dist/tracking/ui/types.d.ts +111 -0
- package/dist/tracking/ui/types.d.ts.map +1 -0
- package/dist/tracking/ui/types.js +8 -0
- package/dist/tracking/ui/types.js.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts +31 -0
- package/dist/tracking/ui/useExperimentsAdmin.d.ts.map +1 -0
- package/dist/tracking/ui/useExperimentsAdmin.js +136 -0
- package/dist/tracking/ui/useExperimentsAdmin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.tsx +5 -0
- package/src/stories/tracking.tsx +197 -0
- package/src/tracking/browser/attach.ts +186 -0
- package/src/tracking/browser/env.ts +78 -0
- package/src/tracking/core/consent.ts +37 -0
- package/src/tracking/core/engagement.ts +47 -0
- package/src/tracking/core/experiments.ts +258 -0
- package/src/tracking/core/hash.ts +26 -0
- package/src/tracking/core/ids.ts +25 -0
- package/src/tracking/core/observable.ts +23 -0
- package/src/tracking/core/queue.ts +131 -0
- package/src/tracking/core/sections.ts +166 -0
- package/src/tracking/core/storage.ts +69 -0
- package/src/tracking/core/tracker.ts +417 -0
- package/src/tracking/core/types.ts +162 -0
- package/src/tracking/core/utm.ts +23 -0
- package/src/tracking/index.ts +72 -0
- package/src/tracking/markup.ts +17 -0
- package/src/tracking/react/Experiment.stories.tsx +174 -0
- package/src/tracking/react/Experiment.tsx +44 -0
- package/src/tracking/react/TrackingProvider.tsx +56 -0
- package/src/tracking/react/hooks.ts +106 -0
- package/src/tracking/react/index.ts +13 -0
- package/src/tracking/testing.ts +108 -0
- package/src/tracking/ui/ExperimentCard.stories.tsx +236 -0
- package/src/tracking/ui/ExperimentCard.tsx +491 -0
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +148 -0
- package/src/tracking/ui/ExperimentsOverlay.tsx +423 -0
- package/src/tracking/ui/anchor.ts +180 -0
- package/src/tracking/ui/card.ts +323 -0
- package/src/tracking/ui/client.ts +117 -0
- package/src/tracking/ui/index.ts +71 -0
- package/src/tracking/ui/types.ts +104 -0
- package/src/tracking/ui/useExperimentsAdmin.ts +103 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.ExperimentStore = exports.normaliseDefinition = exports.parsePreview = exports.DEFAULT_PREVIEW_PARAM = exports.assign = exports.pathMatches = exports.bucketRanges = exports.controlOf = void 0;
|
|
51
|
+
var hash_1 = require("./hash");
|
|
52
|
+
var observable_1 = require("./observable");
|
|
53
|
+
var storage_1 = require("./storage");
|
|
54
|
+
var types_1 = require("./types");
|
|
55
|
+
var controlOf = function (variants, fallback) {
|
|
56
|
+
var _a, _b, _c;
|
|
57
|
+
if (fallback === void 0) { fallback = 'a'; }
|
|
58
|
+
return (_c = (_b = ((_a = variants.find(function (v) { return v.control; })) !== null && _a !== void 0 ? _a : variants[0])) === null || _b === void 0 ? void 0 : _b.key) !== null && _c !== void 0 ? _c : fallback;
|
|
59
|
+
};
|
|
60
|
+
exports.controlOf = controlOf;
|
|
61
|
+
/**
|
|
62
|
+
* GrowthBook's bucket ranges: variant i owns `[c_i, c_i + traffic * w_i)` where
|
|
63
|
+
* `c_i` is the sum of the weights before it. The enrolled share equals `traffic`,
|
|
64
|
+
* and raising `traffic` later never moves an enrolled visitor to another variant.
|
|
65
|
+
* Weights that do not add up to 1 are normalised.
|
|
66
|
+
*/
|
|
67
|
+
var bucketRanges = function (weights, traffic) {
|
|
68
|
+
var cover = Math.min(1, Math.max(0, Number.isFinite(traffic) ? traffic : 0));
|
|
69
|
+
var clean = weights.map(function (w) { return (Number.isFinite(w) && w > 0 ? w : 0); });
|
|
70
|
+
var sum = clean.reduce(function (a, b) { return a + b; }, 0);
|
|
71
|
+
var norm = sum > 0 ? clean.map(function (w) { return w / sum; }) : clean.map(function () { return 1 / clean.length; });
|
|
72
|
+
var cumulative = 0;
|
|
73
|
+
return norm.map(function (w) {
|
|
74
|
+
var start = cumulative;
|
|
75
|
+
cumulative += w;
|
|
76
|
+
return [start, start + cover * w];
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
exports.bucketRanges = bucketRanges;
|
|
80
|
+
/** `/` matches `/` only; `/blog/*` matches `/blog/` and everything under it. */
|
|
81
|
+
var pathMatches = function (patterns, path) {
|
|
82
|
+
if (!patterns || !patterns.length)
|
|
83
|
+
return true;
|
|
84
|
+
var clean = path.split(/[?#]/)[0] || '/';
|
|
85
|
+
return patterns.some(function (p) { return (p.endsWith('*') ? clean.startsWith(p.slice(0, -1)) : clean === p || clean === "".concat(p, "/")); });
|
|
86
|
+
};
|
|
87
|
+
exports.pathMatches = pathMatches;
|
|
88
|
+
var targeted = function (def, ctx) {
|
|
89
|
+
var t = def.targeting;
|
|
90
|
+
if (!t)
|
|
91
|
+
return true;
|
|
92
|
+
if (!(0, exports.pathMatches)(t.paths, ctx.path))
|
|
93
|
+
return false;
|
|
94
|
+
if (t.device && ctx.device && t.device !== ctx.device)
|
|
95
|
+
return false;
|
|
96
|
+
if (t.lang && ctx.lang && !ctx.lang.toLowerCase().startsWith(t.lang.toLowerCase()))
|
|
97
|
+
return false;
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
/** Pure assignment of one visitor to one experiment. */
|
|
101
|
+
var assign = function (def, vid, ctx) {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
var control = (0, exports.controlOf)(def.variants);
|
|
104
|
+
var trigger = (_b = (_a = def.trigger) === null || _a === void 0 ? void 0 : _a.section) !== null && _b !== void 0 ? _b : null;
|
|
105
|
+
var base = { key: def.key, variant: control, enrolled: false, trigger: trigger };
|
|
106
|
+
if (def.status === 'concluded')
|
|
107
|
+
return __assign(__assign({}, base), { variant: def.winner || control, reason: 'concluded' });
|
|
108
|
+
if (!vid)
|
|
109
|
+
return __assign(__assign({}, base), { reason: 'no-consent' });
|
|
110
|
+
if (!def.variants.length)
|
|
111
|
+
return __assign(__assign({}, base), { reason: 'not-running' });
|
|
112
|
+
if (!targeted(def, ctx))
|
|
113
|
+
return __assign(__assign({}, base), { reason: 'not-targeted' });
|
|
114
|
+
var n = (0, hash_1.hashV2)(def.key, vid);
|
|
115
|
+
var ranges = (0, exports.bucketRanges)(def.variants.map(function (v) { return v.weight; }), def.traffic);
|
|
116
|
+
var i = ranges.findIndex(function (_a) {
|
|
117
|
+
var from = _a[0], to = _a[1];
|
|
118
|
+
return n >= from && n < to;
|
|
119
|
+
});
|
|
120
|
+
if (i < 0)
|
|
121
|
+
return __assign(__assign({}, base), { reason: 'not-enrolled' });
|
|
122
|
+
return __assign(__assign({}, base), { variant: def.variants[i].key, enrolled: true, reason: 'assigned' });
|
|
123
|
+
};
|
|
124
|
+
exports.assign = assign;
|
|
125
|
+
/** The default preview query parameter. */
|
|
126
|
+
exports.DEFAULT_PREVIEW_PARAM = 'qa_variant';
|
|
127
|
+
/**
|
|
128
|
+
* `?qa_variant=signup-cta:b,other:a` → `{ 'signup-cta': 'b', other: 'a' }`.
|
|
129
|
+
* `?qa_variant=clear` (or `off`) → `{}` and clears the saved preview.
|
|
130
|
+
* Returns null when the parameter is absent. `param` names the query parameter.
|
|
131
|
+
*/
|
|
132
|
+
var parsePreview = function (search, param) {
|
|
133
|
+
if (param === void 0) { param = exports.DEFAULT_PREVIEW_PARAM; }
|
|
134
|
+
var raw = null;
|
|
135
|
+
try {
|
|
136
|
+
raw = new URLSearchParams(search).get(param);
|
|
137
|
+
}
|
|
138
|
+
catch (_a) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
if (raw == null)
|
|
142
|
+
return null;
|
|
143
|
+
var out = {};
|
|
144
|
+
if (raw === 'clear' || raw === 'off')
|
|
145
|
+
return out;
|
|
146
|
+
raw.split(',').forEach(function (pair) {
|
|
147
|
+
var _a = pair.split(':').map(function (s) { return s === null || s === void 0 ? void 0 : s.trim(); }), k = _a[0], v = _a[1];
|
|
148
|
+
if (k && v && /^[\w.-]{1,80}$/.test(k) && /^[\w.-]{1,40}$/.test(v))
|
|
149
|
+
out[k] = v;
|
|
150
|
+
});
|
|
151
|
+
return out;
|
|
152
|
+
};
|
|
153
|
+
exports.parsePreview = parsePreview;
|
|
154
|
+
/** Cached definitions are used for a flicker-free first render for up to a day, then refreshed. */
|
|
155
|
+
var CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
156
|
+
var FETCH_TIMEOUT_MS = 4000;
|
|
157
|
+
/** A usable entry, normalised (a concluded entry gets `variants: []`); null for junk. */
|
|
158
|
+
var normaliseDefinition = function (x) {
|
|
159
|
+
var _a;
|
|
160
|
+
var d = x;
|
|
161
|
+
if (!d || typeof d.key !== 'string')
|
|
162
|
+
return null;
|
|
163
|
+
if (d.status === 'concluded')
|
|
164
|
+
return typeof d.winner === 'string' && d.winner ? __assign(__assign({}, d), { variants: (_a = d.variants) !== null && _a !== void 0 ? _a : [] }) : null;
|
|
165
|
+
if (d.status && d.status !== 'running')
|
|
166
|
+
return null;
|
|
167
|
+
var ok = Array.isArray(d.variants) && d.variants.every(function (v) { return v && typeof v.key === 'string' && typeof v.weight === 'number'; });
|
|
168
|
+
return ok ? d : null;
|
|
169
|
+
};
|
|
170
|
+
exports.normaliseDefinition = normaliseDefinition;
|
|
171
|
+
/** Holds the running experiments and the preview overrides. */
|
|
172
|
+
var ExperimentStore = /** @class */ (function () {
|
|
173
|
+
function ExperimentStore(d) {
|
|
174
|
+
var _this = this;
|
|
175
|
+
var _a, _b, _c;
|
|
176
|
+
this.d = d;
|
|
177
|
+
this.status = new observable_1.Observable('idle');
|
|
178
|
+
/**
|
|
179
|
+
* Bumped by `refresh()` (an editor, after it accepted a winner or removed a version): mounted
|
|
180
|
+
* experiments decide again, so an accepted test shows its winner at once. Visitors never
|
|
181
|
+
* trigger it, so their variant stays fixed for the page view.
|
|
182
|
+
*/
|
|
183
|
+
this.revision = new observable_1.Observable(0);
|
|
184
|
+
this.definitions = new Map();
|
|
185
|
+
/** The in-app switch first, then a preview link. */
|
|
186
|
+
this.previewOf = function (key) { var _a; return (_a = _this.editorOverrides.get()[key]) !== null && _a !== void 0 ? _a : _this.preview[key]; };
|
|
187
|
+
this.editorOverrideOf = function (key) { return _this.editorOverrides.get()[key]; };
|
|
188
|
+
this.keys = (_a = d.keys) !== null && _a !== void 0 ? _a : types_1.KEYS;
|
|
189
|
+
this.preview = (_b = (0, storage_1.readJson)(d.session, this.keys.preview)) !== null && _b !== void 0 ? _b : {};
|
|
190
|
+
this.editorOverrides = new observable_1.Observable((_c = (0, storage_1.readJson)(d.local, this.keys.editorVariants)) !== null && _c !== void 0 ? _c : {});
|
|
191
|
+
var cache = (0, storage_1.readJson)(d.local, this.keys.experimentsCache);
|
|
192
|
+
if (cache && cache.property === d.property && d.now() - cache.at < CACHE_MAX_AGE_MS && Array.isArray(cache.experiments)) {
|
|
193
|
+
this.setDefinitions(cache.experiments);
|
|
194
|
+
this.status.set('ready');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Reads the preview parameter (`?qa_variant=`) from the URL; the preview sticks for the browser session. */
|
|
198
|
+
ExperimentStore.prototype.applyPreviewFrom = function (search) {
|
|
199
|
+
var _a;
|
|
200
|
+
var parsed = (0, exports.parsePreview)(search, (_a = this.d.previewParam) !== null && _a !== void 0 ? _a : exports.DEFAULT_PREVIEW_PARAM);
|
|
201
|
+
if (!parsed)
|
|
202
|
+
return;
|
|
203
|
+
this.preview = Object.keys(parsed).length ? __assign(__assign({}, this.preview), parsed) : {};
|
|
204
|
+
if (Object.keys(this.preview).length)
|
|
205
|
+
(0, storage_1.writeJson)(this.d.session, this.keys.preview, this.preview);
|
|
206
|
+
else
|
|
207
|
+
this.d.session.remove(this.keys.preview);
|
|
208
|
+
};
|
|
209
|
+
/** The in-app version switch for one experiment; `null` goes back to the visitor's own variant. */
|
|
210
|
+
ExperimentStore.prototype.setEditorOverride = function (key, variant) {
|
|
211
|
+
var next = __assign({}, this.editorOverrides.get());
|
|
212
|
+
if (variant)
|
|
213
|
+
next[key] = variant;
|
|
214
|
+
else
|
|
215
|
+
delete next[key];
|
|
216
|
+
if (Object.keys(next).length)
|
|
217
|
+
(0, storage_1.writeJson)(this.d.local, this.keys.editorVariants, next);
|
|
218
|
+
else
|
|
219
|
+
this.d.local.remove(this.keys.editorVariants);
|
|
220
|
+
this.editorOverrides.set(next);
|
|
221
|
+
};
|
|
222
|
+
/** Re-reads the switches (another window of the same app changed them). */
|
|
223
|
+
ExperimentStore.prototype.reloadEditorOverrides = function () {
|
|
224
|
+
var _a;
|
|
225
|
+
var stored = (_a = (0, storage_1.readJson)(this.d.local, this.keys.editorVariants)) !== null && _a !== void 0 ? _a : {};
|
|
226
|
+
if (JSON.stringify(stored) !== JSON.stringify(this.editorOverrides.get()))
|
|
227
|
+
this.editorOverrides.set(stored);
|
|
228
|
+
};
|
|
229
|
+
/** Loads the definitions again and makes mounted experiments decide again (for an editor, never for visitors). */
|
|
230
|
+
ExperimentStore.prototype.refresh = function () {
|
|
231
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
232
|
+
return __generator(this, function (_a) {
|
|
233
|
+
switch (_a.label) {
|
|
234
|
+
case 0: return [4 /*yield*/, this.load(true)];
|
|
235
|
+
case 1:
|
|
236
|
+
_a.sent();
|
|
237
|
+
this.revision.set(this.revision.get() + 1);
|
|
238
|
+
return [2 /*return*/];
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
ExperimentStore.prototype.setDefinitions = function (list) {
|
|
244
|
+
this.definitions = new Map(list.map(exports.normaliseDefinition).filter(function (d) { return !!d; }).map(function (d) { return [d.key, d]; }));
|
|
245
|
+
};
|
|
246
|
+
ExperimentStore.prototype.get = function (key) {
|
|
247
|
+
return this.definitions.get(key);
|
|
248
|
+
};
|
|
249
|
+
/** Fetches the running experiments; a missing endpoint leaves everyone on the control. */
|
|
250
|
+
ExperimentStore.prototype.load = function () {
|
|
251
|
+
return __awaiter(this, arguments, void 0, function (force) {
|
|
252
|
+
var hadCache, sep, body, list, _a;
|
|
253
|
+
var _b;
|
|
254
|
+
if (force === void 0) { force = false; }
|
|
255
|
+
return __generator(this, function (_c) {
|
|
256
|
+
switch (_c.label) {
|
|
257
|
+
case 0:
|
|
258
|
+
if (this.status.get() === 'loading' && !force)
|
|
259
|
+
return [2 /*return*/];
|
|
260
|
+
hadCache = this.status.get() === 'ready';
|
|
261
|
+
if (!hadCache)
|
|
262
|
+
this.status.set('loading');
|
|
263
|
+
_c.label = 1;
|
|
264
|
+
case 1:
|
|
265
|
+
_c.trys.push([1, 3, , 4]);
|
|
266
|
+
sep = this.d.endpoint.includes('?') ? '&' : '?';
|
|
267
|
+
return [4 /*yield*/, this.d.fetchJson("".concat(this.d.endpoint).concat(sep, "property=").concat(encodeURIComponent(this.d.property)), FETCH_TIMEOUT_MS)];
|
|
268
|
+
case 2:
|
|
269
|
+
body = _c.sent();
|
|
270
|
+
list = Array.isArray(body) ? body : ((_b = body === null || body === void 0 ? void 0 : body.experiments) !== null && _b !== void 0 ? _b : null);
|
|
271
|
+
if (!Array.isArray(list))
|
|
272
|
+
throw new Error('unexpected experiments payload');
|
|
273
|
+
this.setDefinitions(list);
|
|
274
|
+
(0, storage_1.writeJson)(this.d.local, this.keys.experimentsCache, {
|
|
275
|
+
at: this.d.now(),
|
|
276
|
+
property: this.d.property,
|
|
277
|
+
experiments: Array.from(this.definitions.values()),
|
|
278
|
+
});
|
|
279
|
+
this.status.set('ready');
|
|
280
|
+
return [3 /*break*/, 4];
|
|
281
|
+
case 3:
|
|
282
|
+
_a = _c.sent();
|
|
283
|
+
if (!hadCache)
|
|
284
|
+
this.status.set('failed');
|
|
285
|
+
return [3 /*break*/, 4];
|
|
286
|
+
case 4: return [2 /*return*/];
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
return ExperimentStore;
|
|
292
|
+
}());
|
|
293
|
+
exports.ExperimentStore = ExperimentStore;
|
|
294
|
+
//# sourceMappingURL=experiments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experiments.js","sourceRoot":"","sources":["../../../src/tracking/core/experiments.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAAgC;AAChC,2CAA0C;AAC1C,qCAA+D;AAC/D,iCAAuG;AAwChG,IAAM,SAAS,GAAG,UAAC,QAA8B,EAAE,QAAc;;IAAd,yBAAA,EAAA,cAAc;IACtE,OAAA,MAAA,MAAA,CAAC,MAAA,QAAQ,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,OAAO,EAAT,CAAS,CAAC,mCAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,0CAAE,GAAG,mCAAI,QAAQ,CAAA;CAAA,CAAC;AADvD,QAAA,SAAS,aAC8C;AAEpE;;;;;GAKG;AACI,IAAM,YAAY,GAAG,UAAC,OAAiB,EAAE,OAAe;IAC7D,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAArC,CAAqC,CAAC,CAAC;IACxE,IAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,GAAG,GAAG,EAAP,CAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,cAAM,OAAA,CAAC,GAAG,KAAK,CAAC,MAAM,EAAhB,CAAgB,CAAC,CAAC;IACrF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAC,CAAC;QAChB,IAAM,KAAK,GAAG,UAAU,CAAC;QACzB,UAAU,IAAI,CAAC,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,YAAY,gBAWvB;AAEF,gFAAgF;AACzE,IAAM,WAAW,GAAG,UAAC,QAAqC,EAAE,IAAY;IAC7E,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAC3C,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,UAAG,CAAC,MAAG,CAAC,EAAvF,CAAuF,CAAC,CAAC;AACvH,CAAC,CAAC;AAJW,QAAA,WAAW,eAItB;AAEF,IAAM,QAAQ,GAAG,UAAC,GAA0B,EAAE,GAAmB;IAC/D,IAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,IAAA,mBAAW,EAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACjG,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wDAAwD;AACjD,IAAM,MAAM,GAAG,UAAC,GAA0B,EAAE,GAAkB,EAAE,GAAmB;;IACxF,IAAM,OAAO,GAAG,IAAA,iBAAS,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAM,OAAO,GAAG,MAAA,MAAA,GAAG,CAAC,OAAO,0CAAE,OAAO,mCAAI,IAAI,CAAC;IAC7C,IAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,SAAA,EAAE,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;QAAE,6BAAY,IAAI,KAAE,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,EAAE,WAAW,IAAG;IACxG,IAAI,CAAC,GAAG;QAAE,6BAAY,IAAI,KAAE,MAAM,EAAE,YAAY,IAAG;IACnD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM;QAAE,6BAAY,IAAI,KAAE,MAAM,EAAE,aAAa,IAAG;IACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,6BAAY,IAAI,KAAE,MAAM,EAAE,cAAc,IAAG;IACpE,IAAM,CAAC,GAAG,IAAA,aAAM,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAM,MAAM,GAAG,IAAA,oBAAY,EACzB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,MAAM,EAAR,CAAQ,CAAC,EACjC,GAAG,CAAC,OAAO,CACZ,CAAC;IACF,IAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,UAAC,EAAU;YAAT,IAAI,QAAA,EAAE,EAAE,QAAA;QAAM,OAAA,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;IAAnB,CAAmB,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC;QAAE,6BAAY,IAAI,KAAE,MAAM,EAAE,cAAc,IAAG;IACtD,6BAAY,IAAI,KAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,IAAG;AACvF,CAAC,CAAC;AAhBW,QAAA,MAAM,UAgBjB;AAEF,2CAA2C;AAC9B,QAAA,qBAAqB,GAAG,YAAY,CAAC;AAElD;;;;GAIG;AACI,IAAM,YAAY,GAAG,UAAC,MAAc,EAAE,KAAqC;IAArC,sBAAA,EAAA,QAAgB,6BAAqB;IAChF,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IACjD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAC,IAAI;QACpB,IAAA,KAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,EAAE,EAAT,CAAS,CAAC,EAA7C,CAAC,QAAA,EAAE,CAAC,QAAyC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAfW,QAAA,YAAY,gBAevB;AAUF,mGAAmG;AACnG,IAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,IAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,yFAAyF;AAClF,IAAM,mBAAmB,GAAG,UAAC,CAAU;;IAC5C,IAAM,CAAC,GAAG,CAA0B,CAAC;IACrC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,uBAAM,CAAC,KAAE,QAAQ,EAAE,MAAA,CAAC,CAAC,QAAQ,mCAAI,EAAE,IAAG,CAAC,CAAC,IAAI,CAAC;IAC5H,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpD,IAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAA9D,CAA8D,CAAC,CAAC;IAChI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvB,CAAC,CAAC;AAPW,QAAA,mBAAmB,uBAO9B;AAeF,+DAA+D;AAC/D;IAkBE,yBAA6B,CAAmB;QAAhD,iBASC;;QAT4B,MAAC,GAAD,CAAC,CAAkB;QAjBvC,WAAM,GAAG,IAAI,uBAAU,CAAqB,MAAM,CAAC,CAAC;QAO7D;;;;WAIG;QACM,aAAQ,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACtC,gBAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;QAwB/D,oDAAoD;QACpD,cAAS,GAAG,UAAC,GAAW,YAAyB,OAAA,MAAA,KAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mCAAI,KAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,EAAA,CAAC;QAEtG,qBAAgB,GAAG,UAAC,GAAW,IAAyB,OAAA,KAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAA/B,CAA+B,CAAC;QAtBtF,IAAI,CAAC,IAAI,GAAG,MAAA,CAAC,CAAC,IAAI,mCAAI,YAAI,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAA,IAAA,kBAAQ,EAAyB,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC;QACpF,IAAI,CAAC,eAAe,GAAG,IAAI,uBAAU,CAAyB,MAAA,IAAA,kBAAQ,EAAyB,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAI,EAAE,CAAC,CAAC;QACzI,IAAM,KAAK,GAAG,IAAA,kBAAQ,EAAS,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACxH,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,6GAA6G;IAC7G,0CAAgB,GAAhB,UAAiB,MAAc;;QAC7B,IAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,MAAM,EAAE,MAAA,IAAI,CAAC,CAAC,CAAC,YAAY,mCAAI,6BAAqB,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,uBAAM,IAAI,CAAC,OAAO,GAAK,MAAM,EAAG,CAAC,CAAC,EAAE,CAAC;QAChF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;YAAE,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;YAC5F,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAOD,mGAAmG;IACnG,2CAAiB,GAAjB,UAAkB,GAAW,EAAE,OAAsB;QACnD,IAAM,IAAI,gBAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAE,CAAC;QAC/C,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;;YAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;;YACjF,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,2EAA2E;IAC3E,+CAAqB,GAArB;;QACE,IAAM,MAAM,GAAG,MAAA,IAAA,kBAAQ,EAAyB,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAI,EAAE,CAAC;QAC9F,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;YAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9G,CAAC;IAED,kHAAkH;IAC5G,iCAAO,GAAb;;;;4BACE,qBAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAA;;wBAArB,SAAqB,CAAC;wBACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;;;KAC5C;IAEO,wCAAc,GAAtB,UAAuB,IAAe;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CACxB,IAAI,CAAC,GAAG,CAAC,2BAAmB,CAAC,CAAC,MAAM,CAAC,UAAC,CAAC,IAAiC,OAAA,CAAC,CAAC,CAAC,EAAH,CAAG,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAV,CAAU,CAAC,CACpG,CAAC;IACJ,CAAC;IAED,6BAAG,GAAH,UAAI,GAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,0FAA0F;IACpF,8BAAI,GAAV;4DAAW,KAAa;;;YAAb,sBAAA,EAAA,aAAa;;;;wBACtB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,SAAS,IAAI,CAAC,KAAK;4BAAE,sBAAO;wBAChD,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC;wBAC/C,IAAI,CAAC,QAAQ;4BAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;;;;wBAElC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;wBACzC,qBAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,SAAG,GAAG,sBAAY,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAE,EAAE,gBAAgB,CAAC,EAAA;;wBAA1H,IAAI,GAAG,SAAmH;wBAC1H,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAC,IAA2C,aAA3C,IAAI,uBAAJ,IAAI,CAAyC,WAAW,mCAAI,IAAI,CAAC,CAAC;wBAC9G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;4BAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;wBAC5E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAC1B,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;4BAClD,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE;4BAChB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ;4BACzB,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;yBAClC,CAAC,CAAC;wBACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;;;;wBAEzB,IAAI,CAAC,QAAQ;4BAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;;;;;KAE5C;IACH,sBAAC;AAAD,CAAC,AAhGD,IAgGC;AAhGY,0CAAe"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic bucketing: GrowthBook's hash v2 (MIT), so assignments match what
|
|
3
|
+
* GrowthBook-compatible tooling (and the server, if it ever recomputes) gets.
|
|
4
|
+
*
|
|
5
|
+
* n = (fnv1a32(String(fnv1a32(seed + value))) % 10000) / 10000
|
|
6
|
+
*
|
|
7
|
+
* The inner hash is turned into its *decimal string* before it is hashed again —
|
|
8
|
+
* that is GrowthBook's definition (`hashFnv32a(hashFnv32a(seed + value) + "")`).
|
|
9
|
+
* Characters are hashed as UTF-16 code units (`charCodeAt`), like GrowthBook; for
|
|
10
|
+
* the ASCII ids and keys we use that equals FNV-1a over the bytes.
|
|
11
|
+
*/
|
|
12
|
+
/** FNV-1a, 32 bit. `fnv1a32('a') === 0xe40c292c` (the reference test vector). */
|
|
13
|
+
export declare const fnv1a32: (input: string) => number;
|
|
14
|
+
/** A number in [0, 1) with 4 decimals; the same inputs always give the same number. */
|
|
15
|
+
export declare const hashV2: (seed: string, value: string) => number;
|
|
16
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iFAAiF;AACjF,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MAQvC,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,MAAM,SAAU,MAAM,SAAS,MAAM,KAAG,MACK,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic bucketing: GrowthBook's hash v2 (MIT), so assignments match what
|
|
4
|
+
* GrowthBook-compatible tooling (and the server, if it ever recomputes) gets.
|
|
5
|
+
*
|
|
6
|
+
* n = (fnv1a32(String(fnv1a32(seed + value))) % 10000) / 10000
|
|
7
|
+
*
|
|
8
|
+
* The inner hash is turned into its *decimal string* before it is hashed again —
|
|
9
|
+
* that is GrowthBook's definition (`hashFnv32a(hashFnv32a(seed + value) + "")`).
|
|
10
|
+
* Characters are hashed as UTF-16 code units (`charCodeAt`), like GrowthBook; for
|
|
11
|
+
* the ASCII ids and keys we use that equals FNV-1a over the bytes.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.hashV2 = exports.fnv1a32 = void 0;
|
|
15
|
+
/** FNV-1a, 32 bit. `fnv1a32('a') === 0xe40c292c` (the reference test vector). */
|
|
16
|
+
var fnv1a32 = function (input) {
|
|
17
|
+
var h = 0x811c9dc5;
|
|
18
|
+
for (var i = 0; i < input.length; i++) {
|
|
19
|
+
h ^= input.charCodeAt(i);
|
|
20
|
+
// h *= 16777619 (the FNV prime) in 32-bit arithmetic, as shifts and adds.
|
|
21
|
+
h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);
|
|
22
|
+
}
|
|
23
|
+
return h >>> 0;
|
|
24
|
+
};
|
|
25
|
+
exports.fnv1a32 = fnv1a32;
|
|
26
|
+
/** A number in [0, 1) with 4 decimals; the same inputs always give the same number. */
|
|
27
|
+
var hashV2 = function (seed, value) {
|
|
28
|
+
return ((0, exports.fnv1a32)(String((0, exports.fnv1a32)(seed + value))) % 10000) / 10000;
|
|
29
|
+
};
|
|
30
|
+
exports.hashV2 = hashV2;
|
|
31
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/tracking/core/hash.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,iFAAiF;AAC1E,IAAM,OAAO,GAAG,UAAC,KAAa;IACnC,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,0EAA0E;QAC1E,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC;AARW,QAAA,OAAO,WAQlB;AAEF,uFAAuF;AAChF,IAAM,MAAM,GAAG,UAAC,IAAY,EAAE,KAAa;IAChD,OAAA,CAAC,IAAA,eAAO,EAAC,MAAM,CAAC,IAAA,eAAO,EAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;AAAxD,CAAwD,CAAC;AAD9C,QAAA,MAAM,UACwC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Random ids from the platform CSPRNG (never Math.random: ids must not collide or be guessable). */
|
|
2
|
+
/** `bytes` random bytes as base64url: 16 bytes = 128 bits = 22 characters. */
|
|
3
|
+
export declare const randomId: (bytes?: number) => string;
|
|
4
|
+
/** Event id (a UUID v4). */
|
|
5
|
+
export declare const eventId: () => string;
|
|
6
|
+
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/ids.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAQrG,8EAA8E;AAC9E,eAAO,MAAM,QAAQ,sBAAiB,MAIrC,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,OAAO,QAAO,MAQ1B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Random ids from the platform CSPRNG (never Math.random: ids must not collide or be guessable). */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.eventId = exports.randomId = void 0;
|
|
5
|
+
var toBase64Url = function (bytes) {
|
|
6
|
+
var bin = '';
|
|
7
|
+
bytes.forEach(function (b) { return (bin += String.fromCharCode(b)); });
|
|
8
|
+
return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
9
|
+
};
|
|
10
|
+
/** `bytes` random bytes as base64url: 16 bytes = 128 bits = 22 characters. */
|
|
11
|
+
var randomId = function (bytes) {
|
|
12
|
+
if (bytes === void 0) { bytes = 16; }
|
|
13
|
+
var buf = new Uint8Array(bytes);
|
|
14
|
+
globalThis.crypto.getRandomValues(buf);
|
|
15
|
+
return toBase64Url(buf);
|
|
16
|
+
};
|
|
17
|
+
exports.randomId = randomId;
|
|
18
|
+
/** Event id (a UUID v4). */
|
|
19
|
+
var eventId = function () {
|
|
20
|
+
var _a;
|
|
21
|
+
if (typeof ((_a = globalThis.crypto) === null || _a === void 0 ? void 0 : _a.randomUUID) === 'function')
|
|
22
|
+
return globalThis.crypto.randomUUID();
|
|
23
|
+
var b = new Uint8Array(16);
|
|
24
|
+
globalThis.crypto.getRandomValues(b);
|
|
25
|
+
b[6] = (b[6] & 0x0f) | 0x40;
|
|
26
|
+
b[8] = (b[8] & 0x3f) | 0x80;
|
|
27
|
+
var h = Array.from(b).map(function (x) { return x.toString(16).padStart(2, '0'); }).join('');
|
|
28
|
+
return "".concat(h.slice(0, 8), "-").concat(h.slice(8, 12), "-").concat(h.slice(12, 16), "-").concat(h.slice(16, 20), "-").concat(h.slice(20));
|
|
29
|
+
};
|
|
30
|
+
exports.eventId = eventId;
|
|
31
|
+
//# sourceMappingURL=ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../src/tracking/core/ids.ts"],"names":[],"mappings":";AAAA,qGAAqG;;;AAErG,IAAM,WAAW,GAAG,UAAC,KAAiB;IACpC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,CAAC,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAA/B,CAA+B,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,8EAA8E;AACvE,IAAM,QAAQ,GAAG,UAAC,KAAU;IAAV,sBAAA,EAAA,UAAU;IACjC,IAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AAJW,QAAA,QAAQ,YAInB;AAEF,4BAA4B;AACrB,IAAM,OAAO,GAAG;;IACrB,IAAI,OAAO,CAAA,MAAA,UAAU,CAAC,MAAM,0CAAE,UAAU,CAAA,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/F,IAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7B,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAA/B,CAA+B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,UAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,cAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,cAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAE,CAAC;AACnG,CAAC,CAAC;AARW,QAAA,OAAO,WAQlB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type TListener = () => void;
|
|
2
|
+
/** A tiny observable value (what React's `useSyncExternalStore` wants). */
|
|
3
|
+
export declare class Observable<T> {
|
|
4
|
+
private value;
|
|
5
|
+
private listeners;
|
|
6
|
+
constructor(value: T);
|
|
7
|
+
get: () => T;
|
|
8
|
+
set(next: T): void;
|
|
9
|
+
subscribe: (listener: TListener) => () => any;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=observable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/observable.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,IAAI,CAAC;AAE5B,2EAA2E;AAC3E,qBAAa,UAAU,CAAC,CAAC;IAEX,OAAO,CAAC,KAAK;IADzB,OAAO,CAAC,SAAS,CAAwB;gBACrB,KAAK,EAAE,CAAC;IAC5B,GAAG,QAAO,CAAC,CAAe;IAC1B,GAAG,CAAC,IAAI,EAAE,CAAC;IAWX,SAAS,aAAc,SAAS,eAG9B;CACH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Observable = void 0;
|
|
4
|
+
/** A tiny observable value (what React's `useSyncExternalStore` wants). */
|
|
5
|
+
var Observable = /** @class */ (function () {
|
|
6
|
+
function Observable(value) {
|
|
7
|
+
var _this = this;
|
|
8
|
+
this.value = value;
|
|
9
|
+
this.listeners = new Set();
|
|
10
|
+
this.get = function () { return _this.value; };
|
|
11
|
+
this.subscribe = function (listener) {
|
|
12
|
+
_this.listeners.add(listener);
|
|
13
|
+
return function () { return void _this.listeners.delete(listener); };
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
Observable.prototype.set = function (next) {
|
|
17
|
+
if (Object.is(next, this.value))
|
|
18
|
+
return;
|
|
19
|
+
this.value = next;
|
|
20
|
+
this.listeners.forEach(function (l) {
|
|
21
|
+
try {
|
|
22
|
+
l();
|
|
23
|
+
}
|
|
24
|
+
catch (_a) {
|
|
25
|
+
/* a listener never breaks the tracker */
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
return Observable;
|
|
30
|
+
}());
|
|
31
|
+
exports.Observable = Observable;
|
|
32
|
+
//# sourceMappingURL=observable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../src/tracking/core/observable.ts"],"names":[],"mappings":";;;AAEA,2EAA2E;AAC3E;IAEE,oBAAoB,KAAQ;QAA5B,iBAAgC;QAAZ,UAAK,GAAL,KAAK,CAAG;QADpB,cAAS,GAAG,IAAI,GAAG,EAAa,CAAC;QAEzC,QAAG,GAAG,cAAS,OAAA,KAAI,CAAC,KAAK,EAAV,CAAU,CAAC;QAY1B,cAAS,GAAG,UAAC,QAAmB;YAC9B,KAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,cAAM,OAAA,KAAK,KAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAApC,CAAoC,CAAC;QACpD,CAAC,CAAC;IAhB6B,CAAC;IAEhC,wBAAG,GAAH,UAAI,IAAO;QACT,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAC,CAAC;YACvB,IAAI,CAAC;gBACH,CAAC,EAAE,CAAC;YACN,CAAC;YAAC,WAAM,CAAC;gBACP,yCAAyC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAKH,iBAAC;AAAD,CAAC,AAnBD,IAmBC;AAnBY,gCAAU"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { IBatch, ITrackedEvent } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* How a batch leaves the page. `beacon` is used when the page is going away
|
|
4
|
+
* (`pagehide`, tab hidden): the browser delivers it after the page is gone.
|
|
5
|
+
* Resolves to `true` when the batch was handed over, `false` to keep it for later
|
|
6
|
+
* (network error), and never rejects.
|
|
7
|
+
*/
|
|
8
|
+
export interface ITransport {
|
|
9
|
+
send(body: string, mode: 'fetch' | 'beacon'): Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
/** Collector limits (§4): at most 100 events and 64 KB per batch. We stay under both. */
|
|
12
|
+
export declare const MAX_EVENTS_PER_BATCH = 100;
|
|
13
|
+
export declare const MAX_BATCH_BYTES: number;
|
|
14
|
+
/** Events kept while the collector is unreachable; the oldest are dropped past this. */
|
|
15
|
+
export declare const MAX_BACKLOG = 500;
|
|
16
|
+
export interface IQueueOptions {
|
|
17
|
+
flushIntervalMs: number;
|
|
18
|
+
maxQueued: number;
|
|
19
|
+
transport: ITransport;
|
|
20
|
+
/** The envelope for a batch; null → nothing may be sent (no consent) and the queue is dropped. */
|
|
21
|
+
envelope: () => Omit<IBatch, 'events' | 'sent_at'> | null;
|
|
22
|
+
now: () => number;
|
|
23
|
+
/** Timers are injected so tests can drive them. */
|
|
24
|
+
setTimer: (fn: () => void, ms: number) => unknown;
|
|
25
|
+
clearTimer: (handle: unknown) => void;
|
|
26
|
+
debug?: (batch: IBatch) => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Batches events: sends every `flushIntervalMs`, as soon as `maxQueued` are waiting,
|
|
30
|
+
* and immediately (as a beacon) when the page is going away.
|
|
31
|
+
*/
|
|
32
|
+
export declare class EventQueue {
|
|
33
|
+
private readonly o;
|
|
34
|
+
private events;
|
|
35
|
+
private timer;
|
|
36
|
+
private sending;
|
|
37
|
+
constructor(o: IQueueOptions);
|
|
38
|
+
get length(): number;
|
|
39
|
+
push(event: ITrackedEvent): void;
|
|
40
|
+
/** Forget everything unsent (consent withdrawn). */
|
|
41
|
+
clear(): void;
|
|
42
|
+
private schedule;
|
|
43
|
+
/** Splits `events` into batches that fit the collector's limits. */
|
|
44
|
+
static chunk(events: ITrackedEvent[], envelope: Omit<IBatch, 'events' | 'sent_at'>, sentAt: string): IBatch[];
|
|
45
|
+
flush(mode?: 'fetch' | 'beacon'): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/tracking/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,eAAe,QAAY,CAAC;AACzC,wFAAwF;AACxF,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,UAAU,CAAC;IACtB,kGAAkG;IAClG,QAAQ,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IAC1D,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,mDAAmD;IACnD,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAID;;;GAGG;AACH,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,CAAC;IAJ9B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEK,CAAC,EAAE,aAAa;IAE7C,IAAI,MAAM,WAET;IAED,IAAI,CAAC,KAAK,EAAE,aAAa;IAOzB,oDAAoD;IACpD,KAAK;IAML,OAAO,CAAC,QAAQ;IAQhB,oEAAoE;IACpE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBvG,KAAK,CAAC,IAAI,GAAE,OAAO,GAAG,QAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAyC/D"}
|