@@ -28,6 +28,7 @@ import {
2828 ClickstreamConfiguration ,
2929 ClickstreamEvent ,
3030 Configuration ,
31+ EventError ,
3132 PageType ,
3233 SendMode ,
3334 UserAttribute ,
@@ -40,7 +41,8 @@ const logger = new Logger('ClickstreamProvider');
4041export class ClickstreamProvider implements AnalyticsProvider {
4142 configuration : ClickstreamConfiguration ;
4243 eventRecorder : EventRecorder ;
43- userAttribute : UserAttribute ;
44+ userAttributes : UserAttribute ;
45+ globalAttributes : ClickstreamAttribute ;
4446 context : ClickstreamContext ;
4547 sessionTracker : SessionTracker ;
4648 pageViewTracker : PageViewTracker ;
@@ -85,7 +87,8 @@ export class ClickstreamProvider implements AnalyticsProvider {
8587 this . pageViewTracker . setUp ( ) ;
8688 this . clickTracker . setUp ( ) ;
8789 this . scrollTracker . setUp ( ) ;
88- this . userAttribute = StorageUtil . getUserAttributes ( ) ;
90+ this . userAttributes = StorageUtil . getUserAttributes ( ) ;
91+ this . globalAttributes = { } ;
8992 if ( configuration . sendMode === SendMode . Batch ) {
9093 this . startTimer ( ) ;
9194 }
@@ -118,15 +121,8 @@ export class ClickstreamProvider implements AnalyticsProvider {
118121 record ( event : ClickstreamEvent ) {
119122 const result = EventChecker . checkEventName ( event . name ) ;
120123 if ( result . error_code > 0 ) {
121- const errorEvent = this . createEvent ( {
122- name : Event . PresetEvent . CLICKSTREAM_ERROR ,
123- attributes : {
124- [ Event . ReservedAttribute . ERROR_CODE ] : result . error_code ,
125- [ Event . ReservedAttribute . ERROR_MESSAGE ] : result . error_message ,
126- } ,
127- } ) ;
128- this . recordEvent ( errorEvent ) ;
129124 logger . error ( result . error_message ) ;
125+ this . recordClickstreamError ( result ) ;
130126 return ;
131127 }
132128 const resultEvent = this . createEvent ( event ) ;
@@ -137,7 +133,8 @@ export class ClickstreamProvider implements AnalyticsProvider {
137133 return AnalyticsEventBuilder . createEvent (
138134 this . context ,
139135 event ,
140- this . userAttribute ,
136+ this . userAttributes ,
137+ this . globalAttributes ,
141138 this . sessionTracker . session
142139 ) ;
143140 }
@@ -155,12 +152,12 @@ export class ClickstreamProvider implements AnalyticsProvider {
155152
156153 setUserId ( userId : string | null ) {
157154 let previousUserId = '' ;
158- if ( Event . ReservedAttribute . USER_ID in this . userAttribute ) {
155+ if ( Event . ReservedAttribute . USER_ID in this . userAttributes ) {
159156 previousUserId =
160- this . userAttribute [ Event . ReservedAttribute . USER_ID ] . value . toString ( ) ;
157+ this . userAttributes [ Event . ReservedAttribute . USER_ID ] . value . toString ( ) ;
161158 }
162159 if ( userId === null ) {
163- delete this . userAttribute [ Event . ReservedAttribute . USER_ID ] ;
160+ delete this . userAttributes [ Event . ReservedAttribute . USER_ID ] ;
164161 } else if ( userId !== previousUserId ) {
165162 const userInfo = StorageUtil . getUserInfoFromMapping ( userId ) ;
166163 const newUserAttribute : UserAttribute = { } ;
@@ -169,40 +166,72 @@ export class ClickstreamProvider implements AnalyticsProvider {
169166 set_timestamp : new Date ( ) . getTime ( ) ,
170167 } ;
171168 Object . assign ( newUserAttribute , userInfo ) ;
172- this . userAttribute = newUserAttribute ;
169+ this . userAttributes = newUserAttribute ;
173170 this . context . userUniqueId = StorageUtil . getCurrentUserUniqueId ( ) ;
171+ this . recordProfileSet ( ) ;
174172 }
175- StorageUtil . updateUserAttributes ( this . userAttribute ) ;
173+ StorageUtil . updateUserAttributes ( this . userAttributes ) ;
176174 }
177175
178176 setUserAttributes ( attributes : ClickstreamAttribute ) {
179177 const timestamp = new Date ( ) . getTime ( ) ;
180178 for ( const key in attributes ) {
181179 const value = attributes [ key ] ;
182180 if ( value === null ) {
183- delete this . userAttribute [ key ] ;
181+ delete this . userAttributes [ key ] ;
184182 } else {
185- const currentNumber = Object . keys ( this . userAttribute ) . length ;
183+ const currentNumber = Object . keys ( this . userAttributes ) . length ;
186184 const { checkUserAttribute } = EventChecker ;
187185 const result = checkUserAttribute ( currentNumber , key , value ) ;
188186 if ( result . error_code > 0 ) {
189- const { ERROR_CODE , ERROR_MESSAGE } = Event . ReservedAttribute ;
190- this . record ( {
191- name : Event . PresetEvent . CLICKSTREAM_ERROR ,
192- attributes : {
193- [ ERROR_CODE ] : result . error_code ,
194- [ ERROR_MESSAGE ] : result . error_message ,
195- } ,
196- } ) ;
187+ this . recordClickstreamError ( result ) ;
197188 } else {
198- this . userAttribute [ key ] = {
189+ this . userAttributes [ key ] = {
199190 value : value ,
200191 set_timestamp : timestamp ,
201192 } ;
202193 }
203194 }
204195 }
205- StorageUtil . updateUserAttributes ( this . userAttribute ) ;
196+ StorageUtil . updateUserAttributes ( this . userAttributes ) ;
197+ this . recordProfileSet ( ) ;
198+ }
199+
200+ setGlobalAttributes ( attributes : ClickstreamAttribute ) {
201+ for ( const key in attributes ) {
202+ const value = attributes [ key ] ;
203+ if ( value === null ) {
204+ delete this . globalAttributes [ key ] ;
205+ } else {
206+ const currentNumber = Object . keys ( this . globalAttributes ) . length ;
207+ const { checkAttributes } = EventChecker ;
208+ const result = checkAttributes ( currentNumber , key , value ) ;
209+ if ( result . error_code > 0 ) {
210+ this . recordClickstreamError ( result ) ;
211+ } else {
212+ this . globalAttributes [ key ] = value ;
213+ }
214+ }
215+ }
216+ }
217+
218+ recordClickstreamError ( error : EventError ) {
219+ const { ERROR_CODE , ERROR_MESSAGE } = Event . ReservedAttribute ;
220+ const errorEvent = this . createEvent ( {
221+ name : Event . PresetEvent . CLICKSTREAM_ERROR ,
222+ attributes : {
223+ [ ERROR_CODE ] : error . error_code ,
224+ [ ERROR_MESSAGE ] : error . error_message ,
225+ } ,
226+ } ) ;
227+ this . recordEvent ( errorEvent ) ;
228+ }
229+
230+ recordProfileSet ( ) {
231+ const profileSetEvent = this . createEvent ( {
232+ name : Event . PresetEvent . PROFILE_SET ,
233+ } ) ;
234+ this . recordEvent ( profileSetEvent ) ;
206235 }
207236
208237 startTimer ( ) {
0 commit comments