@@ -7,20 +7,26 @@ import { IdProvider } from '../api/idProvider';
77import { Environment } from '../api/environment' ;
88import { transform , isError } from '../utils/events' ;
99import { IReporter } from '../api/reporter' ;
10+ import { EventTracker } from './eventTracker' ;
11+ import { Memento } from 'vscode' ;
1012
1113/**
1214 * Implementation of a `TelemetryService`
1315 */
1416export class TelemetryServiceImpl implements TelemetryService {
1517 private startTime : number ;
18+ private eventTracker : EventTracker ;
1619
17- constructor ( private reporter : IReporter ,
20+ constructor ( globalState : Memento ,
21+ private reporter : IReporter ,
1822 private queue : TelemetryEventQueue | undefined ,
1923 private settings : TelemetrySettings ,
2024 private idManager : IdProvider ,
2125 private environment : Environment ,
22- private configurationManager ?: ConfigurationManager ) {
26+ private configurationManager ?: ConfigurationManager
27+ ) {
2328 this . startTime = this . getCurrentTimeInSeconds ( ) ;
29+ this . eventTracker = new EventTracker ( globalState ) ;
2430 }
2531
2632 /*
@@ -64,7 +70,25 @@ export class TelemetryServiceImpl implements TelemetryService {
6470 //Check against Extension configuration
6571 const config = await this . configurationManager ?. getExtensionConfiguration ( ) ;
6672 if ( ! config || config . canSend ( payload ) ) {
67- return this . reporter . report ( payload ) ;
73+
74+ const dailyLimit = ( config ) ?config . getDailyLimit ( payload ) :Number . MAX_VALUE ;
75+ let count = 0 ;
76+ if ( dailyLimit < Number . MAX_VALUE ) {
77+ //find currently stored count
78+ count = await this . eventTracker . getEventCount ( payload ) ;
79+ if ( count >= dailyLimit ) {
80+ //daily limit reached, do not send event
81+ Logger . log ( `Daily limit reached for ${ event . name } : ${ dailyLimit } ` ) ;
82+ return ;
83+ }
84+ }
85+ return this . reporter . report ( payload ) . then ( ( ) => {
86+ if ( dailyLimit < Number . MAX_VALUE ) {
87+ //update count
88+ Logger . log ( `Storing event count (${ count + 1 } /${ dailyLimit } ) for ${ event . name } ` ) ;
89+ return this . eventTracker . storeEventCount ( payload , count + 1 ) ;
90+ }
91+ } ) ;
6892 }
6993 }
7094
@@ -87,9 +111,8 @@ export class TelemetryServiceImpl implements TelemetryService {
87111 return this . reporter . closeAndFlush ( ) ;
88112 }
89113
90-
91114 private getCurrentTimeInSeconds ( ) : number {
92115 const now = Date . now ( ) ;
93116 return Math . floor ( now / 1000 ) ;
94117 }
95- }
118+ }
0 commit comments