Skip to content

Commit 784b1de

Browse files
committed
fix(tracker): prevent initializing Matomo more than once
1 parent 8e23baf commit 784b1de

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

projects/tracker/src/lib/errors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export const ALREADY_INJECTED_ERROR = 'Matomo trackers have already been initialized';
2+
export const ALREADY_INITIALIZED_ERROR = 'Matomo has already been initialized';

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

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
MatomoConsentMode,
99
MatomoInitializationMode,
1010
} from './configuration';
11-
import { ALREADY_INJECTED_ERROR } from './errors';
11+
import { ALREADY_INITIALIZED_ERROR, ALREADY_INJECTED_ERROR } from './errors';
1212
import { MatomoHolder } from './holder';
1313
import { MatomoInitializerService } from './matomo-initializer.service';
1414
import { MatomoTracker, NoopMatomoTracker } from './matomo-tracker.service';
@@ -487,6 +487,22 @@ describe('MatomoInitializerService', () => {
487487
expect(tracker.setSiteId).toHaveBeenCalledOnceWith('fakeSiteId');
488488
});
489489

490+
it('should map deprecated init() method to initialize()', () => {
491+
// Given
492+
const service = instantiate({
493+
trackerUrl: '',
494+
siteId: '',
495+
});
496+
497+
spyOn(service, 'initialize');
498+
499+
// When
500+
service.init();
501+
502+
// Then
503+
expect(service.initialize).toHaveBeenCalledOnceWith();
504+
});
505+
490506
it('should throw an error when initialized trackers more than once', () => {
491507
// Given
492508
const service = instantiate({
@@ -502,19 +518,17 @@ describe('MatomoInitializerService', () => {
502518
);
503519
});
504520

505-
it('should map deprecated init() method to initialize()', () => {
521+
it('should throw an error when initialized more than once', () => {
506522
// Given
507523
const service = instantiate({
508524
trackerUrl: '',
509525
siteId: '',
510526
});
511527

512-
spyOn(service, 'initialize');
513-
514528
// When
515-
service.init();
529+
service.initialize();
516530

517531
// Then
518-
expect(service.initialize).toHaveBeenCalledOnceWith();
532+
expect(() => service.initialize()).toThrowError(ALREADY_INITIALIZED_ERROR);
519533
});
520534
});

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
MatomoInitializationMode,
1414
MatomoTrackerConfiguration,
1515
} from './configuration';
16-
import { ALREADY_INJECTED_ERROR } from './errors';
16+
import { ALREADY_INITIALIZED_ERROR, ALREADY_INJECTED_ERROR } from './errors';
1717
import { initializeMatomoHolder } from './holder';
1818
import { MatomoTracker } from './matomo-tracker.service';
1919
import { MATOMO_SCRIPT_FACTORY, MatomoScriptFactory } from './script-factory';
@@ -76,6 +76,7 @@ export class NoopMatomoInitializer
7676
],
7777
})
7878
export class MatomoInitializerService {
79+
private initialized = false;
7980
private injected = false;
8081

8182
constructor(
@@ -95,9 +96,15 @@ export class MatomoInitializerService {
9596
initialize(): void {
9697
this.runPreInitTasks();
9798

99+
if (this.initialized) {
100+
throw new Error(ALREADY_INITIALIZED_ERROR);
101+
}
102+
98103
if (isAutoConfigurationMode(this.config)) {
99104
this.injectMatomoScript(this.config);
100105
}
106+
107+
this.initialized = true;
101108
}
102109

103110
initializeTracker(config: AutoMatomoConfiguration<MatomoInitializationMode.AUTO_DEFERRED>): void {

0 commit comments

Comments
 (0)