@adobe/spacecat-shared-rum-api-client 2.38.10 → 2.39.1
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/CHANGELOG.md +14 -0
- package/package.json +3 -3
- package/src/common/traffic.js +25 -6
- package/src/functions/traffic-analysis.js +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [@adobe/spacecat-shared-rum-api-client-v2.39.1](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.39.0...@adobe/spacecat-shared-rum-api-client-v2.39.1) (2025-11-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* update to node 24 ([#1179](https://github.com/adobe/spacecat-shared/issues/1179)) ([0e60c0a](https://github.com/adobe/spacecat-shared/commit/0e60c0ab791b47662d07822f7c93009a8f7048fd))
|
|
7
|
+
|
|
8
|
+
# [@adobe/spacecat-shared-rum-api-client-v2.39.0](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.38.10...@adobe/spacecat-shared-rum-api-client-v2.39.0) (2025-11-24)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* use paid event tracking source to classify ([#1166](https://github.com/adobe/spacecat-shared/issues/1166)) ([c477a04](https://github.com/adobe/spacecat-shared/commit/c477a048d3f74fdc315c5c4a6b2e2725cc0e5283))
|
|
14
|
+
|
|
1
15
|
# [@adobe/spacecat-shared-rum-api-client-v2.38.10](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-rum-api-client-v2.38.9...@adobe/spacecat-shared-rum-api-client-v2.38.10) (2025-11-15)
|
|
2
16
|
|
|
3
17
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adobe/spacecat-shared-rum-api-client",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.39.1",
|
|
4
4
|
"description": "Shared modules of the Spacecat Services - Rum API client",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=22.0.0 <
|
|
7
|
+
"node": ">=22.0.0 <25.0.0",
|
|
8
8
|
"npm": ">=10.9.0 <12.0.0"
|
|
9
9
|
},
|
|
10
10
|
"main": "src/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"@adobe/helix-shared-wrap": "2.0.2",
|
|
40
40
|
"@adobe/helix-universal": "5.3.0",
|
|
41
41
|
"@adobe/rum-distiller": "1.20.8",
|
|
42
|
-
"@adobe/spacecat-shared-utils": "1.
|
|
42
|
+
"@adobe/spacecat-shared-utils": "1.81.0",
|
|
43
43
|
"aws4": "1.13.2",
|
|
44
44
|
"urijs": "1.19.11"
|
|
45
45
|
},
|
package/src/common/traffic.js
CHANGED
|
@@ -68,7 +68,7 @@ const mediums = {
|
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
const sources = {
|
|
71
|
-
social: /^\b(ig|fb|x|soc)\b|(.*(meta|tiktok|facebook|snapchat|twitter|igshopping|instagram|linkedin|reddit).*)$/,
|
|
71
|
+
social: /^\b(ig|fb|x|soc|ln)\b|(.*(meta|tiktok|facebook|snapchat|twitter|igshopping|instagram|linkedin|reddit).*)$/,
|
|
72
72
|
search: /^\b(goo)\b|(.*(sea|google|yahoo|bing|yandex|baidu|duckduckgo|brave|ecosia|aol|startpage|ask).*)$/,
|
|
73
73
|
video: /youtube|vimeo|twitch|dailymotion|wistia/,
|
|
74
74
|
display: /optumib2b|jun|googleads|dv360|dv36|microsoft|flipboard|programmatic|yext|gdn|banner|newsshowcase/,
|
|
@@ -84,12 +84,12 @@ const sources = {
|
|
|
84
84
|
*/
|
|
85
85
|
const vendorClassifications = [
|
|
86
86
|
{ regex: /google|googleads|google-ads|google_search|google_deman|adwords|dv360|gdn|doubleclick|dbm|gmb|gemini/i, result: 'google' },
|
|
87
|
-
{ regex: /instagram|\b(ig)\b/i, result: 'instagram' },
|
|
87
|
+
{ regex: /instagram|\b(ig)\b|\b(Insta)\b/i, result: 'instagram' },
|
|
88
88
|
{ regex: /facebook|\b(fb)\b|meta/i, result: 'facebook' },
|
|
89
89
|
{ regex: /bing/i, result: 'bing' },
|
|
90
90
|
{ regex: /tiktok/i, result: 'tiktok' },
|
|
91
91
|
{ regex: /youtube|yt/i, result: 'youtube' },
|
|
92
|
-
{ regex: /linkedin/i, result: 'linkedin' },
|
|
92
|
+
{ regex: /linkedin|\b(ln)\b/i, result: 'linkedin' },
|
|
93
93
|
{ regex: /twitter|^\b(x)\b/i, result: 'x' },
|
|
94
94
|
{ regex: /snapchat/i, result: 'snapchat' },
|
|
95
95
|
{ regex: /microsoft|copilot/i, result: 'microsoft' },
|
|
@@ -214,6 +214,7 @@ const RULES = (domain) => ([
|
|
|
214
214
|
{ type: 'paid', category: 'search', referrer: anyOf(referrers.search), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
|
|
215
215
|
{ type: 'paid', category: 'search', referrer: anyOf(referrers.ad), utmSource: any, utmMedium: anyOf(mediums.paidsearch), tracking: any },
|
|
216
216
|
{ type: 'paid', category: 'search', referrer: none, utmSource: anyOf(sources.search), utmMedium: anyOf(mediums.paidsearch), tracking: any },
|
|
217
|
+
{ type: 'paid', category: 'search', referrer: none, utmSource: anyOf(sources.search), utmMedium: none, tracking: anyOf(paidTrackingParams) },
|
|
217
218
|
|
|
218
219
|
{ type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: any, utmMedium: anyOf(mediums.paidsocial), tracking: none },
|
|
219
220
|
{ type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
|
|
@@ -222,6 +223,7 @@ const RULES = (domain) => ([
|
|
|
222
223
|
{ type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: anyOf(mediums.paidall), tracking: any },
|
|
223
224
|
{ type: 'paid', category: 'social', referrer: anyOf(referrers.social), utmSource: notEmpty, utmMedium: notEmpty, tracking: any },
|
|
224
225
|
{ type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: anyOf(mediums.socialall), tracking: any },
|
|
226
|
+
{ type: 'paid', category: 'social', referrer: none, utmSource: anyOf(sources.social), utmMedium: any, tracking: anyOf(paidTrackingParams) },
|
|
225
227
|
|
|
226
228
|
{ type: 'paid', category: 'video', referrer: anyOf(referrers.video), utmSource: any, utmMedium: anyOf(mediums.paidall), tracking: any },
|
|
227
229
|
{ type: 'paid', category: 'video', referrer: anyOf(referrers.video), utmSource: any, utmMedium: any, tracking: anyOf(paidTrackingParams) },
|
|
@@ -277,6 +279,8 @@ export function extractTrafficHints(bundle) {
|
|
|
277
279
|
const utmSource = findEvent('utm', 'utm_source').target || '';
|
|
278
280
|
const utmMedium = findEvent('utm', 'utm_medium').target || '';
|
|
279
281
|
const tracking = findEvent('paid').checkpoint || findEvent('email').checkpoint || '';
|
|
282
|
+
const trackingSource = findEvent('paid').source || findEvent('email').source || '';
|
|
283
|
+
const trackingTarget = findEvent('paid').target || findEvent('email').target || '';
|
|
280
284
|
|
|
281
285
|
return {
|
|
282
286
|
url: bundle.url,
|
|
@@ -285,6 +289,8 @@ export function extractTrafficHints(bundle) {
|
|
|
285
289
|
utmSource,
|
|
286
290
|
utmMedium,
|
|
287
291
|
tracking,
|
|
292
|
+
trackingSource,
|
|
293
|
+
trackingTarget,
|
|
288
294
|
};
|
|
289
295
|
}
|
|
290
296
|
|
|
@@ -303,7 +309,7 @@ export function classifyVendor(referrer, utmSource, utmMedium) {
|
|
|
303
309
|
return result ? result.result : '';
|
|
304
310
|
}
|
|
305
311
|
|
|
306
|
-
export function classifyTrafficSource(url, referrer, utmSource, utmMedium,
|
|
312
|
+
export function classifyTrafficSource(url, referrer, utmSource, utmMedium, trackingEvent) {
|
|
307
313
|
const secondLevelDomain = getSecondLevelDomain(url);
|
|
308
314
|
const rules = RULES(secondLevelDomain);
|
|
309
315
|
|
|
@@ -315,7 +321,7 @@ export function classifyTrafficSource(url, referrer, utmSource, utmMedium, track
|
|
|
315
321
|
rule.referrer(referrerDomain)
|
|
316
322
|
&& rule.utmSource(sanitize(utmSource))
|
|
317
323
|
&& rule.utmMedium(sanitize(utmMedium))
|
|
318
|
-
&& rule.tracking(
|
|
324
|
+
&& rule.tracking(trackingEvent)
|
|
319
325
|
));
|
|
320
326
|
let { type, category } = match;
|
|
321
327
|
let vendor = classifyVendor(referrerDomain, utmSource, utmMedium);
|
|
@@ -347,11 +353,24 @@ export function classifyTraffic(bundle) {
|
|
|
347
353
|
utmSource,
|
|
348
354
|
utmMedium,
|
|
349
355
|
tracking,
|
|
356
|
+
trackingSource,
|
|
357
|
+
trackingTarget,
|
|
350
358
|
} = extractTrafficHints(bundle);
|
|
351
359
|
|
|
360
|
+
let source = utmSource;
|
|
361
|
+
|
|
362
|
+
// When there are no explicit UTM parameters, fall back to tracking source
|
|
363
|
+
// as the classification source. This lets "paid + google (tracking_source)"
|
|
364
|
+
// behave like "paid + google (utm_source)" without mutating actual UTMs.
|
|
365
|
+
if (!source && !utmMedium && trackingSource) {
|
|
366
|
+
source = trackingSource;
|
|
367
|
+
}
|
|
368
|
+
|
|
352
369
|
return {
|
|
353
370
|
url,
|
|
354
371
|
weight,
|
|
355
|
-
|
|
372
|
+
trackingSource,
|
|
373
|
+
trackingTarget,
|
|
374
|
+
...classifyTrafficSource(url, referrer, source, utmMedium, tracking),
|
|
356
375
|
};
|
|
357
376
|
}
|
|
@@ -106,6 +106,8 @@ async function handler(bundles) {
|
|
|
106
106
|
trf_type: trafficData.type,
|
|
107
107
|
trf_channel: trafficData.category,
|
|
108
108
|
trf_platform: trafficData.vendor || null,
|
|
109
|
+
tracking_source: trafficData.trackingSource || null,
|
|
110
|
+
tracking_target: trafficData.trackingTarget || null,
|
|
109
111
|
device: bundle.userAgent.split(':')[0],
|
|
110
112
|
utm_source: getUTM(bundle, 'source'),
|
|
111
113
|
utm_medium: getUTM(bundle, 'medium'),
|