ems-web-app-event-tracker 0.0.5
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 +24 -0
- package/ems-web-app-event-tracker.d.ts +5 -0
- package/esm2020/ems-web-app-event-tracker.mjs +5 -0
- package/esm2020/lib/event-dispatcher.component.mjs +78 -0
- package/esm2020/lib/event-dispatcher.module.mjs +21 -0
- package/esm2020/lib/event-dispatcher.service.mjs +49 -0
- package/esm2020/public-api.mjs +7 -0
- package/fesm2015/ems-web-app-event-tracker.mjs +156 -0
- package/fesm2015/ems-web-app-event-tracker.mjs.map +1 -0
- package/fesm2020/ems-web-app-event-tracker.mjs +151 -0
- package/fesm2020/ems-web-app-event-tracker.mjs.map +1 -0
- package/lib/event-dispatcher.component.d.ts +23 -0
- package/lib/event-dispatcher.module.d.ts +7 -0
- package/lib/event-dispatcher.service.d.ts +16 -0
- package/package.json +64 -0
- package/public-api.d.ts +3 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# EventDispatcher
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project event-dispatcher` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project event-dispatcher`.
|
|
8
|
+
> Note: Don't forget to add `--project event-dispatcher` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build event-dispatcher` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build event-dispatcher`, go to the dist folder `cd dist/event-dispatcher` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test event-dispatcher` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1zLXdlYi1hcHAtZXZlbnQtdHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbXMtd2ViLWFwcC1ldmVudC10cmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { v4 as uuid } from "uuid";
|
|
3
|
+
import { empty } from "ems-web-app-utils";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./event-dispatcher.service";
|
|
6
|
+
export class EventDispatcherComponent {
|
|
7
|
+
constructor(service) {
|
|
8
|
+
this.service = service;
|
|
9
|
+
this.limit = 1800000; //30m
|
|
10
|
+
this._queue = [];
|
|
11
|
+
this._processing = false;
|
|
12
|
+
this.updateSession = () => {
|
|
13
|
+
const timestamp = (new Date()).getTime();
|
|
14
|
+
window.localStorage.setItem(this._tokenId, timestamp.toString());
|
|
15
|
+
};
|
|
16
|
+
this.service.jwt = this.session?.idToken.jwtToken ?? this.token;
|
|
17
|
+
this.service.endpoint = this.endpoint;
|
|
18
|
+
this._tokenId = this.session?.idToken.payload.jti ?? this.token;
|
|
19
|
+
this._sessionId = this.determineSessionId();
|
|
20
|
+
window.localStorage.setItem("ems_et_sessionId", this._sessionId);
|
|
21
|
+
}
|
|
22
|
+
ngOnInit() {
|
|
23
|
+
window.setInterval(this.updateSession, 1000);
|
|
24
|
+
}
|
|
25
|
+
dispatch(event, name) {
|
|
26
|
+
event.sessionId = this._sessionId;
|
|
27
|
+
this._queue.push({ event, name });
|
|
28
|
+
this.processQueue();
|
|
29
|
+
return event;
|
|
30
|
+
}
|
|
31
|
+
async processQueue() {
|
|
32
|
+
if (this._processing)
|
|
33
|
+
return;
|
|
34
|
+
this._processing = true;
|
|
35
|
+
const obj = this._queue.shift();
|
|
36
|
+
if (!obj) {
|
|
37
|
+
this._processing = false;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
await this.service.dispatch(obj.event, obj.name);
|
|
41
|
+
this.processQueue();
|
|
42
|
+
}
|
|
43
|
+
determineSessionId() {
|
|
44
|
+
const sessionTimestamp = parseInt(window.localStorage.getItem(this._tokenId) ?? "");
|
|
45
|
+
const sessionId = window.localStorage.getItem("ems_et_sessionId");
|
|
46
|
+
const now = (new Date()).getTime();
|
|
47
|
+
if (!isNaN(sessionTimestamp) && !empty(sessionId) && this.stillInSession(now, sessionTimestamp)) {
|
|
48
|
+
return sessionId;
|
|
49
|
+
}
|
|
50
|
+
return uuid();
|
|
51
|
+
}
|
|
52
|
+
stillInSession(time1, time2) {
|
|
53
|
+
return Math.abs(time1 - time2) < this.limit;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
EventDispatcherComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, deps: [{ token: i1.EventDispatcherService }], target: i0.ɵɵFactoryTarget.Component });
|
|
57
|
+
EventDispatcherComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: EventDispatcherComponent, selector: "event-dispatcher", inputs: { endpoint: "endpoint", session: "session", token: "token", limit: ["sessionLimit", "limit"] }, ngImport: i0, template: '<div id="event-dispatcher"></div>', isInline: true });
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, decorators: [{
|
|
59
|
+
type: Component,
|
|
60
|
+
args: [{
|
|
61
|
+
selector: 'event-dispatcher',
|
|
62
|
+
template: '<div id="event-dispatcher"></div>',
|
|
63
|
+
styles: []
|
|
64
|
+
}]
|
|
65
|
+
}], ctorParameters: function () { return [{ type: i1.EventDispatcherService }]; }, propDecorators: { endpoint: [{
|
|
66
|
+
type: Input,
|
|
67
|
+
args: ["endpoint"]
|
|
68
|
+
}], session: [{
|
|
69
|
+
type: Input,
|
|
70
|
+
args: ["session"]
|
|
71
|
+
}], token: [{
|
|
72
|
+
type: Input,
|
|
73
|
+
args: ["token"]
|
|
74
|
+
}], limit: [{
|
|
75
|
+
type: Input,
|
|
76
|
+
args: ["sessionLimit"]
|
|
77
|
+
}] } });
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGlzcGF0Y2hlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2V2ZW50LWRpc3BhdGNoZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBUyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBUWpELE1BQU0sT0FBTyx3QkFBd0I7SUFZbkMsWUFBb0IsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFQNUIsVUFBSyxHQUFXLE9BQU8sQ0FBQyxDQUFDLEtBQUs7UUFFN0MsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQXFEN0Isa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDM0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUE7UUFuREMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQVUsRUFBRSxJQUFhO1FBQ3ZDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFHLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLElBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixPQUFPO1NBQ1I7UUFFRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRW5DLElBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzlGLE9BQU8sU0FBVSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDOztxSEEzRFUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsZ0tBSnpCLG1DQUFtQzsyRkFJbEMsd0JBQXdCO2tCQU5wQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRSxtQ0FBbUM7b0JBQzdDLE1BQU0sRUFBRSxFQUNQO2lCQUNGOzZHQUdvQixRQUFRO3NCQUExQixLQUFLO3VCQUFDLFVBQVU7Z0JBQ0MsT0FBTztzQkFBeEIsS0FBSzt1QkFBQyxTQUFTO2dCQUNBLEtBQUs7c0JBQXBCLEtBQUs7dUJBQUMsT0FBTztnQkFDUyxLQUFLO3NCQUEzQixLQUFLO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyU2VydmljZSB9IGZyb20gXCIuL2V2ZW50LWRpc3BhdGNoZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyB0cmFjZSwgZW1wdHkgfSBmcm9tIFwiZW1zLXdlYi1hcHAtdXRpbHNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZXZlbnQtZGlzcGF0Y2hlcicsXG4gIHRlbXBsYXRlOiAnPGRpdiBpZD1cImV2ZW50LWRpc3BhdGNoZXJcIj48L2Rpdj4nLFxuICBzdHlsZXM6IFtcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBFdmVudERpc3BhdGNoZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dChcImVuZHBvaW50XCIpIGVuZHBvaW50ITogc3RyaW5nO1xuICBASW5wdXQoXCJzZXNzaW9uXCIpIHNlc3Npb24/OiBhbnk7XG4gIEBJbnB1dChcInRva2VuXCIpIHRva2VuPzogc3RyaW5nO1xuICBASW5wdXQoXCJzZXNzaW9uTGltaXRcIikgbGltaXQ6IG51bWJlciA9IDE4MDAwMDA7IC8vMzBtXG5cbiAgcHJpdmF0ZSBfcXVldWU6IGFueVtdID0gW107XG4gIHByaXZhdGUgX3Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdG9rZW5JZDogc3RyaW5nO1xuICBwcml2YXRlIF9zZXNzaW9uSWQhOiBzdHJpbmc7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UpIHtcbiAgICB0aGlzLnNlcnZpY2Uuand0ID0gdGhpcy5zZXNzaW9uPy5pZFRva2VuLmp3dFRva2VuID8/IHRoaXMudG9rZW47XG4gICAgdGhpcy5zZXJ2aWNlLmVuZHBvaW50ID0gdGhpcy5lbmRwb2ludDtcbiAgICB0aGlzLl90b2tlbklkID0gdGhpcy5zZXNzaW9uPy5pZFRva2VuLnBheWxvYWQuanRpID8/IHRoaXMudG9rZW47XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gdGhpcy5kZXRlcm1pbmVTZXNzaW9uSWQoKTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlbXNfZXRfc2Vzc2lvbklkXCIsIHRoaXMuX3Nlc3Npb25JZCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy51cGRhdGVTZXNzaW9uLCAxMDAwKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaChldmVudDogYW55LCBuYW1lPzogc3RyaW5nKTogYW55IHtcbiAgICBldmVudC5zZXNzaW9uSWQgPSB0aGlzLl9zZXNzaW9uSWQ7XG4gICAgdGhpcy5fcXVldWUucHVzaCh7IGV2ZW50LCBuYW1lIH0pO1xuICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUXVldWUoKSB7XG4gICAgaWYodGhpcy5fcHJvY2Vzc2luZykgcmV0dXJuO1xuICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSB0cnVlO1xuXG4gICAgY29uc3Qgb2JqID0gdGhpcy5fcXVldWUuc2hpZnQoKTtcbiAgICBpZighb2JqKSB7XG4gICAgICB0aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmRpc3BhdGNoKG9iai5ldmVudCwgb2JqLm5hbWUpO1xuICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7IFxuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVTZXNzaW9uSWQoKSB7XG4gICAgY29uc3Qgc2Vzc2lvblRpbWVzdGFtcCA9IHBhcnNlSW50KHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLl90b2tlbklkKSA/PyBcIlwiKTtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJlbXNfZXRfc2Vzc2lvbklkXCIpO1xuICAgIGNvbnN0IG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG5cbiAgICBpZighaXNOYU4oc2Vzc2lvblRpbWVzdGFtcCkgJiYgIWVtcHR5KHNlc3Npb25JZCkgJiYgdGhpcy5zdGlsbEluU2Vzc2lvbihub3csIHNlc3Npb25UaW1lc3RhbXApKSB7XG4gICAgICByZXR1cm4gc2Vzc2lvbklkITtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHV1aWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RpbGxJblNlc3Npb24odGltZTE6IG51bWJlciwgdGltZTI6IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLmFicyh0aW1lMSAtIHRpbWUyKSA8IHRoaXMubGltaXQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlc3Npb24gPSAoKSA9PiB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5fdG9rZW5JZCwgdGltZXN0YW1wLnRvU3RyaW5nKCkpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { EventDispatcherComponent } from './event-dispatcher.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class EventDispatcherModule {
|
|
5
|
+
}
|
|
6
|
+
EventDispatcherModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
7
|
+
EventDispatcherModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, declarations: [EventDispatcherComponent], exports: [EventDispatcherComponent] });
|
|
8
|
+
EventDispatcherModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, imports: [[]] });
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, decorators: [{
|
|
10
|
+
type: NgModule,
|
|
11
|
+
args: [{
|
|
12
|
+
declarations: [
|
|
13
|
+
EventDispatcherComponent
|
|
14
|
+
],
|
|
15
|
+
imports: [],
|
|
16
|
+
exports: [
|
|
17
|
+
EventDispatcherComponent
|
|
18
|
+
]
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGlzcGF0Y2hlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2V2ZW50LWRpc3BhdGNoZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7O0FBY3hFLE1BQU0sT0FBTyxxQkFBcUI7O2tIQUFyQixxQkFBcUI7bUhBQXJCLHFCQUFxQixpQkFSOUIsd0JBQXdCLGFBS3hCLHdCQUF3QjttSEFHZixxQkFBcUIsWUFOdkIsRUFDUjsyRkFLVSxxQkFBcUI7a0JBVmpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHdCQUF3QjtxQkFDekI7b0JBQ0QsT0FBTyxFQUFFLEVBQ1I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHdCQUF3QjtxQkFDekI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyQ29tcG9uZW50IH0gZnJvbSAnLi9ldmVudC1kaXNwYXRjaGVyLmNvbXBvbmVudCc7XG5cblxuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBFdmVudERpc3BhdGNoZXJDb21wb25lbnRcbiAgXSxcbiAgaW1wb3J0czogW1xuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRXZlbnREaXNwYXRjaGVyQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRXZlbnREaXNwYXRjaGVyTW9kdWxlIHsgfVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { throwError, of } from 'rxjs';
|
|
4
|
+
import { catchError, map } from "rxjs/operators";
|
|
5
|
+
import { v4 as uuid } from "uuid";
|
|
6
|
+
import { empty } from "ems-web-app-utils";
|
|
7
|
+
import * as _ from "underscore";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common/http";
|
|
10
|
+
export class EventDispatcherService {
|
|
11
|
+
constructor(http) {
|
|
12
|
+
this.http = http;
|
|
13
|
+
}
|
|
14
|
+
dispatch(event, name) {
|
|
15
|
+
const key = `${name ?? uuid()}.json`;
|
|
16
|
+
const request = this.buildRequest(key);
|
|
17
|
+
return this.executePutRequest(request, event);
|
|
18
|
+
}
|
|
19
|
+
executePutRequest(request, data, transform, suppressErrors, customHeaders) {
|
|
20
|
+
const headers = this.headers(customHeaders || {});
|
|
21
|
+
return this.http.put(request, data, { headers, withCredentials: true }).pipe(map((result) => transform ? transform(result) : result), catchError(suppressErrors ? this.handleErrorQuietly : this.handleError)).toPromise();
|
|
22
|
+
}
|
|
23
|
+
buildRequest(endpoint) {
|
|
24
|
+
return `${this.endpoint}/${endpoint}`;
|
|
25
|
+
}
|
|
26
|
+
handleError(error) {
|
|
27
|
+
return throwError(error);
|
|
28
|
+
}
|
|
29
|
+
handleErrorQuietly(error) {
|
|
30
|
+
console.error(error);
|
|
31
|
+
return of(null);
|
|
32
|
+
}
|
|
33
|
+
headers(custom = {}) {
|
|
34
|
+
const headers = _.extend({
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
"Authorization": empty(this.jwt) ? undefined : `Bearer ${this.jwt}`
|
|
37
|
+
}, custom);
|
|
38
|
+
return new HttpHeaders(headers);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
EventDispatcherService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
42
|
+
EventDispatcherService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, providedIn: 'root' });
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, decorators: [{
|
|
44
|
+
type: Injectable,
|
|
45
|
+
args: [{
|
|
46
|
+
providedIn: 'root'
|
|
47
|
+
}]
|
|
48
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGlzcGF0Y2hlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ldmVudC1kaXNwYXRjaGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUE0RCxNQUFNLHNCQUFzQixDQUFDO0FBQ3pILE9BQU8sRUFBd0MsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBUyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssQ0FBQyxNQUFNLFlBQVksQ0FBQzs7O0FBS2hDLE1BQU0sT0FBTyxzQkFBc0I7SUFLakMsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUFHLENBQUM7SUFFakMsUUFBUSxDQUFDLEtBQVUsRUFBRSxJQUFhO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxJQUFTLEVBQUUsU0FBK0IsRUFBRSxjQUF3QixFQUFFLGFBQW1CO1FBQ2xJLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzFFLEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQ2xCLFNBQVMsQ0FBQyxDQUFDLENBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3hDLEVBQ0QsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3hFLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDZixDQUFDO0lBRU8sWUFBWSxDQUFDLFFBQWdCO1FBQ25DLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBd0I7UUFDMUMsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQXdCO1FBQ2pELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVPLE9BQU8sQ0FBQyxTQUFjLEVBQUU7UUFDOUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNuQixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUNyRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDOzttSEExQ1Usc0JBQXNCO3VIQUF0QixzQkFBc0IsY0FGckIsTUFBTTsyRkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlcXVlc3QsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCB0aHJvd0Vycm9yLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCB0YXAsIHRha2UgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgdHJhY2UsIGVtcHR5IH0gZnJvbSBcImVtcy13ZWItYXBwLXV0aWxzXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJ1bmRlcnNjb3JlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV2ZW50RGlzcGF0Y2hlclNlcnZpY2Uge1xuICBcbiAgcHVibGljIGp3dD86IHN0cmluZztcbiAgcHVibGljIGVuZHBvaW50ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICBwdWJsaWMgZGlzcGF0Y2goZXZlbnQ6IGFueSwgbmFtZT86IHN0cmluZyk6UHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBrZXkgPSBgJHtuYW1lID8/IHV1aWQoKX0uanNvbmA7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KGtleSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVB1dFJlcXVlc3QocmVxdWVzdCwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlUHV0UmVxdWVzdChyZXF1ZXN0OiBzdHJpbmcsIGRhdGE6IGFueSwgdHJhbnNmb3JtPzogKGlucHV0OiBhbnkpID0+IGFueSwgc3VwcHJlc3NFcnJvcnM/OiBib29sZWFuLCBjdXN0b21IZWFkZXJzPzogYW55ICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuaGVhZGVycyhjdXN0b21IZWFkZXJzIHx8IHt9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChyZXF1ZXN0LCBkYXRhLCB7IGhlYWRlcnMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IGFueSkgPT4gXG4gICAgICAgIHRyYW5zZm9ybSA/ICB0cmFuc2Zvcm0ocmVzdWx0KSA6IHJlc3VsdFxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3Ioc3VwcHJlc3NFcnJvcnMgPyB0aGlzLmhhbmRsZUVycm9yUXVpZXRseSA6IHRoaXMuaGFuZGxlRXJyb3IpXG4gICAgKS50b1Byb21pc2UoKVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlcXVlc3QoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZW5kcG9pbnR9LyR7ZW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvclF1aWV0bHkoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoZWFkZXJzKGN1c3RvbTogYW55ID0ge30pOiBIdHRwSGVhZGVycyB7XG4gICAgY29uc3QgaGVhZGVycyA9IF8uZXh0ZW5kKHsgXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGVtcHR5KHRoaXMuand0KSA/IHVuZGVmaW5lZCA6IGBCZWFyZXIgJHt0aGlzLmp3dH1gIFxuICAgICAgIH0sIGN1c3RvbSk7XG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of event-dispatcher
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/event-dispatcher.service';
|
|
5
|
+
export * from './lib/event-dispatcher.component';
|
|
6
|
+
export * from './lib/event-dispatcher.module';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGV2ZW50LWRpc3BhdGNoZXJcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ldmVudC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZXZlbnQtZGlzcGF0Y2hlci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZXZlbnQtZGlzcGF0Y2hlci5tb2R1bGUnO1xuIl19
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, Component, Input, NgModule } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/common/http';
|
|
4
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
5
|
+
import { throwError, of } from 'rxjs';
|
|
6
|
+
import { map, catchError } from 'rxjs/operators';
|
|
7
|
+
import { v4 } from 'uuid';
|
|
8
|
+
import { empty } from 'ems-web-app-utils';
|
|
9
|
+
import * as _ from 'underscore';
|
|
10
|
+
import { __awaiter } from 'tslib';
|
|
11
|
+
|
|
12
|
+
class EventDispatcherService {
|
|
13
|
+
constructor(http) {
|
|
14
|
+
this.http = http;
|
|
15
|
+
}
|
|
16
|
+
dispatch(event, name) {
|
|
17
|
+
const key = `${name !== null && name !== void 0 ? name : v4()}.json`;
|
|
18
|
+
const request = this.buildRequest(key);
|
|
19
|
+
return this.executePutRequest(request, event);
|
|
20
|
+
}
|
|
21
|
+
executePutRequest(request, data, transform, suppressErrors, customHeaders) {
|
|
22
|
+
const headers = this.headers(customHeaders || {});
|
|
23
|
+
return this.http.put(request, data, { headers, withCredentials: true }).pipe(map((result) => transform ? transform(result) : result), catchError(suppressErrors ? this.handleErrorQuietly : this.handleError)).toPromise();
|
|
24
|
+
}
|
|
25
|
+
buildRequest(endpoint) {
|
|
26
|
+
return `${this.endpoint}/${endpoint}`;
|
|
27
|
+
}
|
|
28
|
+
handleError(error) {
|
|
29
|
+
return throwError(error);
|
|
30
|
+
}
|
|
31
|
+
handleErrorQuietly(error) {
|
|
32
|
+
console.error(error);
|
|
33
|
+
return of(null);
|
|
34
|
+
}
|
|
35
|
+
headers(custom = {}) {
|
|
36
|
+
const headers = _.extend({
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
"Authorization": empty(this.jwt) ? undefined : `Bearer ${this.jwt}`
|
|
39
|
+
}, custom);
|
|
40
|
+
return new HttpHeaders(headers);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
EventDispatcherService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
44
|
+
EventDispatcherService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, providedIn: 'root' });
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, decorators: [{
|
|
46
|
+
type: Injectable,
|
|
47
|
+
args: [{
|
|
48
|
+
providedIn: 'root'
|
|
49
|
+
}]
|
|
50
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
51
|
+
|
|
52
|
+
class EventDispatcherComponent {
|
|
53
|
+
constructor(service) {
|
|
54
|
+
var _a, _b, _c, _d;
|
|
55
|
+
this.service = service;
|
|
56
|
+
this.limit = 1800000; //30m
|
|
57
|
+
this._queue = [];
|
|
58
|
+
this._processing = false;
|
|
59
|
+
this.updateSession = () => {
|
|
60
|
+
const timestamp = (new Date()).getTime();
|
|
61
|
+
window.localStorage.setItem(this._tokenId, timestamp.toString());
|
|
62
|
+
};
|
|
63
|
+
this.service.jwt = (_b = (_a = this.session) === null || _a === void 0 ? void 0 : _a.idToken.jwtToken) !== null && _b !== void 0 ? _b : this.token;
|
|
64
|
+
this.service.endpoint = this.endpoint;
|
|
65
|
+
this._tokenId = (_d = (_c = this.session) === null || _c === void 0 ? void 0 : _c.idToken.payload.jti) !== null && _d !== void 0 ? _d : this.token;
|
|
66
|
+
this._sessionId = this.determineSessionId();
|
|
67
|
+
window.localStorage.setItem("ems_et_sessionId", this._sessionId);
|
|
68
|
+
}
|
|
69
|
+
ngOnInit() {
|
|
70
|
+
window.setInterval(this.updateSession, 1000);
|
|
71
|
+
}
|
|
72
|
+
dispatch(event, name) {
|
|
73
|
+
event.sessionId = this._sessionId;
|
|
74
|
+
this._queue.push({ event, name });
|
|
75
|
+
this.processQueue();
|
|
76
|
+
return event;
|
|
77
|
+
}
|
|
78
|
+
processQueue() {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
if (this._processing)
|
|
81
|
+
return;
|
|
82
|
+
this._processing = true;
|
|
83
|
+
const obj = this._queue.shift();
|
|
84
|
+
if (!obj) {
|
|
85
|
+
this._processing = false;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
yield this.service.dispatch(obj.event, obj.name);
|
|
89
|
+
this.processQueue();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
determineSessionId() {
|
|
93
|
+
var _a;
|
|
94
|
+
const sessionTimestamp = parseInt((_a = window.localStorage.getItem(this._tokenId)) !== null && _a !== void 0 ? _a : "");
|
|
95
|
+
const sessionId = window.localStorage.getItem("ems_et_sessionId");
|
|
96
|
+
const now = (new Date()).getTime();
|
|
97
|
+
if (!isNaN(sessionTimestamp) && !empty(sessionId) && this.stillInSession(now, sessionTimestamp)) {
|
|
98
|
+
return sessionId;
|
|
99
|
+
}
|
|
100
|
+
return v4();
|
|
101
|
+
}
|
|
102
|
+
stillInSession(time1, time2) {
|
|
103
|
+
return Math.abs(time1 - time2) < this.limit;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
EventDispatcherComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, deps: [{ token: EventDispatcherService }], target: i0.ɵɵFactoryTarget.Component });
|
|
107
|
+
EventDispatcherComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: EventDispatcherComponent, selector: "event-dispatcher", inputs: { endpoint: "endpoint", session: "session", token: "token", limit: ["sessionLimit", "limit"] }, ngImport: i0, template: '<div id="event-dispatcher"></div>', isInline: true });
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, decorators: [{
|
|
109
|
+
type: Component,
|
|
110
|
+
args: [{
|
|
111
|
+
selector: 'event-dispatcher',
|
|
112
|
+
template: '<div id="event-dispatcher"></div>',
|
|
113
|
+
styles: []
|
|
114
|
+
}]
|
|
115
|
+
}], ctorParameters: function () { return [{ type: EventDispatcherService }]; }, propDecorators: { endpoint: [{
|
|
116
|
+
type: Input,
|
|
117
|
+
args: ["endpoint"]
|
|
118
|
+
}], session: [{
|
|
119
|
+
type: Input,
|
|
120
|
+
args: ["session"]
|
|
121
|
+
}], token: [{
|
|
122
|
+
type: Input,
|
|
123
|
+
args: ["token"]
|
|
124
|
+
}], limit: [{
|
|
125
|
+
type: Input,
|
|
126
|
+
args: ["sessionLimit"]
|
|
127
|
+
}] } });
|
|
128
|
+
|
|
129
|
+
class EventDispatcherModule {
|
|
130
|
+
}
|
|
131
|
+
EventDispatcherModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
132
|
+
EventDispatcherModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, declarations: [EventDispatcherComponent], exports: [EventDispatcherComponent] });
|
|
133
|
+
EventDispatcherModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, imports: [[]] });
|
|
134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, decorators: [{
|
|
135
|
+
type: NgModule,
|
|
136
|
+
args: [{
|
|
137
|
+
declarations: [
|
|
138
|
+
EventDispatcherComponent
|
|
139
|
+
],
|
|
140
|
+
imports: [],
|
|
141
|
+
exports: [
|
|
142
|
+
EventDispatcherComponent
|
|
143
|
+
]
|
|
144
|
+
}]
|
|
145
|
+
}] });
|
|
146
|
+
|
|
147
|
+
/*
|
|
148
|
+
* Public API Surface of event-dispatcher
|
|
149
|
+
*/
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Generated bundle index. Do not edit.
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
export { EventDispatcherComponent, EventDispatcherModule, EventDispatcherService };
|
|
156
|
+
//# sourceMappingURL=ems-web-app-event-tracker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ems-web-app-event-tracker.mjs","sources":["../../src/lib/event-dispatcher.service.ts","../../src/lib/event-dispatcher.component.ts","../../src/lib/event-dispatcher.module.ts","../../src/public-api.ts","../../src/ems-web-app-event-tracker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpResponse, HttpRequest, HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { Observable, Subject, BehaviorSubject, throwError, of } from 'rxjs';\nimport { catchError, map, tap, take } from \"rxjs/operators\";\nimport { v4 as uuid } from \"uuid\";\nimport { trace, empty } from \"ems-web-app-utils\";\nimport * as _ from \"underscore\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EventDispatcherService {\n \n public jwt?: string;\n public endpoint!: string;\n\n constructor(private http: HttpClient) {}\n\n public dispatch(event: any, name?: string):Promise<any> {\n const key = `${name ?? uuid()}.json`;\n const request = this.buildRequest(key);\n return this.executePutRequest(request, event);\n }\n\n private executePutRequest(request: string, data: any, transform?: (input: any) => any, suppressErrors?: boolean, customHeaders?: any ): Promise<any> {\n const headers = this.headers(customHeaders || {});\n return this.http.put(request, data, { headers, withCredentials: true }).pipe(\n map((result: any) => \n transform ? transform(result) : result\n ),\n catchError(suppressErrors ? this.handleErrorQuietly : this.handleError)\n ).toPromise()\n }\n\n private buildRequest(endpoint: string): string {\n return `${this.endpoint}/${endpoint}`;\n }\n\n private handleError(error: HttpErrorResponse) {\n return throwError(error);\n }\n\n private handleErrorQuietly(error: HttpErrorResponse) {\n console.error(error);\n return of(null);\n }\n\n private headers(custom: any = {}): HttpHeaders {\n const headers = _.extend({ \n \"Content-Type\": \"application/json\",\n \"Authorization\": empty(this.jwt) ? undefined : `Bearer ${this.jwt}` \n }, custom);\n return new HttpHeaders(headers);\n }\n}\n","import { Component, OnInit, Input, Output } from '@angular/core';\nimport { EventDispatcherService } from \"./event-dispatcher.service\";\nimport { v4 as uuid } from \"uuid\";\nimport { trace, empty } from \"ems-web-app-utils\";\n\n@Component({\n selector: 'event-dispatcher',\n template: '<div id=\"event-dispatcher\"></div>',\n styles: [\n ]\n})\nexport class EventDispatcherComponent implements OnInit {\n\n @Input(\"endpoint\") endpoint!: string;\n @Input(\"session\") session?: any;\n @Input(\"token\") token?: string;\n @Input(\"sessionLimit\") limit: number = 1800000; //30m\n\n private _queue: any[] = [];\n private _processing: boolean = false;\n private _tokenId: string;\n private _sessionId!: string;\n \n constructor(private service: EventDispatcherService) {\n this.service.jwt = this.session?.idToken.jwtToken ?? this.token;\n this.service.endpoint = this.endpoint;\n this._tokenId = this.session?.idToken.payload.jti ?? this.token;\n this._sessionId = this.determineSessionId();\n window.localStorage.setItem(\"ems_et_sessionId\", this._sessionId);\n }\n\n ngOnInit(): void {\n window.setInterval(this.updateSession, 1000);\n }\n\n public dispatch(event: any, name?: string): any {\n event.sessionId = this._sessionId;\n this._queue.push({ event, name });\n this.processQueue();\n return event;\n }\n\n private async processQueue() {\n if(this._processing) return;\n this._processing = true;\n\n const obj = this._queue.shift();\n if(!obj) {\n this._processing = false;\n return;\n }\n\n await this.service.dispatch(obj.event, obj.name);\n this.processQueue(); \n }\n\n private determineSessionId() {\n const sessionTimestamp = parseInt(window.localStorage.getItem(this._tokenId) ?? \"\");\n const sessionId = window.localStorage.getItem(\"ems_et_sessionId\");\n const now = (new Date()).getTime();\n\n if(!isNaN(sessionTimestamp) && !empty(sessionId) && this.stillInSession(now, sessionTimestamp)) {\n return sessionId!;\n }\n \n return uuid();\n }\n\n private stillInSession(time1: number, time2: number) {\n return Math.abs(time1 - time2) < this.limit;\n }\n\n private updateSession = () => {\n const timestamp = (new Date()).getTime();\n window.localStorage.setItem(this._tokenId, timestamp.toString());\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { EventDispatcherComponent } from './event-dispatcher.component';\n\n\n\n@NgModule({\n declarations: [\n EventDispatcherComponent\n ],\n imports: [\n ],\n exports: [\n EventDispatcherComponent\n ]\n})\nexport class EventDispatcherModule { }\n","/*\n * Public API Surface of event-dispatcher\n */\n\nexport * from './lib/event-dispatcher.service';\nexport * from './lib/event-dispatcher.component';\nexport * from './lib/event-dispatcher.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuid","i1.EventDispatcherService"],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, Component, Input, NgModule } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/common/http';
|
|
4
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
5
|
+
import { throwError, of } from 'rxjs';
|
|
6
|
+
import { map, catchError } from 'rxjs/operators';
|
|
7
|
+
import { v4 } from 'uuid';
|
|
8
|
+
import { empty } from 'ems-web-app-utils';
|
|
9
|
+
import * as _ from 'underscore';
|
|
10
|
+
|
|
11
|
+
class EventDispatcherService {
|
|
12
|
+
constructor(http) {
|
|
13
|
+
this.http = http;
|
|
14
|
+
}
|
|
15
|
+
dispatch(event, name) {
|
|
16
|
+
const key = `${name ?? v4()}.json`;
|
|
17
|
+
const request = this.buildRequest(key);
|
|
18
|
+
return this.executePutRequest(request, event);
|
|
19
|
+
}
|
|
20
|
+
executePutRequest(request, data, transform, suppressErrors, customHeaders) {
|
|
21
|
+
const headers = this.headers(customHeaders || {});
|
|
22
|
+
return this.http.put(request, data, { headers, withCredentials: true }).pipe(map((result) => transform ? transform(result) : result), catchError(suppressErrors ? this.handleErrorQuietly : this.handleError)).toPromise();
|
|
23
|
+
}
|
|
24
|
+
buildRequest(endpoint) {
|
|
25
|
+
return `${this.endpoint}/${endpoint}`;
|
|
26
|
+
}
|
|
27
|
+
handleError(error) {
|
|
28
|
+
return throwError(error);
|
|
29
|
+
}
|
|
30
|
+
handleErrorQuietly(error) {
|
|
31
|
+
console.error(error);
|
|
32
|
+
return of(null);
|
|
33
|
+
}
|
|
34
|
+
headers(custom = {}) {
|
|
35
|
+
const headers = _.extend({
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
"Authorization": empty(this.jwt) ? undefined : `Bearer ${this.jwt}`
|
|
38
|
+
}, custom);
|
|
39
|
+
return new HttpHeaders(headers);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
EventDispatcherService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
43
|
+
EventDispatcherService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, providedIn: 'root' });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherService, decorators: [{
|
|
45
|
+
type: Injectable,
|
|
46
|
+
args: [{
|
|
47
|
+
providedIn: 'root'
|
|
48
|
+
}]
|
|
49
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
50
|
+
|
|
51
|
+
class EventDispatcherComponent {
|
|
52
|
+
constructor(service) {
|
|
53
|
+
this.service = service;
|
|
54
|
+
this.limit = 1800000; //30m
|
|
55
|
+
this._queue = [];
|
|
56
|
+
this._processing = false;
|
|
57
|
+
this.updateSession = () => {
|
|
58
|
+
const timestamp = (new Date()).getTime();
|
|
59
|
+
window.localStorage.setItem(this._tokenId, timestamp.toString());
|
|
60
|
+
};
|
|
61
|
+
this.service.jwt = this.session?.idToken.jwtToken ?? this.token;
|
|
62
|
+
this.service.endpoint = this.endpoint;
|
|
63
|
+
this._tokenId = this.session?.idToken.payload.jti ?? this.token;
|
|
64
|
+
this._sessionId = this.determineSessionId();
|
|
65
|
+
window.localStorage.setItem("ems_et_sessionId", this._sessionId);
|
|
66
|
+
}
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
window.setInterval(this.updateSession, 1000);
|
|
69
|
+
}
|
|
70
|
+
dispatch(event, name) {
|
|
71
|
+
event.sessionId = this._sessionId;
|
|
72
|
+
this._queue.push({ event, name });
|
|
73
|
+
this.processQueue();
|
|
74
|
+
return event;
|
|
75
|
+
}
|
|
76
|
+
async processQueue() {
|
|
77
|
+
if (this._processing)
|
|
78
|
+
return;
|
|
79
|
+
this._processing = true;
|
|
80
|
+
const obj = this._queue.shift();
|
|
81
|
+
if (!obj) {
|
|
82
|
+
this._processing = false;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
await this.service.dispatch(obj.event, obj.name);
|
|
86
|
+
this.processQueue();
|
|
87
|
+
}
|
|
88
|
+
determineSessionId() {
|
|
89
|
+
const sessionTimestamp = parseInt(window.localStorage.getItem(this._tokenId) ?? "");
|
|
90
|
+
const sessionId = window.localStorage.getItem("ems_et_sessionId");
|
|
91
|
+
const now = (new Date()).getTime();
|
|
92
|
+
if (!isNaN(sessionTimestamp) && !empty(sessionId) && this.stillInSession(now, sessionTimestamp)) {
|
|
93
|
+
return sessionId;
|
|
94
|
+
}
|
|
95
|
+
return v4();
|
|
96
|
+
}
|
|
97
|
+
stillInSession(time1, time2) {
|
|
98
|
+
return Math.abs(time1 - time2) < this.limit;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
EventDispatcherComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, deps: [{ token: EventDispatcherService }], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
+
EventDispatcherComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: EventDispatcherComponent, selector: "event-dispatcher", inputs: { endpoint: "endpoint", session: "session", token: "token", limit: ["sessionLimit", "limit"] }, ngImport: i0, template: '<div id="event-dispatcher"></div>', isInline: true });
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherComponent, decorators: [{
|
|
104
|
+
type: Component,
|
|
105
|
+
args: [{
|
|
106
|
+
selector: 'event-dispatcher',
|
|
107
|
+
template: '<div id="event-dispatcher"></div>',
|
|
108
|
+
styles: []
|
|
109
|
+
}]
|
|
110
|
+
}], ctorParameters: function () { return [{ type: EventDispatcherService }]; }, propDecorators: { endpoint: [{
|
|
111
|
+
type: Input,
|
|
112
|
+
args: ["endpoint"]
|
|
113
|
+
}], session: [{
|
|
114
|
+
type: Input,
|
|
115
|
+
args: ["session"]
|
|
116
|
+
}], token: [{
|
|
117
|
+
type: Input,
|
|
118
|
+
args: ["token"]
|
|
119
|
+
}], limit: [{
|
|
120
|
+
type: Input,
|
|
121
|
+
args: ["sessionLimit"]
|
|
122
|
+
}] } });
|
|
123
|
+
|
|
124
|
+
class EventDispatcherModule {
|
|
125
|
+
}
|
|
126
|
+
EventDispatcherModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
127
|
+
EventDispatcherModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, declarations: [EventDispatcherComponent], exports: [EventDispatcherComponent] });
|
|
128
|
+
EventDispatcherModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, imports: [[]] });
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EventDispatcherModule, decorators: [{
|
|
130
|
+
type: NgModule,
|
|
131
|
+
args: [{
|
|
132
|
+
declarations: [
|
|
133
|
+
EventDispatcherComponent
|
|
134
|
+
],
|
|
135
|
+
imports: [],
|
|
136
|
+
exports: [
|
|
137
|
+
EventDispatcherComponent
|
|
138
|
+
]
|
|
139
|
+
}]
|
|
140
|
+
}] });
|
|
141
|
+
|
|
142
|
+
/*
|
|
143
|
+
* Public API Surface of event-dispatcher
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Generated bundle index. Do not edit.
|
|
148
|
+
*/
|
|
149
|
+
|
|
150
|
+
export { EventDispatcherComponent, EventDispatcherModule, EventDispatcherService };
|
|
151
|
+
//# sourceMappingURL=ems-web-app-event-tracker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ems-web-app-event-tracker.mjs","sources":["../../src/lib/event-dispatcher.service.ts","../../src/lib/event-dispatcher.component.ts","../../src/lib/event-dispatcher.module.ts","../../src/public-api.ts","../../src/ems-web-app-event-tracker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpResponse, HttpRequest, HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { Observable, Subject, BehaviorSubject, throwError, of } from 'rxjs';\nimport { catchError, map, tap, take } from \"rxjs/operators\";\nimport { v4 as uuid } from \"uuid\";\nimport { trace, empty } from \"ems-web-app-utils\";\nimport * as _ from \"underscore\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EventDispatcherService {\n \n public jwt?: string;\n public endpoint!: string;\n\n constructor(private http: HttpClient) {}\n\n public dispatch(event: any, name?: string):Promise<any> {\n const key = `${name ?? uuid()}.json`;\n const request = this.buildRequest(key);\n return this.executePutRequest(request, event);\n }\n\n private executePutRequest(request: string, data: any, transform?: (input: any) => any, suppressErrors?: boolean, customHeaders?: any ): Promise<any> {\n const headers = this.headers(customHeaders || {});\n return this.http.put(request, data, { headers, withCredentials: true }).pipe(\n map((result: any) => \n transform ? transform(result) : result\n ),\n catchError(suppressErrors ? this.handleErrorQuietly : this.handleError)\n ).toPromise()\n }\n\n private buildRequest(endpoint: string): string {\n return `${this.endpoint}/${endpoint}`;\n }\n\n private handleError(error: HttpErrorResponse) {\n return throwError(error);\n }\n\n private handleErrorQuietly(error: HttpErrorResponse) {\n console.error(error);\n return of(null);\n }\n\n private headers(custom: any = {}): HttpHeaders {\n const headers = _.extend({ \n \"Content-Type\": \"application/json\",\n \"Authorization\": empty(this.jwt) ? undefined : `Bearer ${this.jwt}` \n }, custom);\n return new HttpHeaders(headers);\n }\n}\n","import { Component, OnInit, Input, Output } from '@angular/core';\nimport { EventDispatcherService } from \"./event-dispatcher.service\";\nimport { v4 as uuid } from \"uuid\";\nimport { trace, empty } from \"ems-web-app-utils\";\n\n@Component({\n selector: 'event-dispatcher',\n template: '<div id=\"event-dispatcher\"></div>',\n styles: [\n ]\n})\nexport class EventDispatcherComponent implements OnInit {\n\n @Input(\"endpoint\") endpoint!: string;\n @Input(\"session\") session?: any;\n @Input(\"token\") token?: string;\n @Input(\"sessionLimit\") limit: number = 1800000; //30m\n\n private _queue: any[] = [];\n private _processing: boolean = false;\n private _tokenId: string;\n private _sessionId!: string;\n \n constructor(private service: EventDispatcherService) {\n this.service.jwt = this.session?.idToken.jwtToken ?? this.token;\n this.service.endpoint = this.endpoint;\n this._tokenId = this.session?.idToken.payload.jti ?? this.token;\n this._sessionId = this.determineSessionId();\n window.localStorage.setItem(\"ems_et_sessionId\", this._sessionId);\n }\n\n ngOnInit(): void {\n window.setInterval(this.updateSession, 1000);\n }\n\n public dispatch(event: any, name?: string): any {\n event.sessionId = this._sessionId;\n this._queue.push({ event, name });\n this.processQueue();\n return event;\n }\n\n private async processQueue() {\n if(this._processing) return;\n this._processing = true;\n\n const obj = this._queue.shift();\n if(!obj) {\n this._processing = false;\n return;\n }\n\n await this.service.dispatch(obj.event, obj.name);\n this.processQueue(); \n }\n\n private determineSessionId() {\n const sessionTimestamp = parseInt(window.localStorage.getItem(this._tokenId) ?? \"\");\n const sessionId = window.localStorage.getItem(\"ems_et_sessionId\");\n const now = (new Date()).getTime();\n\n if(!isNaN(sessionTimestamp) && !empty(sessionId) && this.stillInSession(now, sessionTimestamp)) {\n return sessionId!;\n }\n \n return uuid();\n }\n\n private stillInSession(time1: number, time2: number) {\n return Math.abs(time1 - time2) < this.limit;\n }\n\n private updateSession = () => {\n const timestamp = (new Date()).getTime();\n window.localStorage.setItem(this._tokenId, timestamp.toString());\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { EventDispatcherComponent } from './event-dispatcher.component';\n\n\n\n@NgModule({\n declarations: [\n EventDispatcherComponent\n ],\n imports: [\n ],\n exports: [\n EventDispatcherComponent\n ]\n})\nexport class EventDispatcherModule { }\n","/*\n * Public API Surface of event-dispatcher\n */\n\nexport * from './lib/event-dispatcher.service';\nexport * from './lib/event-dispatcher.component';\nexport * from './lib/event-dispatcher.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuid","i1.EventDispatcherService"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { EventDispatcherService } from "./event-dispatcher.service";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class EventDispatcherComponent implements OnInit {
|
|
5
|
+
private service;
|
|
6
|
+
endpoint: string;
|
|
7
|
+
session?: any;
|
|
8
|
+
token?: string;
|
|
9
|
+
limit: number;
|
|
10
|
+
private _queue;
|
|
11
|
+
private _processing;
|
|
12
|
+
private _tokenId;
|
|
13
|
+
private _sessionId;
|
|
14
|
+
constructor(service: EventDispatcherService);
|
|
15
|
+
ngOnInit(): void;
|
|
16
|
+
dispatch(event: any, name?: string): any;
|
|
17
|
+
private processQueue;
|
|
18
|
+
private determineSessionId;
|
|
19
|
+
private stillInSession;
|
|
20
|
+
private updateSession;
|
|
21
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EventDispatcherComponent, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EventDispatcherComponent, "event-dispatcher", never, { "endpoint": "endpoint"; "session": "session"; "token": "token"; "limit": "sessionLimit"; }, {}, never, never>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./event-dispatcher.component";
|
|
3
|
+
export declare class EventDispatcherModule {
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EventDispatcherModule, never>;
|
|
5
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EventDispatcherModule, [typeof i1.EventDispatcherComponent], never, [typeof i1.EventDispatcherComponent]>;
|
|
6
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<EventDispatcherModule>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class EventDispatcherService {
|
|
4
|
+
private http;
|
|
5
|
+
jwt?: string;
|
|
6
|
+
endpoint: string;
|
|
7
|
+
constructor(http: HttpClient);
|
|
8
|
+
dispatch(event: any, name?: string): Promise<any>;
|
|
9
|
+
private executePutRequest;
|
|
10
|
+
private buildRequest;
|
|
11
|
+
private handleError;
|
|
12
|
+
private handleErrorQuietly;
|
|
13
|
+
private headers;
|
|
14
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EventDispatcherService, never>;
|
|
15
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<EventDispatcherService>;
|
|
16
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ems-web-app-event-tracker",
|
|
3
|
+
"author": "Chris Spence (https://educationalmediasolutions.com)",
|
|
4
|
+
"description": "This angular.io module includes a component and service that dispatch events to a given endpoint, while tracking a local session.",
|
|
5
|
+
"funding": "https://paypal.me/spencech",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"version": "0.0.5",
|
|
8
|
+
"peerDependencies": {
|
|
9
|
+
"@angular/common": "^13.2.0",
|
|
10
|
+
"@angular/core": "^13.2.0",
|
|
11
|
+
"@types/uuid": "^9.0.8",
|
|
12
|
+
"amazon-cognito-identity-js": "^5.2.10",
|
|
13
|
+
"aws-sdk": "^2.1171.0",
|
|
14
|
+
"cross-fetch": "^3.1.5",
|
|
15
|
+
"ems-web-app-utils": "^0.0.23",
|
|
16
|
+
"uuid": "^9.0.1",
|
|
17
|
+
"underscore": "^1.13.6",
|
|
18
|
+
"@types/underscore": "^1.11.15"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"tslib": "^2.3.0"
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/spencech/ems-web-app-event-tracker.git"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"ems",
|
|
29
|
+
"educational media solutions",
|
|
30
|
+
"educational",
|
|
31
|
+
"media",
|
|
32
|
+
"solutions",
|
|
33
|
+
"web app",
|
|
34
|
+
"web application",
|
|
35
|
+
"cognito",
|
|
36
|
+
"aws",
|
|
37
|
+
"event",
|
|
38
|
+
"tracking",
|
|
39
|
+
"analytics",
|
|
40
|
+
"angular.io",
|
|
41
|
+
"angular",
|
|
42
|
+
"module"
|
|
43
|
+
],
|
|
44
|
+
"module": "fesm2015/ems-web-app-event-tracker.mjs",
|
|
45
|
+
"es2020": "fesm2020/ems-web-app-event-tracker.mjs",
|
|
46
|
+
"esm2020": "esm2020/ems-web-app-event-tracker.mjs",
|
|
47
|
+
"fesm2020": "fesm2020/ems-web-app-event-tracker.mjs",
|
|
48
|
+
"fesm2015": "fesm2015/ems-web-app-event-tracker.mjs",
|
|
49
|
+
"typings": "ems-web-app-event-tracker.d.ts",
|
|
50
|
+
"exports": {
|
|
51
|
+
"./package.json": {
|
|
52
|
+
"default": "./package.json"
|
|
53
|
+
},
|
|
54
|
+
".": {
|
|
55
|
+
"types": "./ems-web-app-event-tracker.d.ts",
|
|
56
|
+
"esm2020": "./esm2020/ems-web-app-event-tracker.mjs",
|
|
57
|
+
"es2020": "./fesm2020/ems-web-app-event-tracker.mjs",
|
|
58
|
+
"es2015": "./fesm2015/ems-web-app-event-tracker.mjs",
|
|
59
|
+
"node": "./fesm2015/ems-web-app-event-tracker.mjs",
|
|
60
|
+
"default": "./fesm2020/ems-web-app-event-tracker.mjs"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"sideEffects": false
|
|
64
|
+
}
|
package/public-api.d.ts
ADDED