@dereekb/dbx-analytics 0.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +4 -5
  2. package/esm2020/lib/action/analytics.action.directive.mjs +15 -15
  3. package/esm2020/lib/action/analytics.action.module.mjs +9 -9
  4. package/esm2020/lib/analytics/analytics.mjs +2 -0
  5. package/esm2020/lib/analytics/analytics.module.mjs +23 -0
  6. package/esm2020/lib/analytics/analytics.service.mjs +190 -0
  7. package/esm2020/lib/analytics/analytics.stream.mjs +13 -0
  8. package/esm2020/lib/analytics/index.mjs +5 -0
  9. package/esm2020/lib/index.mjs +2 -4
  10. package/esm2020/lib/providers/index.mjs +2 -0
  11. package/esm2020/lib/providers/segment/index.mjs +4 -0
  12. package/esm2020/lib/providers/segment/segment.listener.service.mjs +92 -0
  13. package/esm2020/lib/providers/segment/segment.module.mjs +28 -0
  14. package/esm2020/lib/providers/segment/segment.service.mjs +61 -0
  15. package/fesm2015/dereekb-dbx-analytics.mjs +236 -58
  16. package/fesm2015/dereekb-dbx-analytics.mjs.map +1 -1
  17. package/fesm2020/dereekb-dbx-analytics.mjs +239 -58
  18. package/fesm2020/dereekb-dbx-analytics.mjs.map +1 -1
  19. package/lib/action/analytics.action.directive.d.ts +15 -15
  20. package/lib/action/analytics.action.module.d.ts +4 -4
  21. package/lib/{analytics.d.ts → analytics/analytics.d.ts} +0 -0
  22. package/lib/analytics/analytics.module.d.ts +14 -0
  23. package/lib/{analytics.service.d.ts → analytics/analytics.service.d.ts} +25 -21
  24. package/lib/{analytics.stream.d.ts → analytics/analytics.stream.d.ts} +0 -0
  25. package/lib/analytics/index.d.ts +4 -0
  26. package/lib/index.d.ts +1 -3
  27. package/lib/providers/index.d.ts +1 -0
  28. package/lib/providers/segment/index.d.ts +3 -0
  29. package/lib/providers/segment/segment.listener.service.d.ts +18 -0
  30. package/lib/providers/segment/segment.module.d.ts +8 -0
  31. package/lib/providers/segment/segment.service.d.ts +27 -0
  32. package/package.json +15 -14
  33. package/esm2020/lib/analytics.mjs +0 -2
  34. package/esm2020/lib/analytics.module.mjs +0 -23
  35. package/esm2020/lib/analytics.service.mjs +0 -179
  36. package/esm2020/lib/analytics.stream.mjs +0 -13
  37. package/lib/analytics.module.d.ts +0 -14
@@ -0,0 +1,61 @@
1
+ import { Injectable, InjectionToken, Inject } from '@angular/core';
2
+ import { AbstractAsyncWindowLoadedService } from '@dereekb/browser';
3
+ import { poll } from '@dereekb/util';
4
+ import * as i0 from "@angular/core";
5
+ export const PRELOAD_SEGMENT_TOKEN = new InjectionToken('PreLoadSegmentService');
6
+ export class SegmentApiServiceConfig {
7
+ constructor(writeKey) {
8
+ this.writeKey = writeKey;
9
+ this.logging = true;
10
+ this.active = true;
11
+ }
12
+ }
13
+ /**
14
+ * Segment API Service used for waiting/retrieving the segment API from window when initialized.
15
+ *
16
+ * This requires some setup in index.html.
17
+ */
18
+ export class SegmentApiService extends AbstractAsyncWindowLoadedService {
19
+ constructor(_config, preload = true) {
20
+ super(SegmentApiService.SEGMENT_API_WINDOW_KEY, undefined, 'Segment', preload);
21
+ this._config = _config;
22
+ }
23
+ get config() {
24
+ return this._config;
25
+ }
26
+ _prepareCompleteLoadingService() {
27
+ return poll({
28
+ // poll until analytics.invoked is true.
29
+ check: () => Boolean(window.analytics?.invoked),
30
+ timesToGiveup: 100
31
+ });
32
+ }
33
+ _initService(service) {
34
+ return new Promise((resolve, reject) => {
35
+ try {
36
+ service.load(this._config.writeKey); // Initialize Segment
37
+ // Wait for the service to ready itself.
38
+ service.ready(() => {
39
+ // Segment changes itself or rather the target, and the previous initial target is ignored after.
40
+ const segment = window[SegmentApiService.SEGMENT_API_WINDOW_KEY];
41
+ resolve(segment);
42
+ });
43
+ }
44
+ catch (e) {
45
+ console.log('Failed to init segment: ' + e);
46
+ reject(e);
47
+ }
48
+ });
49
+ }
50
+ }
51
+ SegmentApiService.SEGMENT_API_WINDOW_KEY = 'analytics';
52
+ SegmentApiService.SEGMENT_READY_KEY = 'SegmentReady';
53
+ SegmentApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService, deps: [{ token: SegmentApiServiceConfig }, { token: PRELOAD_SEGMENT_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable });
54
+ SegmentApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService, decorators: [{
56
+ type: Injectable
57
+ }], ctorParameters: function () { return [{ type: SegmentApiServiceConfig }, { type: undefined, decorators: [{
58
+ type: Inject,
59
+ args: [PRELOAD_SEGMENT_TOKEN]
60
+ }] }]; } });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWFuYWx5dGljcy9zcmMvbGliL3Byb3ZpZGVycy9zZWdtZW50L3NlZ21lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFckMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQVMsdUJBQXVCLENBQUMsQ0FBQztBQUV6RixNQUFNLE9BQU8sdUJBQXVCO0lBR2xDLFlBQW1CLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFGbkMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLFdBQU0sR0FBRyxJQUFJLENBQUM7SUFDeUIsQ0FBQztDQUN6QztBQUdEOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsZ0NBQThEO0lBS25HLFlBQW9CLE9BQWdDLEVBQWlDLFVBQW1CLElBQUk7UUFDMUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFEN0QsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFFcEQsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRWtCLDhCQUE4QjtRQUMvQyxPQUFPLElBQUksQ0FBQztZQUNWLHdDQUF3QztZQUN4QyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFFLE1BQU0sQ0FBQyxTQUFpQixFQUFFLE9BQU8sQ0FBQztZQUN4RCxhQUFhLEVBQUUsR0FBRztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRWtCLFlBQVksQ0FBQyxPQUFxQztRQUNuRSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUk7Z0JBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMscUJBQXFCO2dCQUUxRCx3Q0FBd0M7Z0JBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNqQixpR0FBaUc7b0JBQ2pHLE1BQU0sT0FBTyxHQUFpQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQkFDL0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7O0FBcENlLHdDQUFzQixHQUFHLFdBQVksQ0FBQTtBQUNyQyxtQ0FBaUIsR0FBRyxjQUFlLENBQUE7OEdBSHhDLGlCQUFpQixrQkFLQyx1QkFBdUIsYUFBVSxxQkFBcUI7a0hBTHhFLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVOzBEQU1vQix1QkFBdUI7MEJBQUcsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEFzeW5jV2luZG93TG9hZGVkU2VydmljZSB9IGZyb20gJ0BkZXJlZWtiL2Jyb3dzZXInO1xuaW1wb3J0IHsgcG9sbCB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuXG5leHBvcnQgY29uc3QgUFJFTE9BRF9TRUdNRU5UX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ1ByZUxvYWRTZWdtZW50U2VydmljZScpO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudEFwaVNlcnZpY2VDb25maWcge1xuICBsb2dnaW5nID0gdHJ1ZTtcbiAgYWN0aXZlID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IocHVibGljIHdyaXRlS2V5OiBzdHJpbmcpIHsgfVxufVxuXG5cbi8qKlxuICogU2VnbWVudCBBUEkgU2VydmljZSB1c2VkIGZvciB3YWl0aW5nL3JldHJpZXZpbmcgdGhlIHNlZ21lbnQgQVBJIGZyb20gd2luZG93IHdoZW4gaW5pdGlhbGl6ZWQuXG4gKlxuICogVGhpcyByZXF1aXJlcyBzb21lIHNldHVwIGluIGluZGV4Lmh0bWwuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWdtZW50QXBpU2VydmljZSBleHRlbmRzIEFic3RyYWN0QXN5bmNXaW5kb3dMb2FkZWRTZXJ2aWNlPFNlZ21lbnRBbmFseXRpY3MuQW5hbHl0aWNzSlM+IHtcblxuICBzdGF0aWMgcmVhZG9ubHkgU0VHTUVOVF9BUElfV0lORE9XX0tFWSA9ICdhbmFseXRpY3MnO1xuICBzdGF0aWMgcmVhZG9ubHkgU0VHTUVOVF9SRUFEWV9LRVkgPSAnU2VnbWVudFJlYWR5JztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25maWc6IFNlZ21lbnRBcGlTZXJ2aWNlQ29uZmlnLCBASW5qZWN0KFBSRUxPQURfU0VHTUVOVF9UT0tFTikgcHJlbG9hZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlcihTZWdtZW50QXBpU2VydmljZS5TRUdNRU5UX0FQSV9XSU5ET1dfS0VZLCB1bmRlZmluZWQsICdTZWdtZW50JywgcHJlbG9hZCk7XG4gIH1cblxuICBnZXQgY29uZmlnKCk6IFNlZ21lbnRBcGlTZXJ2aWNlQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9wcmVwYXJlQ29tcGxldGVMb2FkaW5nU2VydmljZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcG9sbCh7XG4gICAgICAvLyBwb2xsIHVudGlsIGFuYWx5dGljcy5pbnZva2VkIGlzIHRydWUuXG4gICAgICBjaGVjazogKCkgPT4gQm9vbGVhbigod2luZG93LmFuYWx5dGljcyBhcyBhbnkpPy5pbnZva2VkKSxcbiAgICAgIHRpbWVzVG9HaXZldXA6IDEwMFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9pbml0U2VydmljZShzZXJ2aWNlOiBTZWdtZW50QW5hbHl0aWNzLkFuYWx5dGljc0pTKTogUHJvbWlzZTxTZWdtZW50QW5hbHl0aWNzLkFuYWx5dGljc0pTPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlcnZpY2UubG9hZCh0aGlzLl9jb25maWcud3JpdGVLZXkpOyAvLyBJbml0aWFsaXplIFNlZ21lbnRcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgc2VydmljZSB0byByZWFkeSBpdHNlbGYuXG4gICAgICAgIHNlcnZpY2UucmVhZHkoKCkgPT4ge1xuICAgICAgICAgIC8vIFNlZ21lbnQgY2hhbmdlcyBpdHNlbGYgb3IgcmF0aGVyIHRoZSB0YXJnZXQsIGFuZCB0aGUgcHJldmlvdXMgaW5pdGlhbCB0YXJnZXQgaXMgaWdub3JlZCBhZnRlci5cbiAgICAgICAgICBjb25zdCBzZWdtZW50OiBTZWdtZW50QW5hbHl0aWNzLkFuYWx5dGljc0pTID0gd2luZG93W1NlZ21lbnRBcGlTZXJ2aWNlLlNFR01FTlRfQVBJX1dJTkRPV19LRVldO1xuICAgICAgICAgIHJlc29sdmUoc2VnbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGluaXQgc2VnbWVudDogJyArIGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG59XG4iXX0=
@@ -1,10 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Optional, Inject, Directive, Host, Input, NgModule } from '@angular/core';
2
+ import { Injectable, Optional, Inject, Directive, Host, Input, NgModule, InjectionToken } from '@angular/core';
3
3
  import { SubscriptionObject, filterMaybe } from '@dereekb/rxjs';
4
- import { filter, switchMap, shareReplay, first, tap } from 'rxjs/operators';
5
- import { Subject, BehaviorSubject, of, merge } from 'rxjs';
4
+ import { shareReplay, switchMap, first, tap } from 'rxjs/operators';
5
+ import { BehaviorSubject, Subject, of, merge, combineLatest } from 'rxjs';
6
6
  import * as i1 from '@dereekb/dbx-core';
7
7
  import { AbstractSubscriptionDirective } from '@dereekb/dbx-core';
8
+ import { AbstractAsyncWindowLoadedService } from '@dereekb/browser';
9
+ import { poll } from '@dereekb/util';
8
10
 
9
11
  var AnalyticsStreamEventType;
10
12
  (function (AnalyticsStreamEventType) {
@@ -19,28 +21,39 @@ var AnalyticsStreamEventType;
19
21
  AnalyticsStreamEventType[AnalyticsStreamEventType["Event"] = 6] = "Event";
20
22
  })(AnalyticsStreamEventType || (AnalyticsStreamEventType = {}));
21
23
 
22
- class DbNgxAnalyticsEventEmitterService {
24
+ class AnalyticsEventEmitterService {
23
25
  }
24
- class DbNgxAnalyticsEventStreamService {
26
+ class AnalyticsEventStreamService {
25
27
  }
26
- class DbNgxAnalyticsUserSource {
28
+ class AnalyticsUserSource {
27
29
  }
28
- class DbNgxAnalyticsServiceListener {
30
+ class AnalyticsServiceListener {
29
31
  }
32
+ /**
33
+ * Abstract AnalyticsServiceListener implementation.
34
+ */
30
35
  class AbstractAnalyticsServiceListener {
31
36
  constructor() {
32
37
  this._sub = new SubscriptionObject();
38
+ this._analytics = new BehaviorSubject(undefined);
39
+ this.analytics$ = this._analytics.pipe(filterMaybe(), shareReplay(1));
40
+ this.analyticsEvents$ = this.analytics$.pipe(switchMap(x => x.events$), shareReplay(1));
33
41
  }
42
+ // MARK: AnalyticsServiceListener
34
43
  listenToService(service) {
35
- this._service = service;
36
- this._sub.subscription = service.events$.pipe(filter((e) => this.filterEvent(e)))
37
- .subscribe((event) => this.updateOnStreamEvent(event));
44
+ this._analytics.next(service);
45
+ const sub = this._initializeServiceSubscription();
46
+ if (sub !== false) {
47
+ this._sub.subscription = sub;
48
+ }
38
49
  }
39
- filterEvent(streamEvent) {
40
- return true;
50
+ // MARK: Destroy
51
+ destroy() {
52
+ this._analytics.complete();
53
+ this._sub.destroy();
41
54
  }
42
55
  }
43
- class DbNgxAnalyticsServiceConfiguration {
56
+ class AnalyticsServiceConfiguration {
44
57
  constructor() {
45
58
  this.listeners = [];
46
59
  }
@@ -60,7 +73,7 @@ class AnalyticsStreamEventAnalyticsEventWrapper {
60
73
  /**
61
74
  * Primary analytics service that emits analytics events that components can listen to.
62
75
  */
63
- class DbNgxAnalyticsService {
76
+ class AnalyticsService {
64
77
  constructor(_config, userSource = _config.userSource) {
65
78
  this._config = _config;
66
79
  this._subject = new Subject();
@@ -88,25 +101,25 @@ class DbNgxAnalyticsService {
88
101
  setUserSource(source) {
89
102
  this._userSource.next(source);
90
103
  }
91
- // MARK: DbNgxAnalyticsEventEmitterService
104
+ // MARK: AnalyticsEventEmitterService
92
105
  /**
93
106
  * Sends an event.
94
107
  */
95
108
  sendNewUserEvent(user, data) {
96
109
  this.sendNextEvent({
97
- name: DbNgxAnalyticsService.USER_REGISTRATION_EVENT_NAME,
110
+ name: AnalyticsService.USER_REGISTRATION_EVENT_NAME,
98
111
  data
99
112
  }, AnalyticsStreamEventType.NewUserEvent, user);
100
113
  }
101
114
  sendUserLoginEvent(user, data) {
102
115
  this.sendNextEvent({
103
- name: DbNgxAnalyticsService.USER_LOGIN_EVENT_NAME,
116
+ name: AnalyticsService.USER_LOGIN_EVENT_NAME,
104
117
  data
105
118
  }, AnalyticsStreamEventType.UserLoginEvent, user);
106
119
  }
107
120
  sendUserLogoutEvent(data, clearUser = true) {
108
121
  this.sendNextEvent({
109
- name: DbNgxAnalyticsService.USER_LOGOUT_EVENT_NAME,
122
+ name: AnalyticsService.USER_LOGOUT_EVENT_NAME,
110
123
  data
111
124
  }, AnalyticsStreamEventType.UserLogoutEvent);
112
125
  if (clearUser) {
@@ -115,7 +128,7 @@ class DbNgxAnalyticsService {
115
128
  }
116
129
  sendUserPropertiesEvent(user, data) {
117
130
  this.sendNextEvent({
118
- name: DbNgxAnalyticsService.USER_PROPERTIES_EVENT_NAME,
131
+ name: AnalyticsService.USER_PROPERTIES_EVENT_NAME,
119
132
  data
120
133
  }, AnalyticsStreamEventType.UserPropertiesEvent, user);
121
134
  }
@@ -158,13 +171,13 @@ class DbNgxAnalyticsService {
158
171
  });
159
172
  }
160
173
  else {
161
- console.warn('DbNgxAnalyticsService: Analytics not in production mode. All analytics events are ignored.');
174
+ console.warn('AnalyticsService: Analytics not in production mode. All analytics events are ignored.');
162
175
  }
163
176
  if (this._config.logEvents || !this._config.isProduction) {
164
- console.log('DbNgxAnalyticsService: Log analytics events enabled.');
177
+ console.log('AnalyticsService: Log analytics events enabled.');
165
178
  // Create a new subscription
166
179
  this._loggerSub.subscription = this._subject.subscribe((x) => {
167
- console.log(`DbNgxAnalyticsService: Analytics Event - ${AnalyticsStreamEventType[x.type]} User: ${x.userId} Data: ${JSON.stringify(x.event)}.`);
180
+ console.log(`AnalyticsService: Analytics Event - ${AnalyticsStreamEventType[x.type]} User: ${x.userId} Data: ${JSON.stringify(x.event)}.`);
168
181
  });
169
182
  }
170
183
  this._userSourceSub.subscription = this.user$.subscribe(() => {
@@ -177,34 +190,34 @@ class DbNgxAnalyticsService {
177
190
  }
178
191
  }
179
192
  // TODO: Make these configurable.
180
- DbNgxAnalyticsService.USER_REGISTRATION_EVENT_NAME = 'User Registered';
181
- DbNgxAnalyticsService.USER_LOGIN_EVENT_NAME = 'User Login';
182
- DbNgxAnalyticsService.USER_LOGOUT_EVENT_NAME = 'User Logout';
183
- DbNgxAnalyticsService.USER_PROPERTIES_EVENT_NAME = 'User Properties';
184
- DbNgxAnalyticsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsService, deps: [{ token: DbNgxAnalyticsServiceConfiguration }, { token: DbNgxAnalyticsUserSource, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
185
- DbNgxAnalyticsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsService });
186
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsService, decorators: [{
193
+ AnalyticsService.USER_REGISTRATION_EVENT_NAME = 'User Registered';
194
+ AnalyticsService.USER_LOGIN_EVENT_NAME = 'User Login';
195
+ AnalyticsService.USER_LOGOUT_EVENT_NAME = 'User Logout';
196
+ AnalyticsService.USER_PROPERTIES_EVENT_NAME = 'User Properties';
197
+ AnalyticsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsService, deps: [{ token: AnalyticsServiceConfiguration }, { token: AnalyticsUserSource, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
198
+ AnalyticsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsService });
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsService, decorators: [{
187
200
  type: Injectable
188
201
  }], ctorParameters: function () {
189
- return [{ type: DbNgxAnalyticsServiceConfiguration }, { type: undefined, decorators: [{
202
+ return [{ type: AnalyticsServiceConfiguration }, { type: undefined, decorators: [{
190
203
  type: Optional
191
204
  }, {
192
205
  type: Inject,
193
- args: [DbNgxAnalyticsUserSource]
206
+ args: [AnalyticsUserSource]
194
207
  }] }];
195
208
  } });
196
209
 
197
- var DbNgxActionAnalyticsTriggerType;
198
- (function (DbNgxActionAnalyticsTriggerType) {
199
- DbNgxActionAnalyticsTriggerType[DbNgxActionAnalyticsTriggerType["TRIGGER"] = 0] = "TRIGGER";
200
- DbNgxActionAnalyticsTriggerType[DbNgxActionAnalyticsTriggerType["READY"] = 1] = "READY";
201
- DbNgxActionAnalyticsTriggerType[DbNgxActionAnalyticsTriggerType["SUCCESS"] = 2] = "SUCCESS";
202
- DbNgxActionAnalyticsTriggerType[DbNgxActionAnalyticsTriggerType["ERROR"] = 3] = "ERROR";
203
- })(DbNgxActionAnalyticsTriggerType || (DbNgxActionAnalyticsTriggerType = {}));
210
+ var DbxActionAnalyticsTriggerType;
211
+ (function (DbxActionAnalyticsTriggerType) {
212
+ DbxActionAnalyticsTriggerType[DbxActionAnalyticsTriggerType["TRIGGER"] = 0] = "TRIGGER";
213
+ DbxActionAnalyticsTriggerType[DbxActionAnalyticsTriggerType["READY"] = 1] = "READY";
214
+ DbxActionAnalyticsTriggerType[DbxActionAnalyticsTriggerType["SUCCESS"] = 2] = "SUCCESS";
215
+ DbxActionAnalyticsTriggerType[DbxActionAnalyticsTriggerType["ERROR"] = 3] = "ERROR";
216
+ })(DbxActionAnalyticsTriggerType || (DbxActionAnalyticsTriggerType = {}));
204
217
  /**
205
218
  * Used to listen to an ActionContext and send analytical events based on action events.
206
219
  */
207
- class DbNgxActionAnalyticsDirective extends AbstractSubscriptionDirective {
220
+ class DbxActionAnalyticsDirective extends AbstractSubscriptionDirective {
208
221
  constructor(source, analyticsService) {
209
222
  super();
210
223
  this.source = source;
@@ -248,9 +261,9 @@ class DbNgxActionAnalyticsDirective extends AbstractSubscriptionDirective {
248
261
  });
249
262
  }
250
263
  }
251
- DbNgxActionAnalyticsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxActionAnalyticsDirective, deps: [{ token: i1.ActionContextStoreSourceInstance, host: true }, { token: DbNgxAnalyticsService }], target: i0.ɵɵFactoryTarget.Directive });
252
- DbNgxActionAnalyticsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.0", type: DbNgxActionAnalyticsDirective, selector: "[dbxActionAnalytics]", inputs: { config: ["dbxActionAnalytics", "config"] }, usesInheritance: true, ngImport: i0 });
253
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxActionAnalyticsDirective, decorators: [{
264
+ DbxActionAnalyticsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxActionAnalyticsDirective, deps: [{ token: i1.ActionContextStoreSourceInstance, host: true }, { token: AnalyticsService }], target: i0.ɵɵFactoryTarget.Directive });
265
+ DbxActionAnalyticsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.4", type: DbxActionAnalyticsDirective, selector: "[dbxActionAnalytics]", inputs: { config: ["dbxActionAnalytics", "config"] }, usesInheritance: true, ngImport: i0 });
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxActionAnalyticsDirective, decorators: [{
254
267
  type: Directive,
255
268
  args: [{
256
269
  selector: '[dbxActionAnalytics]',
@@ -258,52 +271,217 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImpor
258
271
  }], ctorParameters: function () {
259
272
  return [{ type: i1.ActionContextStoreSourceInstance, decorators: [{
260
273
  type: Host
261
- }] }, { type: DbNgxAnalyticsService }];
274
+ }] }, { type: AnalyticsService }];
262
275
  }, propDecorators: { config: [{
263
276
  type: Input,
264
277
  args: ['dbxActionAnalytics']
265
278
  }] } });
266
279
 
267
- class DbNgxAnalyticsActionModule {
280
+ class AnalyticsActionModule {
268
281
  }
269
- DbNgxAnalyticsActionModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
270
- DbNgxAnalyticsActionModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsActionModule, declarations: [DbNgxActionAnalyticsDirective], exports: [DbNgxActionAnalyticsDirective] });
271
- DbNgxAnalyticsActionModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsActionModule });
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsActionModule, decorators: [{
282
+ AnalyticsActionModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
283
+ AnalyticsActionModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsActionModule, declarations: [DbxActionAnalyticsDirective], exports: [DbxActionAnalyticsDirective] });
284
+ AnalyticsActionModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsActionModule });
285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: AnalyticsActionModule, decorators: [{
273
286
  type: NgModule,
274
287
  args: [{
275
288
  declarations: [
276
- DbNgxActionAnalyticsDirective
289
+ DbxActionAnalyticsDirective
277
290
  ],
278
291
  exports: [
279
- DbNgxActionAnalyticsDirective
292
+ DbxActionAnalyticsDirective
280
293
  ]
281
294
  }]
282
295
  }] });
283
296
 
284
- class DbNgxAnalyticsModule {
297
+ class DbxAnalyticsModule {
285
298
  static forRoot(options) {
286
299
  return {
287
- ngModule: DbNgxAnalyticsModule,
300
+ ngModule: DbxAnalyticsModule,
288
301
  providers: [
289
302
  // Configuration
290
303
  options.analyticsConfigurationProvider,
291
304
  // Service
292
- DbNgxAnalyticsService
305
+ AnalyticsService
293
306
  ]
294
307
  };
295
308
  }
296
309
  }
297
- DbNgxAnalyticsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
298
- DbNgxAnalyticsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsModule });
299
- DbNgxAnalyticsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsModule });
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: DbNgxAnalyticsModule, decorators: [{
310
+ DbxAnalyticsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxAnalyticsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
311
+ DbxAnalyticsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxAnalyticsModule });
312
+ DbxAnalyticsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxAnalyticsModule });
313
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: DbxAnalyticsModule, decorators: [{
301
314
  type: NgModule
302
315
  }] });
303
316
 
317
+ const PRELOAD_SEGMENT_TOKEN = new InjectionToken('PreLoadSegmentService');
318
+ class SegmentApiServiceConfig {
319
+ constructor(writeKey) {
320
+ this.writeKey = writeKey;
321
+ this.logging = true;
322
+ this.active = true;
323
+ }
324
+ }
325
+ /**
326
+ * Segment API Service used for waiting/retrieving the segment API from window when initialized.
327
+ *
328
+ * This requires some setup in index.html.
329
+ */
330
+ class SegmentApiService extends AbstractAsyncWindowLoadedService {
331
+ constructor(_config, preload = true) {
332
+ super(SegmentApiService.SEGMENT_API_WINDOW_KEY, undefined, 'Segment', preload);
333
+ this._config = _config;
334
+ }
335
+ get config() {
336
+ return this._config;
337
+ }
338
+ _prepareCompleteLoadingService() {
339
+ return poll({
340
+ // poll until analytics.invoked is true.
341
+ check: () => { var _a; return Boolean((_a = window.analytics) === null || _a === void 0 ? void 0 : _a.invoked); },
342
+ timesToGiveup: 100
343
+ });
344
+ }
345
+ _initService(service) {
346
+ return new Promise((resolve, reject) => {
347
+ try {
348
+ service.load(this._config.writeKey); // Initialize Segment
349
+ // Wait for the service to ready itself.
350
+ service.ready(() => {
351
+ // Segment changes itself or rather the target, and the previous initial target is ignored after.
352
+ const segment = window[SegmentApiService.SEGMENT_API_WINDOW_KEY];
353
+ resolve(segment);
354
+ });
355
+ }
356
+ catch (e) {
357
+ console.log('Failed to init segment: ' + e);
358
+ reject(e);
359
+ }
360
+ });
361
+ }
362
+ }
363
+ SegmentApiService.SEGMENT_API_WINDOW_KEY = 'analytics';
364
+ SegmentApiService.SEGMENT_READY_KEY = 'SegmentReady';
365
+ SegmentApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService, deps: [{ token: SegmentApiServiceConfig }, { token: PRELOAD_SEGMENT_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable });
366
+ SegmentApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService });
367
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentApiService, decorators: [{
368
+ type: Injectable
369
+ }], ctorParameters: function () {
370
+ return [{ type: SegmentApiServiceConfig }, { type: undefined, decorators: [{
371
+ type: Inject,
372
+ args: [PRELOAD_SEGMENT_TOKEN]
373
+ }] }];
374
+ } });
375
+
376
+ /**
377
+ * AnalyticsServiceListener adapter for Segment.
378
+ */
379
+ class SegmentAnalyticsListenerService extends AbstractAnalyticsServiceListener {
380
+ constructor(_segmentApi) {
381
+ super();
382
+ this._segmentApi = _segmentApi;
383
+ if (this._segmentApi.config.logging) {
384
+ console.log('SegmentAnalyticsListenerService: Segment is logging events.');
385
+ }
386
+ if (this._segmentApi.config.active) {
387
+ console.log('SegmentAnalyticsListenerService: Segment is disabled from sending events to the server.');
388
+ }
389
+ }
390
+ _initializeServiceSubscription() {
391
+ return combineLatest([this._segmentApi.service$, this.analyticsEvents$]).subscribe(([segment, streamEvent]) => {
392
+ if (this._segmentApi.config.logging) {
393
+ console.log('Segment Listener Logging Event: ', streamEvent);
394
+ }
395
+ if (this._segmentApi.config.active) {
396
+ this.handleStreamEvent(segment, streamEvent);
397
+ }
398
+ });
399
+ }
400
+ handleStreamEvent(api, streamEvent) {
401
+ switch (streamEvent.type) {
402
+ case AnalyticsStreamEventType.NewUserEvent:
403
+ this.updateWithNewUserEvent(api, streamEvent);
404
+ break;
405
+ case AnalyticsStreamEventType.UserLoginEvent:
406
+ case AnalyticsStreamEventType.Event:
407
+ this.updateWithEvent(api, streamEvent);
408
+ break;
409
+ case AnalyticsStreamEventType.UserLogoutEvent:
410
+ this.changeUser(api, undefined);
411
+ break;
412
+ case AnalyticsStreamEventType.PageView:
413
+ api.page();
414
+ break;
415
+ case AnalyticsStreamEventType.UserChange:
416
+ this.changeUser(api, streamEvent.user);
417
+ break;
418
+ }
419
+ }
420
+ updateWithNewUserEvent(api, streamEvent) {
421
+ this.changeUser(api, streamEvent.user);
422
+ }
423
+ updateWithEvent(api, streamEvent, name) {
424
+ const event = streamEvent.event;
425
+ const eventName = name || (event === null || event === void 0 ? void 0 : event.name);
426
+ if (eventName) {
427
+ const value = event === null || event === void 0 ? void 0 : event.value;
428
+ const data = event === null || event === void 0 ? void 0 : event.data;
429
+ api.track(eventName, Object.assign(Object.assign({}, (value != null) ? {
430
+ value
431
+ } : undefined), data), {}, () => {
432
+ if (this._segmentApi.config.logging) {
433
+ console.log('Segment track success.');
434
+ }
435
+ });
436
+ }
437
+ }
438
+ changeUser(api, user) {
439
+ if (user) {
440
+ api.identify(user.user, Object.assign({}, user.properties), {}, () => {
441
+ if (this._segmentApi.config.logging) {
442
+ console.log('Segment identify success.');
443
+ }
444
+ });
445
+ }
446
+ else {
447
+ api.reset();
448
+ }
449
+ }
450
+ }
451
+ SegmentAnalyticsListenerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentAnalyticsListenerService, deps: [{ token: SegmentApiService }], target: i0.ɵɵFactoryTarget.Injectable });
452
+ SegmentAnalyticsListenerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentAnalyticsListenerService });
453
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentAnalyticsListenerService, decorators: [{
454
+ type: Injectable
455
+ }], ctorParameters: function () { return [{ type: SegmentApiService }]; } });
456
+
457
+ class SegmentModule {
458
+ static forRoot(preloadService) {
459
+ return {
460
+ ngModule: SegmentModule,
461
+ providers: [
462
+ {
463
+ provide: PRELOAD_SEGMENT_TOKEN,
464
+ useValue: preloadService
465
+ },
466
+ SegmentApiService
467
+ ]
468
+ };
469
+ }
470
+ }
471
+ SegmentModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
472
+ SegmentModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentModule });
473
+ SegmentModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentModule, imports: [[]] });
474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SegmentModule, decorators: [{
475
+ type: NgModule,
476
+ args: [{
477
+ declarations: [],
478
+ imports: []
479
+ }]
480
+ }] });
481
+
304
482
  /**
305
483
  * Generated bundle index. Do not edit.
306
484
  */
307
485
 
308
- export { AbstractAnalyticsServiceListener, AnalyticsStreamEventAnalyticsEventWrapper, AnalyticsStreamEventType, DbNgxActionAnalyticsDirective, DbNgxActionAnalyticsTriggerType, DbNgxAnalyticsActionModule, DbNgxAnalyticsEventEmitterService, DbNgxAnalyticsEventStreamService, DbNgxAnalyticsModule, DbNgxAnalyticsService, DbNgxAnalyticsServiceConfiguration, DbNgxAnalyticsServiceListener, DbNgxAnalyticsUserSource };
486
+ export { AbstractAnalyticsServiceListener, AnalyticsActionModule, AnalyticsEventEmitterService, AnalyticsEventStreamService, AnalyticsService, AnalyticsServiceConfiguration, AnalyticsServiceListener, AnalyticsStreamEventAnalyticsEventWrapper, AnalyticsStreamEventType, AnalyticsUserSource, DbxActionAnalyticsDirective, DbxActionAnalyticsTriggerType, DbxAnalyticsModule, PRELOAD_SEGMENT_TOKEN, SegmentAnalyticsListenerService, SegmentApiService, SegmentApiServiceConfig, SegmentModule };
309
487
  //# sourceMappingURL=dereekb-dbx-analytics.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dereekb-dbx-analytics.mjs","sources":["../../../../packages/dbx-analytics/src/lib/analytics.stream.ts","../../../../packages/dbx-analytics/src/lib/analytics.service.ts","../../../../packages/dbx-analytics/src/lib/action/analytics.action.directive.ts","../../../../packages/dbx-analytics/src/lib/action/analytics.action.module.ts","../../../../packages/dbx-analytics/src/lib/analytics.module.ts","../../../../packages/dbx-analytics/src/dereekb-dbx-analytics.ts"],"sourcesContent":["import { Maybe } from \"@dereekb/util\";\nimport { AnalyticsUser, UserAnalyticsEvent, AnalyticsUserId } from \"./analytics\";\n\nexport enum AnalyticsStreamEventType {\n\n PageView,\n UserChange,\n\n // User Events\n NewUserEvent,\n UserLoginEvent,\n UserLogoutEvent,\n UserPropertiesEvent,\n\n // Events\n Event\n\n}\n\nexport interface AnalyticsStreamEvent {\n readonly type: AnalyticsStreamEventType;\n readonly user?: Maybe<AnalyticsUser>;\n readonly event?: UserAnalyticsEvent;\n readonly userId?: AnalyticsUserId;\n}\n","import { Observable, Subject, BehaviorSubject, of } from 'rxjs';\nimport { filter, first, shareReplay, switchMap } from 'rxjs/operators';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { SubscriptionObject } from '@dereekb/rxjs';\nimport { AnalyticsEvent, AnalyticsEventData, AnalyticsEventName, AnalyticsUser, NewUserAnalyticsEventData, UserAnalyticsEvent } from './analytics';\nimport { AnalyticsStreamEvent, AnalyticsStreamEventType } from './analytics.stream';\nimport { Maybe, Destroyable } from '@dereekb/util';\n\nexport abstract class DbNgxAnalyticsEventEmitterService {\n abstract sendNewUserEvent(user: AnalyticsUser, data: NewUserAnalyticsEventData): void;\n abstract sendUserLoginEvent(user: AnalyticsUser, data?: AnalyticsEventData): void;\n abstract sendUserLogoutEvent(data?: AnalyticsEventData): void;\n abstract sendUserPropertiesEvent(user: AnalyticsUser, data?: AnalyticsEventData): void;\n abstract sendEventData(name: AnalyticsEventName, data?: AnalyticsEventData): void;\n abstract sendEvent(event: AnalyticsEvent): void;\n abstract sendPageView(page?: string): void;\n}\n\nexport abstract class DbNgxAnalyticsEventStreamService {\n abstract readonly events$: Observable<AnalyticsStreamEvent>;\n}\n\nexport abstract class DbNgxAnalyticsUserSource {\n abstract readonly analyticsUser$: Observable<Maybe<AnalyticsUser>>;\n}\n\nexport abstract class DbNgxAnalyticsServiceListener {\n public abstract listenToService(service: DbNgxAnalyticsService): void;\n}\n\nexport abstract class AbstractAnalyticsServiceListener implements DbNgxAnalyticsServiceListener {\n\n protected _service?: DbNgxAnalyticsService;\n protected _sub = new SubscriptionObject();\n\n public listenToService(service: DbNgxAnalyticsService): void {\n this._service = service;\n this._sub.subscription = service.events$.pipe(filter((e) => this.filterEvent(e)))\n .subscribe((event) => this.updateOnStreamEvent(event));\n }\n\n protected filterEvent(streamEvent: AnalyticsStreamEvent): boolean {\n return true;\n }\n\n protected abstract updateOnStreamEvent(event: AnalyticsStreamEvent): void;\n\n}\n\nexport abstract class DbNgxAnalyticsServiceConfiguration {\n listeners: DbNgxAnalyticsServiceListener[] = [];\n isProduction?: boolean;\n logEvents?: boolean;\n userSource?: DbNgxAnalyticsUserSource;\n}\n\nexport class AnalyticsStreamEventAnalyticsEventWrapper implements AnalyticsStreamEvent {\n\n constructor(public readonly event: UserAnalyticsEvent, public readonly type: AnalyticsStreamEventType = AnalyticsStreamEventType.Event) { }\n\n public get user(): Maybe<AnalyticsUser> {\n return this.event.user;\n }\n\n public get userId(): string | undefined {\n return (this.user) ? this.user.user : undefined;\n }\n\n}\n\n/**\n * Primary analytics service that emits analytics events that components can listen to.\n */\n@Injectable()\nexport class DbNgxAnalyticsService implements DbNgxAnalyticsEventStreamService, DbNgxAnalyticsEventEmitterService, Destroyable {\n\n // TODO: Make these configurable.\n\n static readonly USER_REGISTRATION_EVENT_NAME = 'User Registered';\n static readonly USER_LOGIN_EVENT_NAME = 'User Login';\n static readonly USER_LOGOUT_EVENT_NAME = 'User Logout';\n static readonly USER_PROPERTIES_EVENT_NAME = 'User Properties';\n\n private _subject = new Subject<AnalyticsStreamEvent>();\n readonly events$ = this._subject.asObservable();\n\n private _userSource = new BehaviorSubject<Maybe<DbNgxAnalyticsUserSource>>(undefined);\n readonly user$ = this._userSource.pipe(switchMap(x => (x) ? x.analyticsUser$ : of(undefined)), shareReplay(1));\n\n private _userSourceSub = new SubscriptionObject();\n private _loggerSub = new SubscriptionObject();\n\n constructor(\n private _config: DbNgxAnalyticsServiceConfiguration,\n @Optional() @Inject(DbNgxAnalyticsUserSource) userSource: Maybe<DbNgxAnalyticsUserSource> = _config.userSource\n ) {\n this._init();\n\n if (userSource) {\n this.setUserSource(userSource);\n }\n }\n\n // MARK: Source\n /**\n * Sets the user directly.\n */\n public setUser(user: Maybe<AnalyticsUser>): void {\n let source: Maybe<DbNgxAnalyticsUserSource>;\n\n if (user) {\n source = { analyticsUser$: of(user) };\n }\n\n this._userSource.next(source);\n }\n\n public setUserSource(source: DbNgxAnalyticsUserSource): void {\n this._userSource.next(source);\n }\n\n // MARK: DbNgxAnalyticsEventEmitterService\n /**\n * Sends an event.\n */\n public sendNewUserEvent(user: AnalyticsUser, data: NewUserAnalyticsEventData): void {\n this.sendNextEvent({\n name: DbNgxAnalyticsService.USER_REGISTRATION_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.NewUserEvent, user);\n }\n\n public sendUserLoginEvent(user: AnalyticsUser, data?: AnalyticsEventData): void {\n this.sendNextEvent({\n name: DbNgxAnalyticsService.USER_LOGIN_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserLoginEvent, user);\n }\n\n public sendUserLogoutEvent(data?: AnalyticsEventData, clearUser = true): void {\n this.sendNextEvent({\n name: DbNgxAnalyticsService.USER_LOGOUT_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserLogoutEvent);\n\n if (clearUser) {\n this.setUser(undefined);\n }\n }\n\n public sendUserPropertiesEvent(user: AnalyticsUser, data?: AnalyticsEventData): void {\n this.sendNextEvent({\n name: DbNgxAnalyticsService.USER_PROPERTIES_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserPropertiesEvent, user);\n }\n\n public sendEventData(name: AnalyticsEventName, data?: AnalyticsEventData): void {\n return this.sendEvent({\n name,\n data\n });\n }\n\n public sendEventType(eventType: AnalyticsEventName): void {\n this.sendNextEvent({\n name: eventType\n }, AnalyticsStreamEventType.Event);\n }\n\n public sendEvent(event: AnalyticsEvent): void {\n this.sendNextEvent(event, AnalyticsStreamEventType.Event);\n }\n\n public sendPageView(page?: string): void {\n this.sendNextEvent({\n name: page\n }, AnalyticsStreamEventType.PageView);\n }\n\n protected sendNextEvent(event: AnalyticsEvent = {}, type: AnalyticsStreamEventType, userOverride?: AnalyticsUser): void {\n this.user$.pipe(first()).subscribe((analyticsUser) => {\n const user: Maybe<AnalyticsUser> = (userOverride != null) ? userOverride : analyticsUser;\n const analyticsEvent: UserAnalyticsEvent = { ...event, user };\n this.nextEvent(analyticsEvent, type);\n });\n }\n\n protected nextEvent(event: UserAnalyticsEvent, type: AnalyticsStreamEventType): void {\n const wrapper = new AnalyticsStreamEventAnalyticsEventWrapper(event, type);\n this._subject.next(wrapper);\n }\n\n // MARK: Internal\n private _init(): void {\n\n if (this._config.isProduction) {\n // Initialize listeners.\n this._config.listeners.forEach((listener) => {\n listener.listenToService(this);\n });\n } else {\n console.warn('DbNgxAnalyticsService: Analytics not in production mode. All analytics events are ignored.');\n }\n\n if (this._config.logEvents || !this._config.isProduction) {\n console.log('DbNgxAnalyticsService: Log analytics events enabled.');\n\n // Create a new subscription\n this._loggerSub.subscription = this._subject.subscribe((x) => {\n console.log(`DbNgxAnalyticsService: Analytics Event - ${AnalyticsStreamEventType[x.type]} User: ${x.userId} Data: ${JSON.stringify(x.event)}.`);\n });\n }\n\n this._userSourceSub.subscription = this.user$.subscribe(() => {\n this.sendNextEvent({}, AnalyticsStreamEventType.UserChange);\n });\n }\n\n destroy() {\n this._userSourceSub.destroy();\n this._loggerSub.destroy();\n }\n\n}\n","import { filterMaybe } from '@dereekb/rxjs';\nimport { switchMap, tap, shareReplay } from 'rxjs/operators';\nimport { Host, Directive, Input, OnInit, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, merge, Observable, of } from 'rxjs';\nimport { ActionContextStoreSourceInstance, AbstractSubscriptionDirective } from '@dereekb/dbx-core';\nimport { DbNgxAnalyticsService } from '../analytics.service';\nimport { Maybe, ReadableError } from '@dereekb/util';\n\nexport enum DbNgxActionAnalyticsTriggerType {\n TRIGGER,\n READY,\n SUCCESS,\n ERROR\n}\n\nexport interface DbNgxActionAnalyticsConfig<T = any, O = any> {\n onTriggered: (service: DbNgxAnalyticsService) => void;\n onReady: (service: DbNgxAnalyticsService, value: T) => void;\n onSuccess: (service: DbNgxAnalyticsService, value: Maybe<O>) => void;\n onError: (service: DbNgxAnalyticsService, error: Maybe<ReadableError>) => void;\n}\n\n/**\n * Used to listen to an ActionContext and send analytical events based on action events.\n */\n@Directive({\n selector: '[dbxActionAnalytics]',\n})\nexport class DbNgxActionAnalyticsDirective<T> extends AbstractSubscriptionDirective implements OnInit, OnDestroy {\n\n private _config = new BehaviorSubject<Maybe<DbNgxActionAnalyticsConfig>>(undefined);\n readonly config$ = this._config.pipe(filterMaybe(), shareReplay(1));\n\n @Input('dbxActionAnalytics')\n get config(): Maybe<DbNgxActionAnalyticsConfig> {\n return this._config.value;\n }\n\n set config(config: Maybe<DbNgxActionAnalyticsConfig>) {\n this._config.next(config);\n }\n\n constructor(\n @Host() readonly source: ActionContextStoreSourceInstance,\n readonly analyticsService: DbNgxAnalyticsService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.sub = this.config$.pipe(\n switchMap(({ onTriggered, onReady, onSuccess, onError }) => {\n const triggerObs: Observable<any>[] = [];\n\n if (onTriggered) {\n triggerObs.push(this.source.triggered$.pipe(\n tap(() => onTriggered(this.analyticsService))\n ));\n }\n\n if (onReady) {\n triggerObs.push(this.source.valueReady$.pipe(\n tap((value) => onReady(this.analyticsService, value))\n ));\n }\n\n if (onSuccess) {\n triggerObs.push(this.source.success$.pipe(\n tap((result) => onSuccess(this.analyticsService, result))\n ));\n }\n\n if (onError) {\n triggerObs.push(this.source.error$.pipe(\n tap((error) => onError(this.analyticsService, error))\n ));\n }\n\n if (triggerObs.length) {\n return merge(triggerObs);\n } else {\n return of();\n }\n })\n ).subscribe();\n }\n\n override ngOnDestroy(): void {\n this.source.lockSet.onNextUnlock(() => {\n super.ngOnDestroy();\n this._config.complete();\n });\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { DbNgxActionAnalyticsDirective } from './analytics.action.directive';\n\n@NgModule({\n declarations: [\n DbNgxActionAnalyticsDirective\n ],\n exports: [\n DbNgxActionAnalyticsDirective\n ]\n})\nexport class DbNgxAnalyticsActionModule { }\n","import { NgModule, ModuleWithProviders, Provider } from '@angular/core';\nimport { DbNgxAnalyticsService } from './analytics.service';\n\n\nexport interface DbNgxAnalyticsModuleOptions {\n\n /**\n * Provides a AnalyticsServiceConfiguration value.\n */\n analyticsConfigurationProvider: Provider;\n\n}\n\n@NgModule()\nexport class DbNgxAnalyticsModule {\n\n static forRoot(options: DbNgxAnalyticsModuleOptions): ModuleWithProviders<DbNgxAnalyticsModule> {\n return {\n ngModule: DbNgxAnalyticsModule,\n providers: [\n // Configuration\n options.analyticsConfigurationProvider,\n // Service\n DbNgxAnalyticsService\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dereekb-dbx-analytics.mjs","sources":["../../../../packages/dbx-analytics/src/lib/analytics/analytics.stream.ts","../../../../packages/dbx-analytics/src/lib/analytics/analytics.service.ts","../../../../packages/dbx-analytics/src/lib/action/analytics.action.directive.ts","../../../../packages/dbx-analytics/src/lib/action/analytics.action.module.ts","../../../../packages/dbx-analytics/src/lib/analytics/analytics.module.ts","../../../../packages/dbx-analytics/src/lib/providers/segment/segment.service.ts","../../../../packages/dbx-analytics/src/lib/providers/segment/segment.listener.service.ts","../../../../packages/dbx-analytics/src/lib/providers/segment/segment.module.ts","../../../../packages/dbx-analytics/src/dereekb-dbx-analytics.ts"],"sourcesContent":["import { Maybe } from \"@dereekb/util\";\nimport { AnalyticsUser, UserAnalyticsEvent, AnalyticsUserId } from \"./analytics\";\n\nexport enum AnalyticsStreamEventType {\n\n PageView,\n UserChange,\n\n // User Events\n NewUserEvent,\n UserLoginEvent,\n UserLogoutEvent,\n UserPropertiesEvent,\n\n // Events\n Event\n\n}\n\nexport interface AnalyticsStreamEvent {\n readonly type: AnalyticsStreamEventType;\n readonly user?: Maybe<AnalyticsUser>;\n readonly event?: UserAnalyticsEvent;\n readonly userId?: AnalyticsUserId;\n}\n","import { Observable, Subject, BehaviorSubject, of, Subscription } from 'rxjs';\nimport { filter, first, shareReplay, switchMap } from 'rxjs/operators';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { SubscriptionObject, filterMaybe } from '@dereekb/rxjs';\nimport { AnalyticsEvent, AnalyticsEventData, AnalyticsEventName, AnalyticsUser, NewUserAnalyticsEventData, UserAnalyticsEvent } from './analytics';\nimport { AnalyticsStreamEvent, AnalyticsStreamEventType } from './analytics.stream';\nimport { Maybe, Destroyable } from '@dereekb/util';\n\nexport abstract class AnalyticsEventEmitterService {\n abstract sendNewUserEvent(user: AnalyticsUser, data: NewUserAnalyticsEventData): void;\n abstract sendUserLoginEvent(user: AnalyticsUser, data?: AnalyticsEventData): void;\n abstract sendUserLogoutEvent(data?: AnalyticsEventData): void;\n abstract sendUserPropertiesEvent(user: AnalyticsUser, data?: AnalyticsEventData): void;\n abstract sendEventData(name: AnalyticsEventName, data?: AnalyticsEventData): void;\n abstract sendEvent(event: AnalyticsEvent): void;\n abstract sendPageView(page?: string): void;\n}\n\nexport abstract class AnalyticsEventStreamService {\n abstract readonly events$: Observable<AnalyticsStreamEvent>;\n}\n\nexport abstract class AnalyticsUserSource {\n abstract readonly analyticsUser$: Observable<Maybe<AnalyticsUser>>;\n}\n\nexport abstract class AnalyticsServiceListener {\n public abstract listenToService(service: AnalyticsService): void;\n}\n\n/**\n * Abstract AnalyticsServiceListener implementation.\n */\nexport abstract class AbstractAnalyticsServiceListener implements AnalyticsServiceListener, Destroyable {\n\n private _sub = new SubscriptionObject();\n protected _analytics = new BehaviorSubject<Maybe<AnalyticsService>>(undefined);\n\n readonly analytics$ = this._analytics.pipe(filterMaybe(), shareReplay(1));\n readonly analyticsEvents$ = this.analytics$.pipe(switchMap(x => x.events$), shareReplay(1));\n\n // MARK: AnalyticsServiceListener\n listenToService(service: AnalyticsService): void {\n this._analytics.next(service);\n const sub = this._initializeServiceSubscription();\n\n if (sub !== false) {\n this._sub.subscription = sub;\n }\n }\n\n protected abstract _initializeServiceSubscription(): Subscription | false;\n\n // MARK: Destroy\n destroy(): void {\n this._analytics.complete();\n this._sub.destroy();\n }\n\n}\n\nexport abstract class AnalyticsServiceConfiguration {\n listeners: AnalyticsServiceListener[] = [];\n isProduction?: boolean;\n logEvents?: boolean;\n userSource?: AnalyticsUserSource;\n}\n\nexport class AnalyticsStreamEventAnalyticsEventWrapper implements AnalyticsStreamEvent {\n\n constructor(public readonly event: UserAnalyticsEvent, public readonly type: AnalyticsStreamEventType = AnalyticsStreamEventType.Event) { }\n\n public get user(): Maybe<AnalyticsUser> {\n return this.event.user;\n }\n\n public get userId(): string | undefined {\n return (this.user) ? this.user.user : undefined;\n }\n\n}\n\n/**\n * Primary analytics service that emits analytics events that components can listen to.\n */\n@Injectable()\nexport class AnalyticsService implements AnalyticsEventStreamService, AnalyticsEventEmitterService, Destroyable {\n\n // TODO: Make these configurable.\n\n static readonly USER_REGISTRATION_EVENT_NAME = 'User Registered';\n static readonly USER_LOGIN_EVENT_NAME = 'User Login';\n static readonly USER_LOGOUT_EVENT_NAME = 'User Logout';\n static readonly USER_PROPERTIES_EVENT_NAME = 'User Properties';\n\n private _subject = new Subject<AnalyticsStreamEvent>();\n readonly events$ = this._subject.asObservable();\n\n private _userSource = new BehaviorSubject<Maybe<AnalyticsUserSource>>(undefined);\n readonly user$ = this._userSource.pipe(switchMap(x => (x) ? x.analyticsUser$ : of(undefined)), shareReplay(1));\n\n private _userSourceSub = new SubscriptionObject();\n private _loggerSub = new SubscriptionObject();\n\n constructor(\n private _config: AnalyticsServiceConfiguration,\n @Optional() @Inject(AnalyticsUserSource) userSource: Maybe<AnalyticsUserSource> = _config.userSource\n ) {\n this._init();\n\n if (userSource) {\n this.setUserSource(userSource);\n }\n }\n\n // MARK: Source\n /**\n * Sets the user directly.\n */\n public setUser(user: Maybe<AnalyticsUser>): void {\n let source: Maybe<AnalyticsUserSource>;\n\n if (user) {\n source = { analyticsUser$: of(user) };\n }\n\n this._userSource.next(source);\n }\n\n public setUserSource(source: AnalyticsUserSource): void {\n this._userSource.next(source);\n }\n\n // MARK: AnalyticsEventEmitterService\n /**\n * Sends an event.\n */\n public sendNewUserEvent(user: AnalyticsUser, data: NewUserAnalyticsEventData): void {\n this.sendNextEvent({\n name: AnalyticsService.USER_REGISTRATION_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.NewUserEvent, user);\n }\n\n public sendUserLoginEvent(user: AnalyticsUser, data?: AnalyticsEventData): void {\n this.sendNextEvent({\n name: AnalyticsService.USER_LOGIN_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserLoginEvent, user);\n }\n\n public sendUserLogoutEvent(data?: AnalyticsEventData, clearUser = true): void {\n this.sendNextEvent({\n name: AnalyticsService.USER_LOGOUT_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserLogoutEvent);\n\n if (clearUser) {\n this.setUser(undefined);\n }\n }\n\n public sendUserPropertiesEvent(user: AnalyticsUser, data?: AnalyticsEventData): void {\n this.sendNextEvent({\n name: AnalyticsService.USER_PROPERTIES_EVENT_NAME,\n data\n }, AnalyticsStreamEventType.UserPropertiesEvent, user);\n }\n\n public sendEventData(name: AnalyticsEventName, data?: AnalyticsEventData): void {\n return this.sendEvent({\n name,\n data\n });\n }\n\n public sendEventType(eventType: AnalyticsEventName): void {\n this.sendNextEvent({\n name: eventType\n }, AnalyticsStreamEventType.Event);\n }\n\n public sendEvent(event: AnalyticsEvent): void {\n this.sendNextEvent(event, AnalyticsStreamEventType.Event);\n }\n\n public sendPageView(page?: string): void {\n this.sendNextEvent({\n name: page\n }, AnalyticsStreamEventType.PageView);\n }\n\n protected sendNextEvent(event: AnalyticsEvent = {}, type: AnalyticsStreamEventType, userOverride?: AnalyticsUser): void {\n this.user$.pipe(first()).subscribe((analyticsUser) => {\n const user: Maybe<AnalyticsUser> = (userOverride != null) ? userOverride : analyticsUser;\n const analyticsEvent: UserAnalyticsEvent = { ...event, user };\n this.nextEvent(analyticsEvent, type);\n });\n }\n\n protected nextEvent(event: UserAnalyticsEvent, type: AnalyticsStreamEventType): void {\n const wrapper = new AnalyticsStreamEventAnalyticsEventWrapper(event, type);\n this._subject.next(wrapper);\n }\n\n // MARK: Internal\n private _init(): void {\n\n if (this._config.isProduction) {\n // Initialize listeners.\n this._config.listeners.forEach((listener) => {\n listener.listenToService(this);\n });\n } else {\n console.warn('AnalyticsService: Analytics not in production mode. All analytics events are ignored.');\n }\n\n if (this._config.logEvents || !this._config.isProduction) {\n console.log('AnalyticsService: Log analytics events enabled.');\n\n // Create a new subscription\n this._loggerSub.subscription = this._subject.subscribe((x) => {\n console.log(`AnalyticsService: Analytics Event - ${AnalyticsStreamEventType[x.type]} User: ${x.userId} Data: ${JSON.stringify(x.event)}.`);\n });\n }\n\n this._userSourceSub.subscription = this.user$.subscribe(() => {\n this.sendNextEvent({}, AnalyticsStreamEventType.UserChange);\n });\n }\n\n destroy() {\n this._userSourceSub.destroy();\n this._loggerSub.destroy();\n }\n\n}\n","import { filterMaybe } from '@dereekb/rxjs';\nimport { switchMap, tap, shareReplay } from 'rxjs/operators';\nimport { Host, Directive, Input, OnInit, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, merge, Observable, of } from 'rxjs';\nimport { ActionContextStoreSourceInstance, AbstractSubscriptionDirective } from '@dereekb/dbx-core';\nimport { AnalyticsService } from '../analytics/analytics.service';\nimport { Maybe, ReadableError } from '@dereekb/util';\n\nexport enum DbxActionAnalyticsTriggerType {\n TRIGGER,\n READY,\n SUCCESS,\n ERROR\n}\n\nexport interface DbxActionAnalyticsConfig<T = any, O = any> {\n onTriggered: (service: AnalyticsService) => void;\n onReady: (service: AnalyticsService, value: T) => void;\n onSuccess: (service: AnalyticsService, value: Maybe<O>) => void;\n onError: (service: AnalyticsService, error: Maybe<ReadableError>) => void;\n}\n\n/**\n * Used to listen to an ActionContext and send analytical events based on action events.\n */\n@Directive({\n selector: '[dbxActionAnalytics]',\n})\nexport class DbxActionAnalyticsDirective<T> extends AbstractSubscriptionDirective implements OnInit, OnDestroy {\n\n private _config = new BehaviorSubject<Maybe<DbxActionAnalyticsConfig>>(undefined);\n readonly config$ = this._config.pipe(filterMaybe(), shareReplay(1));\n\n @Input('dbxActionAnalytics')\n get config(): Maybe<DbxActionAnalyticsConfig> {\n return this._config.value;\n }\n\n set config(config: Maybe<DbxActionAnalyticsConfig>) {\n this._config.next(config);\n }\n\n constructor(\n @Host() readonly source: ActionContextStoreSourceInstance,\n readonly analyticsService: AnalyticsService\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.sub = this.config$.pipe(\n switchMap(({ onTriggered, onReady, onSuccess, onError }) => {\n const triggerObs: Observable<any>[] = [];\n\n if (onTriggered) {\n triggerObs.push(this.source.triggered$.pipe(\n tap(() => onTriggered(this.analyticsService))\n ));\n }\n\n if (onReady) {\n triggerObs.push(this.source.valueReady$.pipe(\n tap((value) => onReady(this.analyticsService, value))\n ));\n }\n\n if (onSuccess) {\n triggerObs.push(this.source.success$.pipe(\n tap((result) => onSuccess(this.analyticsService, result))\n ));\n }\n\n if (onError) {\n triggerObs.push(this.source.error$.pipe(\n tap((error) => onError(this.analyticsService, error))\n ));\n }\n\n if (triggerObs.length) {\n return merge(triggerObs);\n } else {\n return of();\n }\n })\n ).subscribe();\n }\n\n override ngOnDestroy(): void {\n this.source.lockSet.onNextUnlock(() => {\n super.ngOnDestroy();\n this._config.complete();\n });\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { DbxActionAnalyticsDirective } from './analytics.action.directive';\n\n@NgModule({\n declarations: [\n DbxActionAnalyticsDirective\n ],\n exports: [\n DbxActionAnalyticsDirective\n ]\n})\nexport class AnalyticsActionModule { }\n","import { NgModule, ModuleWithProviders, Provider } from '@angular/core';\nimport { AnalyticsService } from './analytics.service';\n\n\nexport interface DbxAnalyticsModuleOptions {\n\n /**\n * Provides a AnalyticsServiceConfiguration value.\n */\n analyticsConfigurationProvider: Provider;\n\n}\n\n@NgModule()\nexport class DbxAnalyticsModule {\n\n static forRoot(options: DbxAnalyticsModuleOptions): ModuleWithProviders<DbxAnalyticsModule> {\n return {\n ngModule: DbxAnalyticsModule,\n providers: [\n // Configuration\n options.analyticsConfigurationProvider,\n // Service\n AnalyticsService\n ]\n };\n }\n\n}\n","import { Injectable, InjectionToken, Inject } from '@angular/core';\nimport { AbstractAsyncWindowLoadedService } from '@dereekb/browser';\nimport { poll } from '@dereekb/util';\n\nexport const PRELOAD_SEGMENT_TOKEN = new InjectionToken<string>('PreLoadSegmentService');\n\nexport class SegmentApiServiceConfig {\n logging = true;\n active = true;\n constructor(public writeKey: string) { }\n}\n\n\n/**\n * Segment API Service used for waiting/retrieving the segment API from window when initialized.\n *\n * This requires some setup in index.html.\n */\n@Injectable()\nexport class SegmentApiService extends AbstractAsyncWindowLoadedService<SegmentAnalytics.AnalyticsJS> {\n\n static readonly SEGMENT_API_WINDOW_KEY = 'analytics';\n static readonly SEGMENT_READY_KEY = 'SegmentReady';\n\n constructor(private _config: SegmentApiServiceConfig, @Inject(PRELOAD_SEGMENT_TOKEN) preload: boolean = true) {\n super(SegmentApiService.SEGMENT_API_WINDOW_KEY, undefined, 'Segment', preload);\n }\n\n get config(): SegmentApiServiceConfig {\n return this._config;\n }\n\n protected override _prepareCompleteLoadingService(): Promise<void> {\n return poll({\n // poll until analytics.invoked is true.\n check: () => Boolean((window.analytics as any)?.invoked),\n timesToGiveup: 100\n });\n }\n\n protected override _initService(service: SegmentAnalytics.AnalyticsJS): Promise<SegmentAnalytics.AnalyticsJS> {\n return new Promise((resolve, reject) => {\n try {\n service.load(this._config.writeKey); // Initialize Segment\n\n // Wait for the service to ready itself.\n service.ready(() => {\n // Segment changes itself or rather the target, and the previous initial target is ignored after.\n const segment: SegmentAnalytics.AnalyticsJS = window[SegmentApiService.SEGMENT_API_WINDOW_KEY];\n resolve(segment);\n });\n } catch (e) {\n console.log('Failed to init segment: ' + e);\n reject(e);\n }\n });\n\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Maybe } from '@dereekb/util';\nimport { combineLatest } from 'rxjs';\nimport { AbstractAnalyticsServiceListener, AnalyticsStreamEvent, AnalyticsStreamEventType, AnalyticsUser } from '../../analytics';\nimport { SegmentApiService } from './segment.service';\n\n/**\n * AnalyticsServiceListener adapter for Segment.\n */\n@Injectable()\nexport class SegmentAnalyticsListenerService extends AbstractAnalyticsServiceListener {\n\n constructor(private _segmentApi: SegmentApiService) {\n super();\n\n if (this._segmentApi.config.logging) {\n console.log('SegmentAnalyticsListenerService: Segment is logging events.');\n }\n\n if (this._segmentApi.config.active) {\n console.log('SegmentAnalyticsListenerService: Segment is disabled from sending events to the server.');\n }\n }\n\n protected _initializeServiceSubscription() {\n return combineLatest([this._segmentApi.service$, this.analyticsEvents$]).subscribe(\n ([segment, streamEvent]: [SegmentAnalytics.AnalyticsJS, AnalyticsStreamEvent]) => {\n if (this._segmentApi.config.logging) {\n console.log('Segment Listener Logging Event: ', streamEvent);\n }\n\n if (this._segmentApi.config.active) {\n this.handleStreamEvent(segment, streamEvent);\n }\n });\n }\n\n protected handleStreamEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: AnalyticsStreamEvent): void {\n switch (streamEvent.type) {\n case AnalyticsStreamEventType.NewUserEvent:\n this.updateWithNewUserEvent(api, streamEvent);\n break;\n case AnalyticsStreamEventType.UserLoginEvent:\n case AnalyticsStreamEventType.Event:\n this.updateWithEvent(api, streamEvent);\n break;\n case AnalyticsStreamEventType.UserLogoutEvent:\n this.changeUser(api, undefined);\n break;\n case AnalyticsStreamEventType.PageView:\n api.page();\n break;\n case AnalyticsStreamEventType.UserChange:\n this.changeUser(api, streamEvent.user);\n break;\n }\n }\n\n protected updateWithNewUserEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: AnalyticsStreamEvent): void {\n this.changeUser(api, streamEvent.user);\n }\n\n protected updateWithEvent(api: SegmentAnalytics.AnalyticsJS, streamEvent: AnalyticsStreamEvent, name?: string): void {\n const event = streamEvent.event;\n const eventName = name || event?.name;\n\n if (eventName) {\n const value = event?.value\n const data = event?.data;\n\n api.track(eventName, {\n ...(value != null) ? {\n value\n } : undefined,\n ...data\n }, {}, () => {\n if (this._segmentApi.config.logging) {\n console.log('Segment track success.');\n }\n });\n }\n }\n\n private changeUser(api: SegmentAnalytics.AnalyticsJS, user: Maybe<AnalyticsUser>): void {\n if (user) {\n api.identify(user.user, {\n ...user.properties\n }, {}, () => {\n if (this._segmentApi.config.logging) {\n console.log('Segment identify success.');\n }\n });\n } else {\n api.reset();\n }\n }\n\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { PRELOAD_SEGMENT_TOKEN, SegmentApiService } from './segment.service';\n\n@NgModule({\n declarations: [],\n imports: []\n})\nexport class SegmentModule {\n\n static forRoot(preloadService?: boolean): ModuleWithProviders<SegmentModule> {\n return {\n ngModule: SegmentModule,\n providers: [\n {\n provide: PRELOAD_SEGMENT_TOKEN,\n useValue: preloadService\n },\n SegmentApiService\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}