@mearl/plugin-tracking 0.0.0-stage → 3.0.0-beta.7
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/LICENSE +201 -0
- package/README.md +4 -2
- package/dist/capability/browser.cjs +406 -0
- package/dist/capability/bundle.json +38 -0
- package/dist/capability/node.cjs +410 -0
- package/dist/capability/preset.json +15 -0
- package/dist/eventParsers.d.ts +31 -0
- package/dist/eventParsers.js +409 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/runtime.d.ts +27 -0
- package/dist/runtime.js +17 -0
- package/package.json +41 -3
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/runtime.ts
|
|
21
|
+
var runtime_exports = {};
|
|
22
|
+
__export(runtime_exports, {
|
|
23
|
+
createTrackingPlugin: () => createTrackingPlugin,
|
|
24
|
+
default: () => createTrackingPlugin
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(runtime_exports);
|
|
27
|
+
|
|
28
|
+
// src/eventParsers.ts
|
|
29
|
+
var APLUS_URL_PATTERN = /\.mmstat\.com\//;
|
|
30
|
+
var RUM_URL_PATTERN = /\.rum\.aliyuncs\.com\//;
|
|
31
|
+
var ARMS_URL_PATTERN = /^arms-retcode\.aliyuncs\.com\//;
|
|
32
|
+
function trackingHostname(url) {
|
|
33
|
+
try {
|
|
34
|
+
const parsed = new URL(url);
|
|
35
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed.hostname : "";
|
|
36
|
+
} catch {
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function matchesTrackingHost(url, pattern) {
|
|
41
|
+
return pattern.test(`${trackingHostname(url)}/`);
|
|
42
|
+
}
|
|
43
|
+
function isTrackingUrl(url) {
|
|
44
|
+
const hostname = trackingHostname(url);
|
|
45
|
+
return matchesTrackingHost(url, APLUS_URL_PATTERN) || matchesTrackingHost(url, RUM_URL_PATTERN) || matchesTrackingHost(url, ARMS_URL_PATTERN) || /^(?:retcode\.alicdn\.com|beacon\.taobao\.com)$|(?:^|\.)tbsec\./i.test(hostname);
|
|
46
|
+
}
|
|
47
|
+
var aplusCounter = 0;
|
|
48
|
+
var armsCounter = 0;
|
|
49
|
+
var rumCounter = 0;
|
|
50
|
+
function formatTimestamp(ms) {
|
|
51
|
+
const d = new Date(ms);
|
|
52
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
53
|
+
return `${d.getFullYear()}/${pad(d.getMonth() + 1)}/${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
|
|
54
|
+
}
|
|
55
|
+
function parseParams(value) {
|
|
56
|
+
const params = {};
|
|
57
|
+
value.split("&").forEach((pair) => {
|
|
58
|
+
const eqIndex = pair.indexOf("=");
|
|
59
|
+
if (eqIndex === -1) return;
|
|
60
|
+
const rawKey = pair.slice(0, eqIndex);
|
|
61
|
+
const rawValue = pair.slice(eqIndex + 1);
|
|
62
|
+
try {
|
|
63
|
+
params[decodeURIComponent(rawKey)] = rawValue;
|
|
64
|
+
} catch {
|
|
65
|
+
params[rawKey] = rawValue;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return params;
|
|
69
|
+
}
|
|
70
|
+
function decodeParamValue(value) {
|
|
71
|
+
try {
|
|
72
|
+
return decodeURIComponent(value);
|
|
73
|
+
} catch {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function parseJsonParamValue(value) {
|
|
78
|
+
try {
|
|
79
|
+
return JSON.parse(value);
|
|
80
|
+
} catch {
|
|
81
|
+
const decoded = decodeParamValue(value);
|
|
82
|
+
if (decoded === value) return void 0;
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(decoded);
|
|
85
|
+
} catch {
|
|
86
|
+
return void 0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function parseUrlParams(search) {
|
|
91
|
+
const encodedParams = parseParams(search.startsWith("?") ? search.slice(1) : search);
|
|
92
|
+
return Object.fromEntries(
|
|
93
|
+
Object.entries(encodedParams).map(([key, value]) => [key, decodeParamValue(value)])
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function extractSpmFromUrl(spmOrUrl) {
|
|
97
|
+
if (!/^https?:\/\//i.test(spmOrUrl)) return spmOrUrl;
|
|
98
|
+
try {
|
|
99
|
+
return new URL(spmOrUrl).searchParams.get("spm") ?? spmOrUrl;
|
|
100
|
+
} catch {
|
|
101
|
+
return spmOrUrl;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function resolveAplusSpm(eventType, raw) {
|
|
105
|
+
const expdata = Array.isArray(raw.expdata) ? raw.expdata : [];
|
|
106
|
+
const expSpm = expdata[0]?.spm || "";
|
|
107
|
+
const gokeyParams = parseParams(raw.gokey || "");
|
|
108
|
+
const gokeySpm = decodeParamValue(gokeyParams.spm || "");
|
|
109
|
+
const rawSpmUrl = raw["spm-url"] || decodeParamValue(gokeyParams["spm-url"] || "");
|
|
110
|
+
const spmUrl = extractSpmFromUrl(rawSpmUrl);
|
|
111
|
+
let pointSpm;
|
|
112
|
+
switch (eventType) {
|
|
113
|
+
case "CLK":
|
|
114
|
+
pointSpm = gokeySpm || expSpm;
|
|
115
|
+
break;
|
|
116
|
+
case "EXP":
|
|
117
|
+
pointSpm = expSpm;
|
|
118
|
+
break;
|
|
119
|
+
case "PV":
|
|
120
|
+
pointSpm = spmUrl;
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
pointSpm = gokeySpm || expSpm;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
mainSpm: pointSpm,
|
|
127
|
+
highlightSpm: pointSpm
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function parseAplusRequest(url, options = {}) {
|
|
131
|
+
if (!matchesTrackingHost(url, APLUS_URL_PATTERN)) return null;
|
|
132
|
+
let urlObj;
|
|
133
|
+
try {
|
|
134
|
+
urlObj = new URL(url);
|
|
135
|
+
} catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const params = parseUrlParams(urlObj.search);
|
|
139
|
+
const gmkey = params.gmkey ?? "UNKNOWN";
|
|
140
|
+
const urlPathName = urlObj.pathname.slice(1);
|
|
141
|
+
const pathCategory = urlPathName.split(".")[1];
|
|
142
|
+
const eventType = pathCategory === "selfdefine" ? "SDF" : gmkey;
|
|
143
|
+
const gokeyRaw = params.gokey ?? "";
|
|
144
|
+
const gokeyParams = parseParams(gokeyRaw);
|
|
145
|
+
let expdata = [];
|
|
146
|
+
if (gokeyParams.expdata) {
|
|
147
|
+
const parsedExpdata = parseJsonParamValue(gokeyParams.expdata);
|
|
148
|
+
if (Array.isArray(parsedExpdata)) {
|
|
149
|
+
expdata = parsedExpdata.map((item) => {
|
|
150
|
+
if (!item?.exargs || typeof item.exargs !== "object") return item;
|
|
151
|
+
const decoded = {};
|
|
152
|
+
for (const [key, value] of Object.entries(item.exargs)) {
|
|
153
|
+
if (typeof value !== "string") {
|
|
154
|
+
decoded[key] = value;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const parsedValue = parseJsonParamValue(value);
|
|
158
|
+
decoded[key] = parsedValue === void 0 ? value : parsedValue;
|
|
159
|
+
}
|
|
160
|
+
return { ...item, exargs: decoded };
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const rawBizArgs = gokeyParams.bizArgs;
|
|
165
|
+
const parsedBizArgs = rawBizArgs === void 0 ? void 0 : parseJsonParamValue(rawBizArgs);
|
|
166
|
+
const bizArgs = parsedBizArgs === void 0 ? rawBizArgs : parsedBizArgs;
|
|
167
|
+
const pageUrl = params["_p_url"] ?? (gokeyParams["_p_url"] ? decodeParamValue(gokeyParams["_p_url"]) : "");
|
|
168
|
+
const { gokey: rawGokey, ...topLevelParams } = params;
|
|
169
|
+
const rawData = {
|
|
170
|
+
...topLevelParams,
|
|
171
|
+
_path: urlPathName,
|
|
172
|
+
_url: url,
|
|
173
|
+
gokey: rawGokey,
|
|
174
|
+
...expdata.length > 0 ? { expdata } : {},
|
|
175
|
+
...bizArgs !== void 0 ? { bizArgs } : {}
|
|
176
|
+
};
|
|
177
|
+
const spm = resolveAplusSpm(eventType, rawData).mainSpm;
|
|
178
|
+
const pathName = urlPathName.split(".").slice(1).join(".");
|
|
179
|
+
const eventName = eventType === "SDF" ? pathName : spm || pathName || pageUrl;
|
|
180
|
+
const now = options.now ?? Date.now();
|
|
181
|
+
const sequence = options.sequence ?? ++aplusCounter;
|
|
182
|
+
return {
|
|
183
|
+
id: `aplus-${sequence}-${now}`,
|
|
184
|
+
source: "aplus",
|
|
185
|
+
batchId: 0,
|
|
186
|
+
batchTimestampMs: now,
|
|
187
|
+
batchTimestamp: formatTimestamp(now),
|
|
188
|
+
event_type: eventType,
|
|
189
|
+
name: eventName,
|
|
190
|
+
url,
|
|
191
|
+
timestamp: now,
|
|
192
|
+
_raw: rawData,
|
|
193
|
+
_context: {
|
|
194
|
+
requestUrl: url,
|
|
195
|
+
app: {},
|
|
196
|
+
user: {
|
|
197
|
+
...params.uidaplus ? { uidaplus: params.uidaplus } : {},
|
|
198
|
+
...params["_gr_uid_"] ? { _gr_uid_: params["_gr_uid_"] } : {}
|
|
199
|
+
},
|
|
200
|
+
session: {},
|
|
201
|
+
view: {
|
|
202
|
+
...params["spm-url"] ? { "spm-url": params["spm-url"] } : {},
|
|
203
|
+
...params["spm-pre"] ? { "spm-pre": params["spm-pre"] } : {},
|
|
204
|
+
...params["spm-cnt"] ? { "spm-cnt": params["spm-cnt"] } : {},
|
|
205
|
+
...pageUrl ? { page_url: pageUrl } : {}
|
|
206
|
+
},
|
|
207
|
+
properties: {},
|
|
208
|
+
os: {},
|
|
209
|
+
net: {}
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
var RUM_TYPE_ALIAS = {
|
|
214
|
+
cst: "custom"
|
|
215
|
+
};
|
|
216
|
+
var I18N_TRACKER_TYPE_MAP = {
|
|
217
|
+
"i18n-tracker-exp": "EXP",
|
|
218
|
+
"i18n-tracker-clk": "CLK"
|
|
219
|
+
};
|
|
220
|
+
function parseRumBody(postData) {
|
|
221
|
+
if (!postData) return null;
|
|
222
|
+
if (typeof postData === "object") return postData;
|
|
223
|
+
try {
|
|
224
|
+
return JSON.parse(postData);
|
|
225
|
+
} catch {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function tryConvertI18nTracker(event, base) {
|
|
230
|
+
const normalizedType = RUM_TYPE_ALIAS[event.type] ?? event.type;
|
|
231
|
+
if (event.event_type !== "action" || normalizedType !== "custom") return null;
|
|
232
|
+
let snapshots;
|
|
233
|
+
try {
|
|
234
|
+
snapshots = typeof event.snapshots === "string" ? JSON.parse(event.snapshots) : event.snapshots;
|
|
235
|
+
} catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
if (!snapshots || typeof snapshots !== "object") return null;
|
|
239
|
+
const eventType = I18N_TRACKER_TYPE_MAP[snapshots.message];
|
|
240
|
+
if (!eventType) return null;
|
|
241
|
+
const spm = [snapshots.c1 ?? "", snapshots.c2 ?? ""].filter(Boolean).join(".");
|
|
242
|
+
const exargs = {};
|
|
243
|
+
if (typeof snapshots.c3 === "string") {
|
|
244
|
+
snapshots.c3.split("&").forEach((pair) => {
|
|
245
|
+
const eqIndex = pair.indexOf("=");
|
|
246
|
+
if (eqIndex === -1) return;
|
|
247
|
+
const key = pair.slice(0, eqIndex);
|
|
248
|
+
const rawValue = pair.slice(eqIndex + 1);
|
|
249
|
+
try {
|
|
250
|
+
exargs[key] = JSON.parse(decodeURIComponent(rawValue));
|
|
251
|
+
} catch {
|
|
252
|
+
exargs[key] = rawValue;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
const dataAttrs = snapshots.trackerInfo?.dataAttrs;
|
|
257
|
+
if (dataAttrs && typeof dataAttrs === "object" && dataAttrs["data-biz-args"] && !exargs.bizArgs) {
|
|
258
|
+
try {
|
|
259
|
+
exargs.bizArgs = JSON.parse(dataAttrs["data-biz-args"]);
|
|
260
|
+
} catch {
|
|
261
|
+
exargs.bizArgs = dataAttrs["data-biz-args"];
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...base,
|
|
266
|
+
event_type: eventType,
|
|
267
|
+
name: spm,
|
|
268
|
+
_raw: {
|
|
269
|
+
...event,
|
|
270
|
+
expdata: [
|
|
271
|
+
{
|
|
272
|
+
spm,
|
|
273
|
+
...Object.keys(exargs).length > 0 ? { exargs } : {}
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
"spm-url": spm
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function parseRumRequest(url, postData, options = {}) {
|
|
281
|
+
if (!matchesTrackingHost(url, RUM_URL_PATTERN)) return [];
|
|
282
|
+
const parsed = parseRumBody(postData);
|
|
283
|
+
const rawEvents = Array.isArray(parsed?.events) ? parsed.events : [];
|
|
284
|
+
if (rawEvents.length === 0) return [];
|
|
285
|
+
const now = options.now ?? Date.now();
|
|
286
|
+
const batchId = options.sequence ?? ++rumCounter;
|
|
287
|
+
const context = {
|
|
288
|
+
requestUrl: url,
|
|
289
|
+
app: parsed?.app ?? {},
|
|
290
|
+
user: parsed?.user ?? {},
|
|
291
|
+
session: parsed?.session ?? {},
|
|
292
|
+
view: parsed?.view ?? {},
|
|
293
|
+
properties: parsed?.properties ?? {},
|
|
294
|
+
os: parsed?.os ?? {},
|
|
295
|
+
net: parsed?.net ?? {}
|
|
296
|
+
};
|
|
297
|
+
return rawEvents.flatMap((rawEvent, index) => {
|
|
298
|
+
if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent)) return [];
|
|
299
|
+
const event = rawEvent;
|
|
300
|
+
const normalizedType = RUM_TYPE_ALIAS[event.type] ?? event.type;
|
|
301
|
+
const base = {
|
|
302
|
+
id: `${batchId}-${event.event_id ?? index}`,
|
|
303
|
+
batchId,
|
|
304
|
+
batchTimestampMs: now,
|
|
305
|
+
batchTimestamp: formatTimestamp(now),
|
|
306
|
+
type: normalizedType,
|
|
307
|
+
url: event.url,
|
|
308
|
+
timestamp: event.timestamp ?? now,
|
|
309
|
+
success: event.success,
|
|
310
|
+
status_code: event.status_code,
|
|
311
|
+
method: event.method,
|
|
312
|
+
duration: event.duration,
|
|
313
|
+
source: "rum",
|
|
314
|
+
_context: context
|
|
315
|
+
};
|
|
316
|
+
const converted = tryConvertI18nTracker(event, base);
|
|
317
|
+
if (converted) return [converted];
|
|
318
|
+
return [
|
|
319
|
+
{
|
|
320
|
+
...base,
|
|
321
|
+
event_type: event.event_type ?? "unknown",
|
|
322
|
+
name: event.name,
|
|
323
|
+
_raw: event
|
|
324
|
+
}
|
|
325
|
+
];
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function parseArmsRequest(url, options = {}) {
|
|
329
|
+
if (!matchesTrackingHost(url, ARMS_URL_PATTERN)) return null;
|
|
330
|
+
let urlObj;
|
|
331
|
+
try {
|
|
332
|
+
urlObj = new URL(url);
|
|
333
|
+
} catch {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
const params = {};
|
|
337
|
+
urlObj.searchParams.forEach((value, key) => {
|
|
338
|
+
params[key] = value;
|
|
339
|
+
});
|
|
340
|
+
const eventType = (params.t ?? "unknown").toLowerCase();
|
|
341
|
+
const page = params.page ?? "";
|
|
342
|
+
const now = options.now ?? Date.now();
|
|
343
|
+
const sequence = options.sequence ?? ++armsCounter;
|
|
344
|
+
const parsedTimestamp = params.begin ? Number.parseInt(params.begin, 10) : now;
|
|
345
|
+
const timestamp = Number.isFinite(parsedTimestamp) ? parsedTimestamp : now;
|
|
346
|
+
return {
|
|
347
|
+
id: `arms-${sequence}-${now}`,
|
|
348
|
+
source: "arms",
|
|
349
|
+
batchId: 0,
|
|
350
|
+
batchTimestampMs: now,
|
|
351
|
+
batchTimestamp: formatTimestamp(now),
|
|
352
|
+
event_type: eventType,
|
|
353
|
+
name: page || url,
|
|
354
|
+
url,
|
|
355
|
+
timestamp,
|
|
356
|
+
_raw: { ...params, _url: url },
|
|
357
|
+
_context: {
|
|
358
|
+
requestUrl: url,
|
|
359
|
+
app: {
|
|
360
|
+
...params.pid ? { pid: params.pid } : {},
|
|
361
|
+
...params.release ? { release: params.release } : {},
|
|
362
|
+
...params.environment ? { environment: params.environment } : {},
|
|
363
|
+
...params._v ? { sdk_version: params._v } : {}
|
|
364
|
+
},
|
|
365
|
+
user: {
|
|
366
|
+
...params.uid ? { uid: params.uid } : {}
|
|
367
|
+
},
|
|
368
|
+
session: {
|
|
369
|
+
...params.sid ? { sid: params.sid } : {}
|
|
370
|
+
},
|
|
371
|
+
view: {
|
|
372
|
+
...page ? { page } : {},
|
|
373
|
+
...params.tag ? { tag: params.tag } : {}
|
|
374
|
+
},
|
|
375
|
+
properties: {},
|
|
376
|
+
os: {},
|
|
377
|
+
net: {
|
|
378
|
+
...params.ct ? { ct: params.ct } : {}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
function parseTrackingRequest(url, postData, options = {}) {
|
|
384
|
+
const rumEvents = parseRumRequest(url, postData, options);
|
|
385
|
+
if (rumEvents.length > 0) return rumEvents;
|
|
386
|
+
const aplusEvent = parseAplusRequest(url, options);
|
|
387
|
+
if (aplusEvent) return [aplusEvent];
|
|
388
|
+
const armsEvent = parseArmsRequest(url, options);
|
|
389
|
+
return armsEvent ? [armsEvent] : [];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// src/runtime.ts
|
|
393
|
+
function createTrackingPlugin() {
|
|
394
|
+
return {
|
|
395
|
+
tracking: () => ({ matches: isTrackingUrl, parse: parseTrackingRequest }),
|
|
396
|
+
decode: (inputs) => inputs.map(({ url, body, options }) => {
|
|
397
|
+
try {
|
|
398
|
+
return { tracking: isTrackingUrl(url), events: parseTrackingRequest(url, body, options) };
|
|
399
|
+
} catch (error) {
|
|
400
|
+
return { tracking: isTrackingUrl(url), events: [], error: error instanceof Error ? error.message : String(error) };
|
|
401
|
+
}
|
|
402
|
+
}),
|
|
403
|
+
spm: ({ eventType, raw }) => resolveAplusSpm(eventType, raw)
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
407
|
+
0 && (module.exports = {
|
|
408
|
+
createTrackingPlugin
|
|
409
|
+
});
|
|
410
|
+
module.exports = module.exports.default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure parsers for tracking requests. Callers provide the request URL/body and
|
|
3
|
+
* may provide a stable sequence and timestamp when deterministic IDs are needed.
|
|
4
|
+
*/
|
|
5
|
+
import type { RumEvent } from '@mearl/browser-core';
|
|
6
|
+
export declare const APLUS_URL_PATTERN: RegExp;
|
|
7
|
+
export declare const RUM_URL_PATTERN: RegExp;
|
|
8
|
+
export declare const ARMS_URL_PATTERN: RegExp;
|
|
9
|
+
export declare function isTrackingUrl(url: string): boolean;
|
|
10
|
+
export interface TrackingParseOptions {
|
|
11
|
+
/** Event receive time in milliseconds. Defaults to Date.now(). */
|
|
12
|
+
now?: number;
|
|
13
|
+
/** Stable request sequence supplied by the owning per-tab/session buffer. */
|
|
14
|
+
sequence?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AplusSpmResolution {
|
|
17
|
+
mainSpm: string;
|
|
18
|
+
highlightSpm: string;
|
|
19
|
+
}
|
|
20
|
+
/** If spm-url is a full URL, return its spm query parameter. */
|
|
21
|
+
export declare function extractSpmFromUrl(spmOrUrl: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the point SPM according to event semantics.
|
|
24
|
+
* CLK uses gokey.spm, EXP uses expdata[0].spm, and PV uses spm-url.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveAplusSpm(eventType: string | undefined, raw: Record<string, any>): AplusSpmResolution;
|
|
27
|
+
export declare function parseAplusRequest(url: string, options?: TrackingParseOptions): RumEvent | null;
|
|
28
|
+
export declare function parseRumRequest(url: string, postData: string | Record<string, any> | null | undefined, options?: TrackingParseOptions): RumEvent[];
|
|
29
|
+
export declare function parseArmsRequest(url: string, options?: TrackingParseOptions): RumEvent | null;
|
|
30
|
+
/** Parse any supported tracking request into zero or more normalized events. */
|
|
31
|
+
export declare function parseTrackingRequest(url: string, postData?: string | Record<string, any> | null, options?: TrackingParseOptions): RumEvent[];
|