@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.
- package/README.md +4 -5
- package/esm2020/lib/action/analytics.action.directive.mjs +15 -15
- package/esm2020/lib/action/analytics.action.module.mjs +9 -9
- package/esm2020/lib/analytics/analytics.mjs +2 -0
- package/esm2020/lib/analytics/analytics.module.mjs +23 -0
- package/esm2020/lib/analytics/analytics.service.mjs +190 -0
- package/esm2020/lib/analytics/analytics.stream.mjs +13 -0
- package/esm2020/lib/analytics/index.mjs +5 -0
- package/esm2020/lib/index.mjs +2 -4
- package/esm2020/lib/providers/index.mjs +2 -0
- package/esm2020/lib/providers/segment/index.mjs +4 -0
- package/esm2020/lib/providers/segment/segment.listener.service.mjs +92 -0
- package/esm2020/lib/providers/segment/segment.module.mjs +28 -0
- package/esm2020/lib/providers/segment/segment.service.mjs +61 -0
- package/fesm2015/dereekb-dbx-analytics.mjs +236 -58
- package/fesm2015/dereekb-dbx-analytics.mjs.map +1 -1
- package/fesm2020/dereekb-dbx-analytics.mjs +239 -58
- package/fesm2020/dereekb-dbx-analytics.mjs.map +1 -1
- package/lib/action/analytics.action.directive.d.ts +15 -15
- package/lib/action/analytics.action.module.d.ts +4 -4
- package/lib/{analytics.d.ts → analytics/analytics.d.ts} +0 -0
- package/lib/analytics/analytics.module.d.ts +14 -0
- package/lib/{analytics.service.d.ts → analytics/analytics.service.d.ts} +25 -21
- package/lib/{analytics.stream.d.ts → analytics/analytics.stream.d.ts} +0 -0
- package/lib/analytics/index.d.ts +4 -0
- package/lib/index.d.ts +1 -3
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/segment/index.d.ts +3 -0
- package/lib/providers/segment/segment.listener.service.d.ts +18 -0
- package/lib/providers/segment/segment.module.d.ts +8 -0
- package/lib/providers/segment/segment.service.d.ts +27 -0
- package/package.json +15 -14
- package/esm2020/lib/analytics.mjs +0 -2
- package/esm2020/lib/analytics.module.mjs +0 -23
- package/esm2020/lib/analytics.service.mjs +0 -179
- package/esm2020/lib/analytics.stream.mjs +0 -13
- 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 {
|
|
5
|
-
import {
|
|
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
|
|
24
|
+
class AnalyticsEventEmitterService {
|
|
23
25
|
}
|
|
24
|
-
class
|
|
26
|
+
class AnalyticsEventStreamService {
|
|
25
27
|
}
|
|
26
|
-
class
|
|
28
|
+
class AnalyticsUserSource {
|
|
27
29
|
}
|
|
28
|
-
class
|
|
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.
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
this._analytics.next(service);
|
|
45
|
+
const sub = this._initializeServiceSubscription();
|
|
46
|
+
if (sub !== false) {
|
|
47
|
+
this._sub.subscription = sub;
|
|
48
|
+
}
|
|
38
49
|
}
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
// MARK: Destroy
|
|
51
|
+
destroy() {
|
|
52
|
+
this._analytics.complete();
|
|
53
|
+
this._sub.destroy();
|
|
41
54
|
}
|
|
42
55
|
}
|
|
43
|
-
class
|
|
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
|
|
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:
|
|
104
|
+
// MARK: AnalyticsEventEmitterService
|
|
92
105
|
/**
|
|
93
106
|
* Sends an event.
|
|
94
107
|
*/
|
|
95
108
|
sendNewUserEvent(user, data) {
|
|
96
109
|
this.sendNextEvent({
|
|
97
|
-
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:
|
|
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:
|
|
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:
|
|
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('
|
|
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('
|
|
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(`
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.
|
|
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:
|
|
202
|
+
return [{ type: AnalyticsServiceConfiguration }, { type: undefined, decorators: [{
|
|
190
203
|
type: Optional
|
|
191
204
|
}, {
|
|
192
205
|
type: Inject,
|
|
193
|
-
args: [
|
|
206
|
+
args: [AnalyticsUserSource]
|
|
194
207
|
}] }];
|
|
195
208
|
} });
|
|
196
209
|
|
|
197
|
-
var
|
|
198
|
-
(function (
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
})(
|
|
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
|
|
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
|
-
|
|
252
|
-
|
|
253
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.
|
|
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:
|
|
274
|
+
}] }, { type: AnalyticsService }];
|
|
262
275
|
}, propDecorators: { config: [{
|
|
263
276
|
type: Input,
|
|
264
277
|
args: ['dbxActionAnalytics']
|
|
265
278
|
}] } });
|
|
266
279
|
|
|
267
|
-
class
|
|
280
|
+
class AnalyticsActionModule {
|
|
268
281
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.
|
|
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
|
-
|
|
289
|
+
DbxActionAnalyticsDirective
|
|
277
290
|
],
|
|
278
291
|
exports: [
|
|
279
|
-
|
|
292
|
+
DbxActionAnalyticsDirective
|
|
280
293
|
]
|
|
281
294
|
}]
|
|
282
295
|
}] });
|
|
283
296
|
|
|
284
|
-
class
|
|
297
|
+
class DbxAnalyticsModule {
|
|
285
298
|
static forRoot(options) {
|
|
286
299
|
return {
|
|
287
|
-
ngModule:
|
|
300
|
+
ngModule: DbxAnalyticsModule,
|
|
288
301
|
providers: [
|
|
289
302
|
// Configuration
|
|
290
303
|
options.analyticsConfigurationProvider,
|
|
291
304
|
// Service
|
|
292
|
-
|
|
305
|
+
AnalyticsService
|
|
293
306
|
]
|
|
294
307
|
};
|
|
295
308
|
}
|
|
296
309
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.
|
|
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,
|
|
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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"}
|