Skip to content

Commit 32e2a4a

Browse files
committed
feat(tracker): add setPagePerformanceTiming tracking method
Cherry-picked from 4e92fe7
1 parent d1a684c commit 32e2a4a

File tree

3 files changed

+89
-3
lines changed

3 files changed

+89
-3
lines changed

projects/tracker/src/lib/matomo-tracker.service.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,20 @@ describe('MatomoTracker', () => {
172172

173173
it('should set generation time', expectSimpleMethod('setGenerationTimeMs', [42]));
174174

175+
it(
176+
'should set performance timings',
177+
expectPush(
178+
tracker => {
179+
tracker.setPagePerformanceTiming(42, undefined, 100, undefined);
180+
tracker.setPagePerformanceTiming({ networkTimeInMs: 10, transferTimeInMs: 20 });
181+
},
182+
[
183+
['setPagePerformanceTiming', 42, undefined, 100],
184+
['setPagePerformanceTiming', 10, undefined, 20],
185+
]
186+
)
187+
);
188+
175189
it('should append to tracking url', expectSimpleMethod('appendToTrackingUrl', ['?toAppend']));
176190

177191
it('should set "DoNotTrack"', expectSimpleMethod('setDoNotTrack', [true]));

projects/tracker/src/lib/matomo-tracker.service.ts

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { isPlatformBrowser } from '@angular/common';
22
import { Injectable, PLATFORM_ID } from '@angular/core';
33
import { INTERNAL_MATOMO_CONFIGURATION, InternalMatomoConfiguration } from './configuration';
44
import { initializeMatomoHolder, MatomoHolder } from './holder';
5-
import { Getters } from './types';
5+
import { Getters, RequireAtLeastOne } from './types';
66

77
declare var window: MatomoHolder;
88

@@ -28,6 +28,15 @@ export type MatomoECommerceItemView = Omit<MatomoECommerceItem, 'quantity'>;
2828
export type MatomoECommerceCategoryView = Required<Pick<MatomoECommerceItem, 'productCategory'>>;
2929
export type MatomoECommerceView = MatomoECommerceItemView | MatomoECommerceCategoryView;
3030

31+
export type PagePerformanceTimings = RequireAtLeastOne<{
32+
networkTimeInMs?: number;
33+
serverTimeInMs?: number;
34+
transferTimeInMs?: number;
35+
domProcessingTimeInMs?: number;
36+
domCompletionTimeInMs?: number;
37+
onloadTimeInMs?: number;
38+
}>;
39+
3140
function isECommerceCategoryView(
3241
param: string | MatomoECommerceView
3342
): param is MatomoECommerceCategoryView {
@@ -503,17 +512,76 @@ export abstract class MatomoTracker {
503512
}
504513

505514
/**
506-
* By default Matomo uses the browser DOM Timing API to accurately determine the time it takes to generate and download
515+
* By default, Matomo uses the browser DOM Timing API to accurately determine the time it takes to generate and download
507516
* the page. You may overwrite this value with this function.
508517
*
509-
* <b>This feature has been deprecated since Matomo 4. Any call will be ignored with Matomo 4.</b>
518+
* <b>This feature has been deprecated since Matomo 4. Any call will be ignored with Matomo 4. Use {@link setPagePerformanceTiming setPagePerformanceTiming()} instead.</b>
510519
*
511520
* @param generationTime Time, in milliseconds, of the page generation.
512521
*/
513522
setGenerationTimeMs(generationTime: number): void {
514523
this.push(['setGenerationTimeMs', generationTime]);
515524
}
516525

526+
/**
527+
* Manually set performance metrics in milliseconds in a Single Page App or when Matomo cannot detect some metrics.
528+
*
529+
* You can set parameters to undefined if you do not want to track this metric. At least one parameter needs to be set.
530+
* The set performance timings will be tracked only on the next page view. If you track another page view then you will need to set the performance timings again.
531+
*
532+
* <b>Requires Matomo 4.5 or newer.</b>
533+
*
534+
*/
535+
setPagePerformanceTiming(timings: PagePerformanceTimings): void;
536+
/**
537+
* Manually set performance metrics in milliseconds in a Single Page App or when Matomo cannot detect some metrics.
538+
*
539+
* You can set parameters to undefined if you do not want to track this metric. At least one parameter needs to be set.
540+
* The set performance timings will be tracked only on the next page view. If you track another page view then you will need to set the performance timings again.
541+
*
542+
* <b>Requires Matomo 4.5 or newer.</b>
543+
*
544+
*/
545+
setPagePerformanceTiming(
546+
networkTimeInMs: number | undefined,
547+
serverTimeInMs?: number,
548+
transferTimeInMs?: number,
549+
domProcessingTimeInMs?: number,
550+
domCompletionTimeInMs?: number,
551+
onloadTimeInMs?: number
552+
): void;
553+
setPagePerformanceTiming(
554+
networkTimeInMsOrTimings: PagePerformanceTimings | number | undefined,
555+
serverTimeInMs?: number,
556+
transferTimeInMs?: number,
557+
domProcessingTimeInMs?: number,
558+
domCompletionTimeInMs?: number,
559+
onloadTimeInMs?: number
560+
): void {
561+
let networkTimeInMs: number | undefined;
562+
563+
if (typeof networkTimeInMsOrTimings === 'object' && !!networkTimeInMsOrTimings) {
564+
networkTimeInMs = networkTimeInMsOrTimings.networkTimeInMs;
565+
serverTimeInMs = networkTimeInMsOrTimings.serverTimeInMs;
566+
transferTimeInMs = networkTimeInMsOrTimings.transferTimeInMs;
567+
domProcessingTimeInMs = networkTimeInMsOrTimings.domProcessingTimeInMs;
568+
domCompletionTimeInMs = networkTimeInMsOrTimings.domCompletionTimeInMs;
569+
onloadTimeInMs = networkTimeInMsOrTimings.onloadTimeInMs;
570+
} else {
571+
networkTimeInMs = networkTimeInMsOrTimings;
572+
}
573+
574+
this.push([
575+
'setPagePerformanceTiming',
576+
networkTimeInMs,
577+
serverTimeInMs,
578+
transferTimeInMs,
579+
domProcessingTimeInMs,
580+
domCompletionTimeInMs,
581+
onloadTimeInMs,
582+
]);
583+
}
584+
517585
/**
518586
* Appends a custom string to the end of the HTTP request to matomo.php.
519587
*

projects/tracker/src/lib/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ export type Methods<T> = keyof T &
99
{
1010
[P in keyof T]: T[P] extends (...args: any[]) => any ? P : never;
1111
}[keyof T];
12+
13+
export type RequireAtLeastOne<T> = {
14+
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;
15+
}[keyof T];

0 commit comments

Comments
 (0)