Skip to content

Commit efc549b

Browse files
authored
feat: capture page_url in events (#1276)
* feat: capture page url * feat: capture page_url in background AST events * fix: use getHref() for page_url capture and drop generated .d.ts edits
1 parent 425a2b4 commit efc549b

9 files changed

Lines changed: 115 additions & 7 deletions

package-lock.json

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
"@babel/preset-env": "^7.6.0",
104104
"@babel/preset-typescript": "^7.6.0",
105105
"@mparticle/data-planning-models": "^0.1.0",
106-
"@mparticle/event-models": "^1.1.9",
106+
"@mparticle/event-models": "^1.3.0",
107107
"@rollup/plugin-babel": "6.0.3",
108108
"@rollup/plugin-commonjs": "25.0.4",
109109
"@rollup/plugin-json": "^5.0.2",
@@ -159,7 +159,7 @@
159159
"webpack-cli": "^5.0.2"
160160
},
161161
"peerDependencies": {
162-
"@mparticle/event-models": "^1.1.9"
162+
"@mparticle/event-models": "^1.3.0"
163163
},
164164
"dependencies": {
165165
"@babel/runtime": "^7.23.2"

src/batchUploader.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Constants from './constants';
33
import { SDKEvent, SDKEventCustomFlags } from './sdkRuntimeModels';
44
import { convertEvents } from './sdkToEventsApiConverter';
55
import { MessageType, EventType } from './types';
6-
import { getRampNumber, isEmpty, obfuscateDevData } from './utils';
6+
import { getRampNumber, getHref, isEmpty, obfuscateDevData } from './utils';
77
import { SessionStorageVault, LocalStorageVault } from './vault';
88
import {
99
AsyncUploader,
@@ -193,6 +193,7 @@ export class BatchUploader {
193193
SessionStartDate: sessionStartDate?.getTime() || now,
194194
Debug: SDKConfig.isDevelopmentMode,
195195
ActiveTimeOnSite: _timeOnSiteTimer?.getTimeInForeground() || 0,
196+
PageUrl: getHref() || null,
196197
IsBackgroundAST: true
197198
} as SDKEvent;
198199

src/sdkRuntimeModels.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export interface SDKEvent {
9494
LaunchReferral?: string;
9595
ExpandedEventCount: number;
9696
ActiveTimeOnSite: number;
97+
PageUrl?: string;
9798
IsBackgroundAST?: boolean;
9899
AlreadySentToForwarders?: boolean;
99100
}

src/sdkToEventsApiConverter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,8 @@ export function convertBaseEventData(
663663
custom_attributes: sdkEvent.EventAttributes,
664664
location: convertSDKLocation(sdkEvent.Location),
665665
source_message_id: sdkEvent.SourceMessageId,
666-
active_time_on_site_ms: sdkEvent.ActiveTimeOnSite
666+
active_time_on_site_ms: sdkEvent.ActiveTimeOnSite,
667+
page_url: sdkEvent.PageUrl,
667668
};
668669

669670
return commonEventData;

src/serverModel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
Dictionary,
1818
isValidCustomFlagProperty,
1919
extend,
20+
getHref,
2021
} from './utils';
2122
import { IntegrationAttributes, ServerSettings } from './store';
2223
import { MPID } from '@mparticle/web-sdk';
@@ -310,6 +311,7 @@ export default function ServerModel(
310311
event.name
311312
),
312313
ActiveTimeOnSite: mpInstance._timeOnSiteTimer?.getTimeInForeground(),
314+
PageUrl: getHref() || null,
313315
SourceMessageId:
314316
event.sourceMessageId ||
315317
mpInstance._Helpers.generateUniqueId(),

test/src/tests-batchUploader.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ describe('batch uploader', () => {
241241

242242
expect(astEvent.event_type).to.equal('application_state_transition');
243243
expect(astEvent.data.active_time_on_site_ms).to.be.a('number');
244+
expect(astEvent.data.page_url).to.equal(window.location.href);
244245
expect(astEvent.data.application_transition_type).to.equal('application_background');
245246
expect(astEvent.data.custom_attributes).to.exist;
246247
expect(astEvent.data.is_first_run).to.be.a('boolean');
@@ -335,6 +336,7 @@ describe('batch uploader', () => {
335336

336337
expect(astEvent.event_type).to.equal('application_state_transition');
337338
expect(astEvent.data.active_time_on_site_ms).to.be.a('number');
339+
expect(astEvent.data.page_url).to.equal(window.location.href);
338340
expect(astEvent.data.application_transition_type).to.equal('application_background');
339341
expect(astEvent.data.custom_attributes).to.exist;
340342
expect(astEvent.data.is_first_run).to.be.a('boolean');

test/src/tests-runtimeToBatchEventsDTO.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,4 +510,84 @@ describe('Old model to batch model conversion', () => {
510510
// set screen back on
511511
window.screen = originalScreen;
512512
});
513+
514+
it('propagates PageUrl to page_url on the converted event', () => {
515+
const sdkEvent: SDKEvent = {
516+
EventName: 'Page View',
517+
EventCategory: Types.EventType.Navigation,
518+
ExpandedEventCount: 0,
519+
EventDataType: Types.MessageType.PageEvent,
520+
EventAttributes: null,
521+
ConsentState: null,
522+
CurrencyCode: null,
523+
CustomFlags: {},
524+
DataPlan: {},
525+
Debug: true,
526+
DeviceId: '0edd580e-d887-44e4-89ae-cd65aa0ee933',
527+
Location: null,
528+
MPID: '-8433569646818451201',
529+
OptOut: null,
530+
SDKVersion: '2.11.15',
531+
SourceMessageId: 'testSMID',
532+
SessionId: '64102C03-592F-440D-8BCC-1D27AAA6B188',
533+
SessionStartDate: 1603211322698,
534+
Timestamp: 1603212299414,
535+
ActiveTimeOnSite: 10,
536+
PageUrl: 'https://example.com/checkout?utm=should-be-stripped-server-side',
537+
UserAttributes: {},
538+
UserIdentities: [],
539+
IsFirstRun: true,
540+
};
541+
542+
const batch = Converter.convertEvents(
543+
'-8433569646818451201',
544+
[sdkEvent],
545+
window.mParticle.getInstance()
546+
);
547+
548+
expect(batch).to.be.ok;
549+
expect(batch.events.length).to.equal(1);
550+
const event = batch.events[0] as EventsApi.CustomEvent;
551+
expect(event.data.page_url).to.equal(
552+
'https://example.com/checkout?utm=should-be-stripped-server-side'
553+
);
554+
});
555+
556+
it('omits page_url when PageUrl is not set on the SDK event', () => {
557+
const sdkEvent: SDKEvent = {
558+
EventName: 'Page View',
559+
EventCategory: Types.EventType.Navigation,
560+
ExpandedEventCount: 0,
561+
EventDataType: Types.MessageType.PageEvent,
562+
EventAttributes: null,
563+
ConsentState: null,
564+
CurrencyCode: null,
565+
CustomFlags: {},
566+
DataPlan: {},
567+
Debug: true,
568+
DeviceId: '0edd580e-d887-44e4-89ae-cd65aa0ee933',
569+
Location: null,
570+
MPID: '-8433569646818451201',
571+
OptOut: null,
572+
SDKVersion: '2.11.15',
573+
SourceMessageId: 'testSMID',
574+
SessionId: '64102C03-592F-440D-8BCC-1D27AAA6B188',
575+
SessionStartDate: 1603211322698,
576+
Timestamp: 1603212299414,
577+
ActiveTimeOnSite: 10,
578+
UserAttributes: {},
579+
UserIdentities: [],
580+
IsFirstRun: true,
581+
};
582+
583+
const batch = Converter.convertEvents(
584+
'-8433569646818451201',
585+
[sdkEvent],
586+
window.mParticle.getInstance()
587+
);
588+
589+
expect(batch).to.be.ok;
590+
const event = batch.events[0] as EventsApi.CustomEvent;
591+
expect(event.data.page_url).to.equal(undefined);
592+
});
513593
});

test/src/tests-serverModel.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,25 @@ describe('ServerModel', () => {
297297
);
298298
});
299299

300+
it('should capture window.location.href as PageUrl', () => {
301+
const event: BaseEvent = {
302+
name: 'Test Event',
303+
messageType: Types.MessageType.PageEvent,
304+
eventType: Types.EventType.Navigation,
305+
data: { foo: 'bar' },
306+
sourceMessageId: 'test-source-message-id',
307+
customFlags: {},
308+
};
309+
310+
const actualEventObject = mParticle
311+
.getInstance()
312+
._ServerModel.createEventObject(event) as IUploadObject;
313+
314+
expect(actualEventObject.PageUrl, 'PageUrl').to.equal(
315+
window.location.href
316+
);
317+
});
318+
300319
it('should create an event object with a user', () => {
301320
const event: BaseEvent = {
302321
name: 'Test Event',

0 commit comments

Comments
 (0)