@kolektor/nucleus-notifications 0.1.0-pre.124 → 0.1.139
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/esm2022/index.mjs +1 -1
- package/esm2022/kolektor-nucleus-notifications.mjs +1 -1
- package/esm2022/lib/models.mjs +1 -1
- package/esm2022/lib/nucleus-notifications.module.mjs +3 -5
- package/esm2022/lib/nucleus-notifications.service.mjs +74 -46
- package/fesm2022/kolektor-nucleus-notifications.mjs +73 -47
- package/fesm2022/kolektor-nucleus-notifications.mjs.map +1 -1
- package/package.json +2 -2
package/esm2022/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './lib/nucleus-notifications.service';
|
|
2
2
|
export * from './lib/nucleus-notifications.module';
|
|
3
3
|
export * from './lib/models';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMvbnVjbGV1cy1ub3RpZmljYXRpb25zL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscyc7XG4iXX0=
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Generated bundle index. Do not edit.
|
|
3
3
|
*/
|
|
4
4
|
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29sZWt0b3ItbnVjbGV1cy1ub3RpZmljYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzL251Y2xldXMtbm90aWZpY2F0aW9ucy9zcmMva29sZWt0b3ItbnVjbGV1cy1ub3RpZmljYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
package/esm2022/lib/models.mjs
CHANGED
|
@@ -20,4 +20,4 @@ export class NotificationClick {
|
|
|
20
20
|
}
|
|
21
21
|
export class UserChannelConfig {
|
|
22
22
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZy9udWNsZXVzL251Y2xldXMtbm90aWZpY2F0aW9ucy9zcmMvbGliL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sWUFBWTtDQU94QjtBQUVELE1BQU0sT0FBTyxRQUFRO0NBSXBCO0FBRUQsTUFBTSxPQUFPLFNBQVM7Q0FJckI7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0NBTTVCO0FBRUQsTUFBTSxPQUFPLE1BQU07Q0FFbEI7QUFFRCxNQUFNLE9BQU8sWUFBWTtDQUl4QjtBQUVELE1BQU0sT0FBTyxrQkFBa0I7Q0FFOUI7QUFFRCxNQUFNLE9BQU8sV0FBVztDQUd2QjtBQUVELE1BQU0sT0FBTywwQkFBMEI7Q0FFdEM7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBSTdCO0FBbUJELE1BQU0sT0FBTyxpQkFBaUI7Q0FPN0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIHtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyBzZW5kZXI6IElkZW50aXR5O1xuICBwdWJsaWMgZGF0YTogTm90aWZpY2F0aW9uRGF0YTtcbiAgcHVibGljIGlzUmVhZDogYm9vbGVhbjtcbiAgcHVibGljIGRhdGVDcmVhdGVkOiBEYXRlO1xuICBwdWJsaWMgZXhwaXJhdGlvbkRhdGU6IERhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eSB7XG4gIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmc7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBwaWN0dXJlVXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNpcGllbnQge1xuICBwdWJsaWMgYXR0cmlidXRlTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZGlyZWN0b3J5TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYXR0cmlidXRlVmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkRhdGEge1xuICB0aXRsZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGh0bWxNZXNzYWdlOiBzdHJpbmc7XG4gIHByZXZlbnREaXNtaXNzYWw6IGJvb2xlYW47XG4gIGRlZXBMaW5rOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJLZXkge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBQbGF0Zm9ybVZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUmVzdWx0IHtcbiAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBheWxvYWREYXRhIHtcbiAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgZXZlbnRUeXBlOiBOb3RpZmljYXRpb25FdmVudFR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZXVzTm90aWZpY2F0aW9uc0NvbmZpZyB7XG4gIHNlcnZlckFwaVVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ2xpY2sge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICByb3V0ZXJMaW5rPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25FdmVudFR5cGUgPVxuICB8ICduZXcnXG4gIHwgJ3VwZGF0ZWQnXG4gIHwgJ2RlbGV0ZWQnXG4gIHwgJ2RlbGV0ZWRBbGwnXG4gIHwgJ3VwZGF0ZWRBbGwnXG4gIHwgJ25ld1NpbGVudCc7XG5cbmV4cG9ydCB0eXBlIFBsYXRmb3JtVmFsdWUgPSAnaW9zJyB8ICdhbmRyb2lkJyB8ICd3ZWInIHwgJ25vbmUnO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25UeXBlID0gJ2RlZmF1bHQnIHwgJ2RlZXBsaW5rJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSWQge1xuICBzZW5kZXJJZDogc3RyaW5nO1xuICBjaGFubmVsSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJDaGFubmVsQ29uZmlnIHtcbiAgY2hhbm5lbElkOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGlzU3Vic2NyaWJlZDogYm9vbGVhbjtcbiAgc3Vic2NyaXB0aW9uVHlwZTogQ2hhbm5lbFN1YnNjcmlwdGlvblR5cGU7XG4gIG1ldGhvZHM6IE5vdGlmeU1ldGhvZFtdO1xuICBhbGxvd2VkTWV0aG9kczogTm90aWZ5TWV0aG9kW107XG59XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxTdWJzY3JpcHRpb25UeXBlID0gJ2ludmFyaWFudCcgfCAnb3B0SW4nIHwgJ29wdE91dCc7XG5cbmV4cG9ydCB0eXBlIE5vdGlmeU1ldGhvZCA9ICdwdXNoJyB8ICdlbWFpbCcgfCAnc21zJztcbiJdfQ==
|
|
@@ -5,9 +5,7 @@ export class NucleusNotificationsModule {
|
|
|
5
5
|
static forRoot(config) {
|
|
6
6
|
return {
|
|
7
7
|
ngModule: NucleusNotificationsModule,
|
|
8
|
-
providers: [
|
|
9
|
-
{ provide: NucleusNotificationsConfig, useValue: config }
|
|
10
|
-
]
|
|
8
|
+
providers: [{ provide: NucleusNotificationsConfig, useValue: config }],
|
|
11
9
|
};
|
|
12
10
|
}
|
|
13
11
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
@@ -19,7 +17,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
19
17
|
args: [{
|
|
20
18
|
declarations: [],
|
|
21
19
|
imports: [],
|
|
22
|
-
exports: []
|
|
20
|
+
exports: [],
|
|
23
21
|
}]
|
|
24
22
|
}] });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1ub3RpZmljYXRpb25zLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmcvbnVjbGV1cy9udWNsZXVzLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFPdEQsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQWtDO1FBRWxDLE9BQU87WUFDTCxRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN2RSxDQUFDO0lBQ0osQ0FBQzsrR0FSVSwwQkFBMEI7Z0hBQTFCLDBCQUEwQjtnSEFBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUx0QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxFQUFFO29CQUNoQixPQUFPLEVBQUUsRUFBRTtvQkFDWCxPQUFPLEVBQUUsRUFBRTtpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOdWNsZXVzTm90aWZpY2F0aW9uc0NvbmZpZyB9IGZyb20gJy4vbW9kZWxzJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW10sXG4gIGV4cG9ydHM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBOdWNsZXVzTm90aWZpY2F0aW9uc01vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIGNvbmZpZzogTnVjbGV1c05vdGlmaWNhdGlvbnNDb25maWdcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOdWNsZXVzTm90aWZpY2F0aW9uc01vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTnVjbGV1c05vdGlmaWNhdGlvbnNNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE51Y2xldXNOb3RpZmljYXRpb25zQ29uZmlnLCB1c2VWYWx1ZTogY29uZmlnIH1dLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
3
|
import { Injectable } from '@angular/core';
|
|
4
4
|
import { SwPush } from '@angular/service-worker';
|
|
5
|
-
import { PushNotifications } from '@capacitor/push-notifications';
|
|
5
|
+
import { PushNotifications, } from '@capacitor/push-notifications';
|
|
6
6
|
import { NucleusAppService } from '@kolektor/nucleus-common';
|
|
7
7
|
import { of, Subject } from 'rxjs';
|
|
8
|
-
import { NucleusNotificationsConfig } from './models';
|
|
8
|
+
import { NucleusNotificationsConfig, } from './models';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "@angular/common/http";
|
|
11
11
|
import * as i2 from "@angular/service-worker";
|
|
@@ -30,7 +30,7 @@ export class NucleusNotificationsService {
|
|
|
30
30
|
this.apiUrl = url;
|
|
31
31
|
}
|
|
32
32
|
get unreadCount() {
|
|
33
|
-
return this.notifications.filter(x => !x.isRead).length;
|
|
33
|
+
return this.notifications.filter((x) => !x.isRead).length;
|
|
34
34
|
}
|
|
35
35
|
get newNotifications() {
|
|
36
36
|
return this._newNotifications.asObservable();
|
|
@@ -68,44 +68,56 @@ export class NucleusNotificationsService {
|
|
|
68
68
|
}
|
|
69
69
|
register() {
|
|
70
70
|
return new Promise((_resolve, _reject) => {
|
|
71
|
-
this.getRegistrationInfo()
|
|
72
|
-
|
|
71
|
+
this.getRegistrationInfo()
|
|
72
|
+
.then((info) => {
|
|
73
|
+
this.http
|
|
74
|
+
.post(this.apiUrl + 'registration', info)
|
|
75
|
+
.subscribe((regResult) => {
|
|
73
76
|
window.localStorage.setItem(this.registrationStorageKey, regResult.id);
|
|
74
77
|
_resolve(null);
|
|
75
|
-
}, error => {
|
|
78
|
+
}, (error) => {
|
|
76
79
|
console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);
|
|
77
80
|
_reject(error);
|
|
78
81
|
});
|
|
79
|
-
})
|
|
82
|
+
})
|
|
83
|
+
.catch((error) => _reject(error));
|
|
80
84
|
});
|
|
81
85
|
}
|
|
82
86
|
unregister() {
|
|
83
87
|
return new Promise((_resolve, _reject) => {
|
|
84
|
-
this.getRegistrationInfo()
|
|
85
|
-
|
|
88
|
+
this.getRegistrationInfo()
|
|
89
|
+
.then((info) => {
|
|
90
|
+
this.http
|
|
91
|
+
.request('DELETE', this.apiUrl + 'registration', {
|
|
92
|
+
body: info,
|
|
93
|
+
})
|
|
94
|
+
.subscribe(() => {
|
|
86
95
|
window.localStorage.removeItem(this.registrationStorageKey);
|
|
87
96
|
_resolve(null);
|
|
88
|
-
}, error => {
|
|
97
|
+
}, (error) => {
|
|
89
98
|
console.log('Nucleus.Notifications: Failed to remove registration from server.', error);
|
|
90
99
|
_reject(error);
|
|
91
100
|
});
|
|
92
|
-
})
|
|
101
|
+
})
|
|
102
|
+
.catch((error) => _reject(error));
|
|
93
103
|
});
|
|
94
104
|
}
|
|
95
105
|
refresh(notifyAboutNew = false) {
|
|
96
|
-
this.http
|
|
106
|
+
this.http
|
|
107
|
+
.get(this.apiUrl + 'notifications')
|
|
108
|
+
.subscribe((res) => {
|
|
97
109
|
this.updateNotifications(res, notifyAboutNew);
|
|
98
110
|
});
|
|
99
111
|
}
|
|
100
112
|
getNotification(id) {
|
|
101
|
-
const localNotification = this.notifications.find(x => x.id === id);
|
|
113
|
+
const localNotification = this.notifications.find((x) => x.id === id);
|
|
102
114
|
if (localNotification) {
|
|
103
115
|
return of(localNotification);
|
|
104
116
|
}
|
|
105
117
|
return this.http.get(this.apiUrl + 'notifications/' + id);
|
|
106
118
|
}
|
|
107
119
|
readNotification(id) {
|
|
108
|
-
const n = this.notifications.find(x => x.id === id);
|
|
120
|
+
const n = this.notifications.find((x) => x.id === id);
|
|
109
121
|
if (n && !n.isRead) {
|
|
110
122
|
n.isRead = true;
|
|
111
123
|
this.notifyStateChanged();
|
|
@@ -136,14 +148,15 @@ export class NucleusNotificationsService {
|
|
|
136
148
|
this.http.get(this.apiUrl + 'notifications/read/all').subscribe();
|
|
137
149
|
}
|
|
138
150
|
getChannelConfig(senderId, channelId, language) {
|
|
139
|
-
return this.http.get(this.apiUrl +
|
|
151
|
+
return this.http.get(this.apiUrl +
|
|
152
|
+
`settings/channel/${senderId}/${channelId}?language=${language}`);
|
|
140
153
|
}
|
|
141
154
|
getChannelConfigsForSender(senderId, channelIds, language) {
|
|
142
|
-
const idsStr = channelIds.map(x => senderId + ',' + x).join(';');
|
|
155
|
+
const idsStr = channelIds.map((x) => senderId + ',' + x).join(';');
|
|
143
156
|
return this.getChannelConfigsInternal(idsStr, language);
|
|
144
157
|
}
|
|
145
158
|
getChannelConfigs(ids, language) {
|
|
146
|
-
const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');
|
|
159
|
+
const idsStr = ids.map((x) => x.senderId + ',' + x.channelId).join(';');
|
|
147
160
|
return this.getChannelConfigsInternal(idsStr, language);
|
|
148
161
|
}
|
|
149
162
|
setChannelConfig(senderId, config) {
|
|
@@ -158,7 +171,7 @@ export class NucleusNotificationsService {
|
|
|
158
171
|
updateNotifications(newNotifications, notifyAboutNew = false) {
|
|
159
172
|
let stateChanged = false;
|
|
160
173
|
for (const n of newNotifications) {
|
|
161
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
174
|
+
const existing = this.notifications.find((x) => x.id === n.id);
|
|
162
175
|
if (existing) {
|
|
163
176
|
if (existing.isRead !== n.isRead) {
|
|
164
177
|
existing.isRead = n.isRead;
|
|
@@ -167,7 +180,8 @@ export class NucleusNotificationsService {
|
|
|
167
180
|
}
|
|
168
181
|
else {
|
|
169
182
|
let i = 0;
|
|
170
|
-
while (i < this.notifications.length &&
|
|
183
|
+
while (i < this.notifications.length &&
|
|
184
|
+
n.dateCreated < this.notifications[i].dateCreated) {
|
|
171
185
|
i++;
|
|
172
186
|
}
|
|
173
187
|
this.notifications.splice(i, 0, n);
|
|
@@ -180,7 +194,8 @@ export class NucleusNotificationsService {
|
|
|
180
194
|
const now = Date.now();
|
|
181
195
|
for (let i = this.notifications.length - 1; i >= 0; i--) {
|
|
182
196
|
const n = this.notifications[i];
|
|
183
|
-
if (new Date(n.expirationDate).getTime() < now ||
|
|
197
|
+
if (new Date(n.expirationDate).getTime() < now ||
|
|
198
|
+
!newNotifications.find((x) => x.id === n.id)) {
|
|
184
199
|
this.notifications.splice(i, 1);
|
|
185
200
|
stateChanged = true;
|
|
186
201
|
}
|
|
@@ -198,20 +213,23 @@ export class NucleusNotificationsService {
|
|
|
198
213
|
const str = window.localStorage.getItem(this.notificationsStorageKey);
|
|
199
214
|
if (str) {
|
|
200
215
|
const notifications = JSON.parse(str);
|
|
201
|
-
this.notifications = notifications.filter(x => !!x);
|
|
216
|
+
this.notifications = notifications.filter((x) => !!x);
|
|
202
217
|
// precaution for notification.isRead of undefined error
|
|
203
218
|
this.notifyStateChanged(false);
|
|
204
219
|
}
|
|
205
220
|
}
|
|
206
|
-
catch {
|
|
221
|
+
catch {
|
|
222
|
+
/* empty */
|
|
223
|
+
}
|
|
207
224
|
}
|
|
208
225
|
handleNotificationEvent(id, eventType) {
|
|
209
|
-
if (eventType.startsWith('new') || eventType === 'updated') {
|
|
210
|
-
|
|
226
|
+
if (eventType.startsWith('new') || eventType === 'updated') {
|
|
227
|
+
// we are handling new and newSilent
|
|
228
|
+
this.getNotification(id).subscribe((n) => {
|
|
211
229
|
if (eventType.startsWith('new') && !n.isRead) {
|
|
212
230
|
this._newNotifications.next(n);
|
|
213
231
|
}
|
|
214
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
232
|
+
const existing = this.notifications.find((x) => x.id === n.id);
|
|
215
233
|
if (existing) {
|
|
216
234
|
existing.isRead = n.isRead;
|
|
217
235
|
}
|
|
@@ -229,7 +247,7 @@ export class NucleusNotificationsService {
|
|
|
229
247
|
}
|
|
230
248
|
}
|
|
231
249
|
deleteNotificaton(id) {
|
|
232
|
-
const i = this.notifications.findIndex(x => x.id === id);
|
|
250
|
+
const i = this.notifications.findIndex((x) => x.id === id);
|
|
233
251
|
if (i >= 0) {
|
|
234
252
|
this.notifications.splice(i, 1);
|
|
235
253
|
this.notifyStateChanged();
|
|
@@ -249,7 +267,7 @@ export class NucleusNotificationsService {
|
|
|
249
267
|
const notificationClick = {
|
|
250
268
|
id: arr[0],
|
|
251
269
|
type: arr[1],
|
|
252
|
-
routerLink: arr[2]
|
|
270
|
+
routerLink: arr[2],
|
|
253
271
|
};
|
|
254
272
|
const validNotificationClickTypes = ['default', 'deeplink'];
|
|
255
273
|
if (validNotificationClickTypes.includes(notificationClick.type)) {
|
|
@@ -261,15 +279,15 @@ export class NucleusNotificationsService {
|
|
|
261
279
|
}
|
|
262
280
|
removeDeliveredNotification(id) {
|
|
263
281
|
if (this._platform === 'ios' || this._platform === 'android') {
|
|
264
|
-
PushNotifications.getDeliveredNotifications().then(list => {
|
|
265
|
-
const toRemove = list.notifications.filter(n => {
|
|
282
|
+
PushNotifications.getDeliveredNotifications().then((list) => {
|
|
283
|
+
const toRemove = list.notifications.filter((n) => {
|
|
266
284
|
const data = this.getNotificationPayloadData(n);
|
|
267
|
-
return
|
|
285
|
+
return data.notificationId === id;
|
|
268
286
|
});
|
|
269
287
|
// TODO: On Android this does not currently work because notificationID is not set.
|
|
270
288
|
// This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523
|
|
271
289
|
PushNotifications.removeDeliveredNotifications({
|
|
272
|
-
notifications: toRemove
|
|
290
|
+
notifications: toRemove,
|
|
273
291
|
});
|
|
274
292
|
});
|
|
275
293
|
}
|
|
@@ -278,15 +296,18 @@ export class NucleusNotificationsService {
|
|
|
278
296
|
}
|
|
279
297
|
}
|
|
280
298
|
getNotificationPayloadData(pushNotification) {
|
|
281
|
-
return
|
|
299
|
+
return this._platform === 'ios'
|
|
300
|
+
? pushNotification.data.data
|
|
301
|
+
: pushNotification.data;
|
|
282
302
|
}
|
|
283
303
|
async registerCapacitorEvents() {
|
|
284
|
-
await PushNotifications.addListener('pushNotificationReceived', n => {
|
|
304
|
+
await PushNotifications.addListener('pushNotificationReceived', (n) => {
|
|
285
305
|
const data = this.getNotificationPayloadData(n);
|
|
286
|
-
console.log('Nucleus.Notifications: Received capacitor push event: ' +
|
|
306
|
+
console.log('Nucleus.Notifications: Received capacitor push event: ' +
|
|
307
|
+
data.eventType, n);
|
|
287
308
|
this.handleNotificationEvent(data.notificationId, data.eventType);
|
|
288
309
|
});
|
|
289
|
-
await PushNotifications.addListener('pushNotificationActionPerformed', a => {
|
|
310
|
+
await PushNotifications.addListener('pushNotificationActionPerformed', (a) => {
|
|
290
311
|
let action = a.notification.data.notificationAction;
|
|
291
312
|
if (this._platform === 'ios') {
|
|
292
313
|
action = a.notification.data.data.notificationAction;
|
|
@@ -312,20 +333,24 @@ export class NucleusNotificationsService {
|
|
|
312
333
|
const registrationId = window.localStorage.getItem(this.registrationStorageKey);
|
|
313
334
|
if (this._platform === 'android' || this._platform === 'ios') {
|
|
314
335
|
// capacitor platform
|
|
315
|
-
const listener = PushNotifications.addListener('registration', token => {
|
|
336
|
+
const listener = PushNotifications.addListener('registration', (token) => {
|
|
316
337
|
listener.remove();
|
|
317
|
-
_resolve({
|
|
338
|
+
_resolve({
|
|
339
|
+
id: registrationId,
|
|
340
|
+
token: token.value,
|
|
341
|
+
platform: this._platform,
|
|
342
|
+
});
|
|
318
343
|
});
|
|
319
|
-
PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));
|
|
344
|
+
PushNotifications.register().catch((error) => _reject('Could not register for notifications:' + error));
|
|
320
345
|
}
|
|
321
346
|
else if (this._platform === 'web') {
|
|
322
347
|
// Web Push API
|
|
323
|
-
this.http.get(this.apiUrl + 'registration/webkey').subscribe(key => {
|
|
324
|
-
this.getWebPushSubscription(key.publicKey).then(subscription => {
|
|
348
|
+
this.http.get(this.apiUrl + 'registration/webkey').subscribe((key) => {
|
|
349
|
+
this.getWebPushSubscription(key.publicKey).then((subscription) => {
|
|
325
350
|
const t = JSON.stringify(subscription.toJSON());
|
|
326
351
|
_resolve({ id: registrationId, token: t, platform: 'web' });
|
|
327
352
|
});
|
|
328
|
-
}, error => _reject(error));
|
|
353
|
+
}, (error) => _reject(error));
|
|
329
354
|
}
|
|
330
355
|
else {
|
|
331
356
|
_reject(`Nucleus.Notifications: Platform is not supported`);
|
|
@@ -334,14 +359,17 @@ export class NucleusNotificationsService {
|
|
|
334
359
|
}
|
|
335
360
|
getWebPushSubscription(publicKey) {
|
|
336
361
|
return new Promise((_resolve, _reject) => {
|
|
337
|
-
this.swPush.subscription.subscribe(subscription => {
|
|
362
|
+
this.swPush.subscription.subscribe((subscription) => {
|
|
338
363
|
if (subscription != null) {
|
|
339
364
|
_resolve(subscription);
|
|
340
365
|
}
|
|
341
366
|
else {
|
|
342
|
-
this.swPush
|
|
367
|
+
this.swPush
|
|
368
|
+
.requestSubscription({ serverPublicKey: publicKey })
|
|
369
|
+
.then((s) => _resolve(s))
|
|
370
|
+
.catch((e) => _reject(e));
|
|
343
371
|
}
|
|
344
|
-
}, error => {
|
|
372
|
+
}, (error) => {
|
|
345
373
|
console.error('Nucleus.Notifications: Cannot get web push subscription', error);
|
|
346
374
|
_reject(error);
|
|
347
375
|
});
|
|
@@ -353,7 +381,7 @@ export class NucleusNotificationsService {
|
|
|
353
381
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusNotificationsService, decorators: [{
|
|
354
382
|
type: Injectable,
|
|
355
383
|
args: [{
|
|
356
|
-
providedIn: 'root'
|
|
384
|
+
providedIn: 'root',
|
|
357
385
|
}]
|
|
358
386
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SwPush }, { type: i3.NucleusAppService }, { type: i4.NucleusNotificationsConfig }]; } });
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMtbm90aWZpY2F0aW9ucy9zcmMvbGliL251Y2xldXMtbm90aWZpY2F0aW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLCtCQUErQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFNTCwwQkFBMEIsRUFPM0IsTUFBTSxVQUFVLENBQUM7Ozs7OztBQUtsQixNQUFNLE9BQU8sMkJBQTJCO0lBRXRDLFlBQ1UsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFVBQTZCLEVBQ3JDLE1BQWtDO1FBSDFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBV3RCLDJCQUFzQixHQUFHLG9DQUFvQyxDQUFDO1FBQzlELDRCQUF1QixHQUFHLGdDQUFnQyxDQUFDO1FBRXBFLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQ2hELG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7UUFDbEQseUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUU1QyxrQkFBYSxHQUFtQixF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Q0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2FBQzdEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsU0FBaUI7UUFDOUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ2hELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtvQkFDeEIsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9HO1lBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hGLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FsWFUsMkJBQTJCO21IQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs7NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTd1B1c2ggfSBmcm9tICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlcic7XG5pbXBvcnQgeyBQdXNoTm90aWZpY2F0aW9ucywgUHVzaE5vdGlmaWNhdGlvblNjaGVtYSB9IGZyb20gJ0BjYXBhY2l0b3IvcHVzaC1ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IE51Y2xldXNBcHBTZXJ2aWNlIH0gZnJvbSAnQGtvbGVrdG9yL251Y2xldXMtY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDaGFubmVsSWQsXG4gIE5vdGlmaWNhdGlvbixcbiAgTm90aWZpY2F0aW9uQ2xpY2ssXG4gIE5vdGlmaWNhdGlvbkV2ZW50VHlwZSxcbiAgTm90aWZpY2F0aW9uVHlwZSxcbiAgTnVjbGV1c05vdGlmaWNhdGlvbnNDb25maWcsXG4gIFBheWxvYWREYXRhLFxuICBQbGF0Zm9ybVZhbHVlLFxuICBSZWdpc3RyYXRpb24sXG4gIFJlZ2lzdHJhdGlvblJlc3VsdCxcbiAgVXNlckNoYW5uZWxDb25maWcsXG4gIFdlYktleVxufSBmcm9tICcuL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE51Y2xldXNOb3RpZmljYXRpb25zU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgc3dQdXNoOiBTd1B1c2gsXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBOdWNsZXVzQXBwU2VydmljZSxcbiAgICBjb25maWc6IE51Y2xldXNOb3RpZmljYXRpb25zQ29uZmlnXG4gICkge1xuICAgIGxldCB1cmwgPSBjb25maWcuc2VydmVyQXBpVXJsO1xuICAgIGlmICghdXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHVybCArPSAnLyc7XG4gICAgfVxuICAgIHRoaXMuYXBpVXJsID0gdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyYXRpb25TdG9yYWdlS2V5ID0gJ051Y2xldXNOb3RpZmljYXRpb25zUmVnaXN0cmF0aW9uSWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNTdG9yYWdlS2V5ID0gJ051Y2xldXNOb3RpZmljYXRpb25zTG9jYWxDYWNoZSc7XG4gIHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybVZhbHVlO1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX25ld05vdGlmaWNhdGlvbnMgPSBuZXcgU3ViamVjdDxOb3RpZmljYXRpb24+KCk7XG4gIHByaXZhdGUgX2NsaWNrc1N1YmplY3QgPSBuZXcgU3ViamVjdDxOb3RpZmljYXRpb25DbGljaz4oKTtcbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgcHVibGljIGdldCB1bnJlYWRDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zLmZpbHRlcih4ID0+ICF4LmlzUmVhZCkubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdOb3RpZmljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9uZXdOb3RpZmljYXRpb25zLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjbGlja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWNrc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldCBzdGF0ZUNoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlQ2hhbmdlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBtYWtlIHN1cmUgYXBwIHNlcnZpY2UgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZ1xuICAgIGF3YWl0IHRoaXMuYXBwU2VydmljZS5pbml0KCk7XG5cbiAgICB0aGlzLmxvYWRGcm9tU3RvcmFnZSgpO1xuXG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSkge1xuICAgICAgdGhpcy5fcGxhdGZvcm0gPSB0aGlzLmFwcFNlcnZpY2UuZGV2aWNlSW5mby5wbGF0Zm9ybSBhcyBQbGF0Zm9ybVZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckNhcGFjaXRvckV2ZW50cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zd1B1c2guaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLl9wbGF0Zm9ybSA9ICd3ZWInO1xuICAgICAgdGhpcy5yZWdpc3RlcldlYlB1c2hFdmVudHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFRoZXJlIGlzIG5vIHB1c2ggY2FwYWJpbGl0eSwgdGltZXIgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSBub3RpZmljYXRpb25zJyk7XG4gICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBub3RpZmljYXRpb25zLi4uJyk7XG4gICAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIH0sIDUgKiA2MCAqIDEwMDApO1xuICAgIH1cbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2V0UmVnaXN0cmF0aW9uSW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0cmF0aW9uUmVzdWx0Pih0aGlzLmFwaVVybCArICdyZWdpc3RyYXRpb24nLCBpbmZvKS5zdWJzY3JpYmUoKHJlZ1Jlc3VsdCkgPT4ge1xuICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnJlZ2lzdHJhdGlvblN0b3JhZ2VLZXksIHJlZ1Jlc3VsdC5pZCk7XG4gICAgICAgICAgX3Jlc29sdmUobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBGYWlsZWQgdG8gc2VuZCBub3RpZmljYXRpb24gcmVnaXN0cmF0aW9uIHRvIHNlcnZlci4nLCBlcnJvcik7XG4gICAgICAgICAgX3JlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiBfcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3RlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2V0UmVnaXN0cmF0aW9uSW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3Q8YW55PignREVMRVRFJywgdGhpcy5hcGlVcmwgKyAncmVnaXN0cmF0aW9uJywgeyBib2R5OiBpbmZvIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMucmVnaXN0cmF0aW9uU3RvcmFnZUtleSk7XG4gICAgICAgICAgX3Jlc29sdmUobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBGYWlsZWQgdG8gcmVtb3ZlIHJlZ2lzdHJhdGlvbiBmcm9tIHNlcnZlci4nLCBlcnJvcik7XG4gICAgICAgICAgX3JlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiBfcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaChub3RpZnlBYm91dE5ldyA9IGZhbHNlKSB7XG4gICAgdGhpcy5odHRwLmdldDxOb3RpZmljYXRpb25bXT4odGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucycpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy51cGRhdGVOb3RpZmljYXRpb25zKHJlcywgbm90aWZ5QWJvdXROZXcpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldE5vdGlmaWNhdGlvbihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb24+IHtcbiAgICBjb25zdCBsb2NhbE5vdGlmaWNhdGlvbiA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKHggPT4geC5pZCA9PT0gaWQpO1xuICAgIGlmIChsb2NhbE5vdGlmaWNhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKGxvY2FsTm90aWZpY2F0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Tm90aWZpY2F0aW9uPih0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zLycgKyBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZE5vdGlmaWNhdGlvbihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbiA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKHggPT4geC5pZCA9PT0gaWQpO1xuICAgIGlmIChuICYmICFuLmlzUmVhZCkge1xuICAgICAgbi5pc1JlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zL3JlYWQvJyArIGlkKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNtaXNzTm90aWZpY2F0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRlbGV0ZU5vdGlmaWNhdG9uKGlkKTtcbiAgICB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvJyArIGlkKS5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJlbW92ZURlbGl2ZXJlZE5vdGlmaWNhdGlvbihpZCk7XG4gIH1cblxuICBwdWJsaWMgZGlzbWlzc0FsbCgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKDApO1xuICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5odHRwLmRlbGV0ZSh0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zL2FsbCcpLnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVtb3ZlQWxsRGVsaXZlcmVkTm90aWZpY2F0aW9ucygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICd3ZWInKSB7XG4gICAgICAvLyBUT0RPOiByZW1vdmUgYWxsIHdlYiBwdXNoIG5vdGlmaWNhdGlvbnNcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZEFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdGhpcy5ub3RpZmljYXRpb25zKSB7XG4gICAgICBuLmlzUmVhZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zL3JlYWQvYWxsJykuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2hhbm5lbENvbmZpZyhzZW5kZXJJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVc2VyQ2hhbm5lbENvbmZpZz4odGhpcy5hcGlVcmwgKyBgc2V0dGluZ3MvY2hhbm5lbC8ke3NlbmRlcklkfS8ke2NoYW5uZWxJZH0/bGFuZ3VhZ2U9JHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFubmVsQ29uZmlnc0ZvclNlbmRlcihzZW5kZXJJZDogc3RyaW5nLCBjaGFubmVsSWRzOiBzdHJpbmdbXSwgbGFuZ3VhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZHNTdHIgPSBjaGFubmVsSWRzLm1hcCh4ID0+IHNlbmRlcklkICsgJywnICsgeCkuam9pbignOycpO1xuICAgIHJldHVybiB0aGlzLmdldENoYW5uZWxDb25maWdzSW50ZXJuYWwoaWRzU3RyLCBsYW5ndWFnZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2hhbm5lbENvbmZpZ3MoaWRzOiBDaGFubmVsSWRbXSwgbGFuZ3VhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZHNTdHIgPSBpZHMubWFwKHggPT4geC5zZW5kZXJJZCArICcsJyArIHguY2hhbm5lbElkKS5qb2luKCc7Jyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hhbm5lbENvbmZpZ3NJbnRlcm5hbChpZHNTdHIsIGxhbmd1YWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDaGFubmVsQ29uZmlnKHNlbmRlcklkOiBzdHJpbmcsIGNvbmZpZzogVXNlckNoYW5uZWxDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy5hcGlVcmx9c2V0dGluZ3MvY2hhbm5lbC8ke3NlbmRlcklkfWAsIGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2hhbm5lbENvbmZpZ3MoY29uZmlnczogVXNlckNoYW5uZWxDb25maWdbXSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx2b2lkPihgJHt0aGlzLmFwaVVybH1zZXR0aW5ncy9jaGFubmVsc2AsIGNvbmZpZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkczogc3RyaW5nLCBsYW5ndWFnZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVzZXJDaGFubmVsQ29uZmlnW10+KGAke3RoaXMuYXBpVXJsfXNldHRpbmdzL2NoYW5uZWxzP2lkcz0ke2lkc30mbGFuZ3VhZ2U9JHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTm90aWZpY2F0aW9ucyhuZXdOb3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSwgbm90aWZ5QWJvdXROZXcgPSBmYWxzZSkge1xuICAgIGxldCBzdGF0ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgbmV3Tm90aWZpY2F0aW9ucykge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCh4ID0+IHguaWQgPT09IG4uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGlmIChleGlzdGluZy5pc1JlYWQgIT09IG4uaXNSZWFkKSB7XG4gICAgICAgICAgZXhpc3RpbmcuaXNSZWFkID0gbi5pc1JlYWQ7XG4gICAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggJiYgbi5kYXRlQ3JlYXRlZCA8IHRoaXMubm90aWZpY2F0aW9uc1tpXS5kYXRlQ3JlYXRlZCkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKGksIDAsIG4pO1xuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm90aWZ5QWJvdXROZXcpIHtcbiAgICAgICAgICB0aGlzLl9uZXdOb3RpZmljYXRpb25zLm5leHQobik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm5vdGlmaWNhdGlvbnNbaV07XG4gICAgICBpZiAobmV3IERhdGUobi5leHBpcmF0aW9uRGF0ZSkuZ2V0VGltZSgpIDwgbm93IHx8ICFuZXdOb3RpZmljYXRpb25zLmZpbmQoeCA9PiB4LmlkID09PSBuLmlkKSkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlVG9TdG9yYWdlKCkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMubm90aWZpY2F0aW9ucyk7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubm90aWZpY2F0aW9uc1N0b3JhZ2VLZXksIHN0cik7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGcm9tU3RvcmFnZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubm90aWZpY2F0aW9uc1N0b3JhZ2VLZXkpO1xuICAgICAgaWYgKHN0cikge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25zID0gSlNPTi5wYXJzZShzdHIpIGFzIE5vdGlmaWNhdGlvbltdO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBub3RpZmljYXRpb25zLmZpbHRlcih4ID0+ICEheCk7XG4gICAgICAgIC8vIHByZWNhdXRpb24gZm9yIG5vdGlmaWNhdGlvbi5pc1JlYWQgb2YgdW5kZWZpbmVkIGVycm9yXG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogZW1wdHkgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RpZmljYXRpb25FdmVudChpZDogc3RyaW5nLCBldmVudFR5cGU6IE5vdGlmaWNhdGlvbkV2ZW50VHlwZSkge1xuICAgIGlmIChldmVudFR5cGUuc3RhcnRzV2l0aCgnbmV3JykgfHwgZXZlbnRUeXBlID09PSAndXBkYXRlZCcpIHsgLy8gd2UgYXJlIGhhbmRsaW5nIG5ldyBhbmQgbmV3U2lsZW50XG4gICAgICB0aGlzLmdldE5vdGlmaWNhdGlvbihpZCkuc3Vic2NyaWJlKG4gPT4ge1xuICAgICAgICBpZiAoZXZlbnRUeXBlLnN0YXJ0c1dpdGgoJ25ldycpICYmICFuLmlzUmVhZCkge1xuICAgICAgICAgIHRoaXMuX25ld05vdGlmaWNhdGlvbnMubmV4dChuKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKHggPT4geC5pZCA9PT0gbi5pZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIGV4aXN0aW5nLmlzUmVhZCA9IG4uaXNSZWFkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoMCwgMCwgbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZGVsZXRlZCcpIHtcbiAgICAgIHRoaXMuZGVsZXRlTm90aWZpY2F0b24oaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZU5vdGlmaWNhdG9uKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmRJbmRleCh4ID0+IHguaWQgPT09IGlkKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVN0YXRlQ2hhbmdlZChwZXJzaXN0U3RhdGUgPSB0cnVlKSB7XG4gICAgaWYgKHBlcnNpc3RTdGF0ZSkge1xuICAgICAgdGhpcy5zYXZlVG9TdG9yYWdlKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlc1N1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RpZmljYXRpb25BY3Rpb24obm90aWZpY2F0aW9uQWN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIW5vdGlmaWNhdGlvbkFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gYWN0aW9uIGlzIGVtcHR5IScpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IG5vdGlmaWNhdGlvbkFjdGlvbi5zcGxpdCgnOicpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbkNsaWNrOiBOb3RpZmljYXRpb25DbGljayA9IHtcbiAgICAgIGlkOiBhcnJbMF0sXG4gICAgICB0eXBlOiBhcnJbMV0gYXMgTm90aWZpY2F0aW9uVHlwZSxcbiAgICAgIHJvdXRlckxpbms6IGFyclsyXVxuICAgIH07XG5cbiAgICBjb25zdCB2YWxpZE5vdGlmaWNhdGlvbkNsaWNrVHlwZXMgPSBbJ2RlZmF1bHQnLCAnZGVlcGxpbmsnXTtcbiAgICBpZiAodmFsaWROb3RpZmljYXRpb25DbGlja1R5cGVzLmluY2x1ZGVzKG5vdGlmaWNhdGlvbkNsaWNrLnR5cGUpKSB7XG4gICAgICB0aGlzLl9jbGlja3NTdWJqZWN0Lm5leHQobm90aWZpY2F0aW9uQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFVua25vd24gbm90aWZpY2F0aW9uIGFjdGlvbjogJyR7bm90aWZpY2F0aW9uQWN0aW9ufScuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEZWxpdmVyZWROb3RpZmljYXRpb24oaWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgUHVzaE5vdGlmaWNhdGlvbnMuZ2V0RGVsaXZlcmVkTm90aWZpY2F0aW9ucygpLnRoZW4obGlzdCA9PiB7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gbGlzdC5ub3RpZmljYXRpb25zLmZpbHRlcihuID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXROb3RpZmljYXRpb25QYXlsb2FkRGF0YShuKTtcbiAgICAgICAgICByZXR1cm4gKGRhdGEubm90aWZpY2F0aW9uSWQgPT09IGlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVE9ETzogT24gQW5kcm9pZCB0aGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGJlY2F1c2Ugbm90aWZpY2F0aW9uSUQgaXMgbm90IHNldC5cbiAgICAgICAgLy8gVGhpcyBteSBzb2x2ZSB0aGUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2NhcGFjaXRvci9wdWxsLzM1MjNcbiAgICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9ucyh7XG4gICAgICAgICAgbm90aWZpY2F0aW9uczogdG9SZW1vdmVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnd2ViJykge1xuICAgICAgLy8gVE9ETzogcmVtb3ZlIHdlYiBwdXNoIG5vdGlmaWNhdGlvblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Tm90aWZpY2F0aW9uUGF5bG9hZERhdGEocHVzaE5vdGlmaWNhdGlvbjogUHVzaE5vdGlmaWNhdGlvblNjaGVtYSk6IFBheWxvYWREYXRhIHtcbiAgICByZXR1cm4gKHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJykgPyBwdXNoTm90aWZpY2F0aW9uLmRhdGEuZGF0YSA6IHB1c2hOb3RpZmljYXRpb24uZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJDYXBhY2l0b3JFdmVudHMoKSB7XG4gICAgYXdhaXQgUHVzaE5vdGlmaWNhdGlvbnMuYWRkTGlzdGVuZXIoJ3B1c2hOb3RpZmljYXRpb25SZWNlaXZlZCcsIG4gPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0Tm90aWZpY2F0aW9uUGF5bG9hZERhdGEobik7XG4gICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBSZWNlaXZlZCBjYXBhY2l0b3IgcHVzaCBldmVudDogJyArIGRhdGEuZXZlbnRUeXBlLCBuKTtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZGF0YS5ub3RpZmljYXRpb25JZCwgZGF0YS5ldmVudFR5cGUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHVzaE5vdGlmaWNhdGlvbnMuYWRkTGlzdGVuZXIoJ3B1c2hOb3RpZmljYXRpb25BY3Rpb25QZXJmb3JtZWQnLCBhID0+IHtcbiAgICAgIGxldCBhY3Rpb24gPSAoYSBhcyBhbnkpLm5vdGlmaWNhdGlvbi5kYXRhLm5vdGlmaWNhdGlvbkFjdGlvbjtcbiAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgYWN0aW9uID0gKGEgYXMgYW55KS5ub3RpZmljYXRpb24uZGF0YS5kYXRhLm5vdGlmaWNhdGlvbkFjdGlvbjtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIGNhcGFjaXRvciBhY3Rpb24gZXZlbnQnLCBhY3Rpb24pO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25BY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJXZWJQdXNoRXZlbnRzKCkge1xuICAgIHRoaXMuc3dQdXNoLm1lc3NhZ2VzLnN1YnNjcmliZSgobikgPT4ge1xuICAgICAgY29uc3QgZGF0YTogUGF5bG9hZERhdGEgPSAobiBhcyBhbnkpLmRhdGE7XG4gICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBSZWNlaXZlZCBXZWJQdXNoIGV2ZW50OiAnICsgZGF0YS5ldmVudFR5cGUsIG4pO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25FdmVudChkYXRhLm5vdGlmaWNhdGlvbklkLCBkYXRhLmV2ZW50VHlwZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN3UHVzaC5ub3RpZmljYXRpb25DbGlja3Muc3Vic2NyaWJlKChhY3Rpb24pID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIFdlYlB1c2ggYWN0aW9uIGV2ZW50JywgYWN0aW9uKTtcbiAgICAgIGNvbnN0IHRhZyA9IGFjdGlvbi5ub3RpZmljYXRpb24udGFnO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb25BY3Rpb24odGFnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVnaXN0cmF0aW9uSW5mbygpOiBQcm9taXNlPFJlZ2lzdHJhdGlvbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbklkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMucmVnaXN0cmF0aW9uU3RvcmFnZUtleSkgYXMgc3RyaW5nO1xuICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnYW5kcm9pZCcgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnKSB7XG4gICAgICAgIC8vIGNhcGFjaXRvciBwbGF0Zm9ybVxuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IFB1c2hOb3RpZmljYXRpb25zLmFkZExpc3RlbmVyKCdyZWdpc3RyYXRpb24nLCB0b2tlbiA9PiB7XG4gICAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgICAgX3Jlc29sdmUoeyBpZDogcmVnaXN0cmF0aW9uSWQsIHRva2VuOiB0b2tlbi52YWx1ZSwgcGxhdGZvcm06IHRoaXMuX3BsYXRmb3JtIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVnaXN0ZXIoKS5jYXRjaChlcnJvciA9PiBfcmVqZWN0KCdDb3VsZCBub3QgcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnM6JyArIGVycm9yKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnd2ViJykge1xuICAgICAgICAvLyBXZWIgUHVzaCBBUElcbiAgICAgICAgdGhpcy5odHRwLmdldDxXZWJLZXk+KHRoaXMuYXBpVXJsICsgJ3JlZ2lzdHJhdGlvbi93ZWJrZXknKS5zdWJzY3JpYmUoa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLmdldFdlYlB1c2hTdWJzY3JpcHRpb24oa2V5LnB1YmxpY0tleSkudGhlbihzdWJzY3JpcHRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgdCA9IEpTT04uc3RyaW5naWZ5KHN1YnNjcmlwdGlvbi50b0pTT04oKSk7XG4gICAgICAgICAgICBfcmVzb2x2ZSh7IGlkOiByZWdpc3RyYXRpb25JZCwgdG9rZW46IHQsIHBsYXRmb3JtOiAnd2ViJyB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyb3IgPT4gX3JlamVjdChlcnJvcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3JlamVjdChgTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBQbGF0Zm9ybSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFdlYlB1c2hTdWJzY3JpcHRpb24ocHVibGljS2V5OiBzdHJpbmcpOiBQcm9taXNlPFB1c2hTdWJzY3JpcHRpb24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnN3UHVzaC5zdWJzY3JpcHRpb24uc3Vic2NyaWJlKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIF9yZXNvbHZlKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zd1B1c2gucmVxdWVzdFN1YnNjcmlwdGlvbih7IHNlcnZlclB1YmxpY0tleTogcHVibGljS2V5IH0pLnRoZW4ocyA9PiBfcmVzb2x2ZShzKSkuY2F0Y2goZSA9PiBfcmVqZWN0KGUpKTtcbiAgICAgICAgfVxuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IENhbm5vdCBnZXQgd2ViIHB1c2ggc3Vic2NyaXB0aW9uJywgZXJyb3IpO1xuICAgICAgICBfcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25nL251Y2xldXMvbnVjbGV1cy1ub3RpZmljYXRpb25zL3NyYy9saWIvbnVjbGV1cy1ub3RpZmljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsaUJBQWlCLEdBRWxCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQU1MLDBCQUEwQixHQU8zQixNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBS2xCLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsWUFDVSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsVUFBNkIsRUFDckMsTUFBa0M7UUFIMUIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFXdEIsMkJBQXNCLEdBQ3JDLG9DQUFvQyxDQUFDO1FBQ3RCLDRCQUF1QixHQUFHLGdDQUFnQyxDQUFDO1FBRXBFLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQ2hELG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7UUFDbEQseUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUU1Qyxr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OzRGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3dQdXNoIH0gZnJvbSAnQGFuZ3VsYXIvc2VydmljZS13b3JrZXInO1xuaW1wb3J0IHtcbiAgUHVzaE5vdGlmaWNhdGlvbnMsXG4gIFB1c2hOb3RpZmljYXRpb25TY2hlbWEsXG59IGZyb20gJ0BjYXBhY2l0b3IvcHVzaC1ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IE51Y2xldXNBcHBTZXJ2aWNlIH0gZnJvbSAnQGtvbGVrdG9yL251Y2xldXMtY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDaGFubmVsSWQsXG4gIE5vdGlmaWNhdGlvbixcbiAgTm90aWZpY2F0aW9uQ2xpY2ssXG4gIE5vdGlmaWNhdGlvbkV2ZW50VHlwZSxcbiAgTm90aWZpY2F0aW9uVHlwZSxcbiAgTnVjbGV1c05vdGlmaWNhdGlvbnNDb25maWcsXG4gIFBheWxvYWREYXRhLFxuICBQbGF0Zm9ybVZhbHVlLFxuICBSZWdpc3RyYXRpb24sXG4gIFJlZ2lzdHJhdGlvblJlc3VsdCxcbiAgVXNlckNoYW5uZWxDb25maWcsXG4gIFdlYktleSxcbn0gZnJvbSAnLi9tb2RlbHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTnVjbGV1c05vdGlmaWNhdGlvbnNTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgc3dQdXNoOiBTd1B1c2gsXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBOdWNsZXVzQXBwU2VydmljZSxcbiAgICBjb25maWc6IE51Y2xldXNOb3RpZmljYXRpb25zQ29uZmlnXG4gICkge1xuICAgIGxldCB1cmwgPSBjb25maWcuc2VydmVyQXBpVXJsO1xuICAgIGlmICghdXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHVybCArPSAnLyc7XG4gICAgfVxuICAgIHRoaXMuYXBpVXJsID0gdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyYXRpb25TdG9yYWdlS2V5ID1cbiAgICAnTnVjbGV1c05vdGlmaWNhdGlvbnNSZWdpc3RyYXRpb25JZCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uc1N0b3JhZ2VLZXkgPSAnTnVjbGV1c05vdGlmaWNhdGlvbnNMb2NhbENhY2hlJztcbiAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtVmFsdWU7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbmV3Tm90aWZpY2F0aW9ucyA9IG5ldyBTdWJqZWN0PE5vdGlmaWNhdGlvbj4oKTtcbiAgcHJpdmF0ZSBfY2xpY2tzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE5vdGlmaWNhdGlvbkNsaWNrPigpO1xuICBwcml2YXRlIF9zdGF0ZUNoYW5nZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwdWJsaWMgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10gPSBbXTtcblxuICBwdWJsaWMgZ2V0IHVucmVhZENvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnMuZmlsdGVyKCh4KSA9PiAheC5pc1JlYWQpLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3Tm90aWZpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fbmV3Tm90aWZpY2F0aW9ucy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2xpY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9jbGlja3NTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RhdGVDaGFuZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZUNoYW5nZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0luaXRpYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgLy8gbWFrZSBzdXJlIGFwcCBzZXJ2aWNlIGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmdcbiAgICBhd2FpdCB0aGlzLmFwcFNlcnZpY2UuaW5pdCgpO1xuXG4gICAgdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKTtcblxuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUpIHtcbiAgICAgIHRoaXMuX3BsYXRmb3JtID0gdGhpcy5hcHBTZXJ2aWNlLmRldmljZUluZm8ucGxhdGZvcm0gYXMgUGxhdGZvcm1WYWx1ZTtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJDYXBhY2l0b3JFdmVudHMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3dQdXNoLmlzRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcGxhdGZvcm0gPSAnd2ViJztcbiAgICAgIHRoaXMucmVnaXN0ZXJXZWJQdXNoRXZlbnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ051Y2xldXMuTm90aWZpY2F0aW9uczogVGhlcmUgaXMgbm8gcHVzaCBjYXBhYmlsaXR5LCB0aW1lciB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIG5vdGlmaWNhdGlvbnMnXG4gICAgICApO1xuICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRpbmcgbm90aWZpY2F0aW9ucy4uLicpO1xuICAgICAgICB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgICB9LCA1ICogNjAgKiAxMDAwKTtcbiAgICB9XG4gICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldFJlZ2lzdHJhdGlvbkluZm8oKVxuICAgICAgICAudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnBvc3Q8UmVnaXN0cmF0aW9uUmVzdWx0Pih0aGlzLmFwaVVybCArICdyZWdpc3RyYXRpb24nLCBpbmZvKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgKHJlZ1Jlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cmF0aW9uU3RvcmFnZUtleSxcbiAgICAgICAgICAgICAgICAgIHJlZ1Jlc3VsdC5pZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgX3Jlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgJ051Y2xldXMuTm90aWZpY2F0aW9uczogRmFpbGVkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiB0byBzZXJ2ZXIuJyxcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBfcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gX3JlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldFJlZ2lzdHJhdGlvbkluZm8oKVxuICAgICAgICAudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnJlcXVlc3Q8YW55PignREVMRVRFJywgdGhpcy5hcGlVcmwgKyAncmVnaXN0cmF0aW9uJywge1xuICAgICAgICAgICAgICBib2R5OiBpbmZvLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5yZWdpc3RyYXRpb25TdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICBfcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBGYWlsZWQgdG8gcmVtb3ZlIHJlZ2lzdHJhdGlvbiBmcm9tIHNlcnZlci4nLFxuICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIF9yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBfcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaChub3RpZnlBYm91dE5ldyA9IGZhbHNlKSB7XG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0PE5vdGlmaWNhdGlvbltdPih0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zJylcbiAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZU5vdGlmaWNhdGlvbnMocmVzLCBub3RpZnlBYm91dE5ldyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROb3RpZmljYXRpb24oaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uPiB7XG4gICAgY29uc3QgbG9jYWxOb3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCgoeCkgPT4geC5pZCA9PT0gaWQpO1xuICAgIGlmIChsb2NhbE5vdGlmaWNhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKGxvY2FsTm90aWZpY2F0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Tm90aWZpY2F0aW9uPih0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zLycgKyBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZE5vdGlmaWNhdGlvbihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbiA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKCh4KSA9PiB4LmlkID09PSBpZCk7XG4gICAgaWYgKG4gJiYgIW4uaXNSZWFkKSB7XG4gICAgICBuLmlzUmVhZCA9IHRydWU7XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvcmVhZC8nICsgaWQpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGRpc21pc3NOb3RpZmljYXRpb24oaWQ6IHN0cmluZykge1xuICAgIHRoaXMuZGVsZXRlTm90aWZpY2F0b24oaWQpO1xuICAgIHRoaXMuaHR0cC5kZWxldGUodGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy8nICsgaWQpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMucmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9uKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNtaXNzQWxsKCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoMCk7XG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvYWxsJykuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJyB8fCB0aGlzLl9wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgICBQdXNoTm90aWZpY2F0aW9ucy5yZW1vdmVBbGxEZWxpdmVyZWROb3RpZmljYXRpb25zKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ3dlYicpIHtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBhbGwgd2ViIHB1c2ggbm90aWZpY2F0aW9uc1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWFkQWxsKCkge1xuICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIG4uaXNSZWFkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXBpVXJsICsgJ25vdGlmaWNhdGlvbnMvcmVhZC9hbGwnKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFubmVsQ29uZmlnKFxuICAgIHNlbmRlcklkOiBzdHJpbmcsXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VXNlckNoYW5uZWxDb25maWc+KFxuICAgICAgdGhpcy5hcGlVcmwgK1xuICAgICAgICBgc2V0dGluZ3MvY2hhbm5lbC8ke3NlbmRlcklkfS8ke2NoYW5uZWxJZH0/bGFuZ3VhZ2U9JHtsYW5ndWFnZX1gXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFubmVsQ29uZmlnc0ZvclNlbmRlcihcbiAgICBzZW5kZXJJZDogc3RyaW5nLFxuICAgIGNoYW5uZWxJZHM6IHN0cmluZ1tdLFxuICAgIGxhbmd1YWdlPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGlkc1N0ciA9IGNoYW5uZWxJZHMubWFwKCh4KSA9PiBzZW5kZXJJZCArICcsJyArIHgpLmpvaW4oJzsnKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkc1N0ciwgbGFuZ3VhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldENoYW5uZWxDb25maWdzKGlkczogQ2hhbm5lbElkW10sIGxhbmd1YWdlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgaWRzU3RyID0gaWRzLm1hcCgoeCkgPT4geC5zZW5kZXJJZCArICcsJyArIHguY2hhbm5lbElkKS5qb2luKCc7Jyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hhbm5lbENvbmZpZ3NJbnRlcm5hbChpZHNTdHIsIGxhbmd1YWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDaGFubmVsQ29uZmlnKHNlbmRlcklkOiBzdHJpbmcsIGNvbmZpZzogVXNlckNoYW5uZWxDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oXG4gICAgICBgJHt0aGlzLmFwaVVybH1zZXR0aW5ncy9jaGFubmVsLyR7c2VuZGVySWR9YCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2hhbm5lbENvbmZpZ3MoY29uZmlnczogVXNlckNoYW5uZWxDb25maWdbXSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx2b2lkPihgJHt0aGlzLmFwaVVybH1zZXR0aW5ncy9jaGFubmVsc2AsIGNvbmZpZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDaGFubmVsQ29uZmlnc0ludGVybmFsKGlkczogc3RyaW5nLCBsYW5ndWFnZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVzZXJDaGFubmVsQ29uZmlnW10+KFxuICAgICAgYCR7dGhpcy5hcGlVcmx9c2V0dGluZ3MvY2hhbm5lbHM/aWRzPSR7aWRzfSZsYW5ndWFnZT0ke2xhbmd1YWdlfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb3RpZmljYXRpb25zKFxuICAgIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdLFxuICAgIG5vdGlmeUFib3V0TmV3ID0gZmFsc2VcbiAgKSB7XG4gICAgbGV0IHN0YXRlQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbiBvZiBuZXdOb3RpZmljYXRpb25zKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKCh4KSA9PiB4LmlkID09PSBuLmlkKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBpZiAoZXhpc3RpbmcuaXNSZWFkICE9PSBuLmlzUmVhZCkge1xuICAgICAgICAgIGV4aXN0aW5nLmlzUmVhZCA9IG4uaXNSZWFkO1xuICAgICAgICAgIHN0YXRlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIGkgPCB0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoICYmXG4gICAgICAgICAgbi5kYXRlQ3JlYXRlZCA8IHRoaXMubm90aWZpY2F0aW9uc1tpXS5kYXRlQ3JlYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpLCAwLCBuKTtcbiAgICAgICAgc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vdGlmeUFib3V0TmV3KSB7XG4gICAgICAgICAgdGhpcy5fbmV3Tm90aWZpY2F0aW9ucy5uZXh0KG4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5ub3RpZmljYXRpb25zW2ldO1xuICAgICAgaWYgKFxuICAgICAgICBuZXcgRGF0ZShuLmV4cGlyYXRpb25EYXRlKS5nZXRUaW1lKCkgPCBub3cgfHxcbiAgICAgICAgIW5ld05vdGlmaWNhdGlvbnMuZmluZCgoeCkgPT4geC5pZCA9PT0gbi5pZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlVG9TdG9yYWdlKCkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMubm90aWZpY2F0aW9ucyk7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubm90aWZpY2F0aW9uc1N0b3JhZ2VLZXksIHN0cik7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGcm9tU3RvcmFnZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubm90aWZpY2F0aW9uc1N0b3JhZ2VLZXkpO1xuICAgICAgaWYgKHN0cikge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25zID0gSlNPTi5wYXJzZShzdHIpIGFzIE5vdGlmaWNhdGlvbltdO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBub3RpZmljYXRpb25zLmZpbHRlcigoeCkgPT4gISF4KTtcbiAgICAgICAgLy8gcHJlY2F1dGlvbiBmb3Igbm90aWZpY2F0aW9uLmlzUmVhZCBvZiB1bmRlZmluZWQgZXJyb3JcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogZW1wdHkgKi9cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZXZlbnRUeXBlOiBOb3RpZmljYXRpb25FdmVudFR5cGVcbiAgKSB7XG4gICAgaWYgKGV2ZW50VHlwZS5zdGFydHNXaXRoKCduZXcnKSB8fCBldmVudFR5cGUgPT09ICd1cGRhdGVkJykge1xuICAgICAgLy8gd2UgYXJlIGhhbmRsaW5nIG5ldyBhbmQgbmV3U2lsZW50XG4gICAgICB0aGlzLmdldE5vdGlmaWNhdGlvbihpZCkuc3Vic2NyaWJlKChuKSA9PiB7XG4gICAgICAgIGlmIChldmVudFR5cGUuc3RhcnRzV2l0aCgnbmV3JykgJiYgIW4uaXNSZWFkKSB7XG4gICAgICAgICAgdGhpcy5fbmV3Tm90aWZpY2F0aW9ucy5uZXh0KG4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmQoKHgpID0+IHguaWQgPT09IG4uaWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5pc1JlYWQgPSBuLmlzUmVhZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKDAsIDAsIG4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICB0aGlzLmRlbGV0ZU5vdGlmaWNhdG9uKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVOb3RpZmljYXRvbihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaSA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kSW5kZXgoKHgpID0+IHguaWQgPT09IGlkKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVN0YXRlQ2hhbmdlZChwZXJzaXN0U3RhdGUgPSB0cnVlKSB7XG4gICAgaWYgKHBlcnNpc3RTdGF0ZSkge1xuICAgICAgdGhpcy5zYXZlVG9TdG9yYWdlKCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlc1N1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RpZmljYXRpb25BY3Rpb24obm90aWZpY2F0aW9uQWN0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIW5vdGlmaWNhdGlvbkFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gYWN0aW9uIGlzIGVtcHR5IScpO1xuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IG5vdGlmaWNhdGlvbkFjdGlvbi5zcGxpdCgnOicpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbkNsaWNrOiBOb3RpZmljYXRpb25DbGljayA9IHtcbiAgICAgIGlkOiBhcnJbMF0sXG4gICAgICB0eXBlOiBhcnJbMV0gYXMgTm90aWZpY2F0aW9uVHlwZSxcbiAgICAgIHJvdXRlckxpbms6IGFyclsyXSxcbiAgICB9O1xuXG4gICAgY29uc3QgdmFsaWROb3RpZmljYXRpb25DbGlja1R5cGVzID0gWydkZWZhdWx0JywgJ2RlZXBsaW5rJ107XG4gICAgaWYgKHZhbGlkTm90aWZpY2F0aW9uQ2xpY2tUeXBlcy5pbmNsdWRlcyhub3RpZmljYXRpb25DbGljay50eXBlKSkge1xuICAgICAgdGhpcy5fY2xpY2tzU3ViamVjdC5uZXh0KG5vdGlmaWNhdGlvbkNsaWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYE51Y2xldXMuTm90aWZpY2F0aW9uczogVW5rbm93biBub3RpZmljYXRpb24gYWN0aW9uOiAnJHtub3RpZmljYXRpb25BY3Rpb259Jy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnIHx8IHRoaXMuX3BsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIFB1c2hOb3RpZmljYXRpb25zLmdldERlbGl2ZXJlZE5vdGlmaWNhdGlvbnMoKS50aGVuKChsaXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gbGlzdC5ub3RpZmljYXRpb25zLmZpbHRlcigobikgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldE5vdGlmaWNhdGlvblBheWxvYWREYXRhKG4pO1xuICAgICAgICAgIHJldHVybiBkYXRhLm5vdGlmaWNhdGlvbklkID09PSBpZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVE9ETzogT24gQW5kcm9pZCB0aGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGJlY2F1c2Ugbm90aWZpY2F0aW9uSUQgaXMgbm90IHNldC5cbiAgICAgICAgLy8gVGhpcyBteSBzb2x2ZSB0aGUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2NhcGFjaXRvci9wdWxsLzM1MjNcbiAgICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9ucyh7XG4gICAgICAgICAgbm90aWZpY2F0aW9uczogdG9SZW1vdmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ3dlYicpIHtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSB3ZWIgcHVzaCBub3RpZmljYXRpb25cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5vdGlmaWNhdGlvblBheWxvYWREYXRhKFxuICAgIHB1c2hOb3RpZmljYXRpb246IFB1c2hOb3RpZmljYXRpb25TY2hlbWFcbiAgKTogUGF5bG9hZERhdGEge1xuICAgIHJldHVybiB0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcydcbiAgICAgID8gcHVzaE5vdGlmaWNhdGlvbi5kYXRhLmRhdGFcbiAgICAgIDogcHVzaE5vdGlmaWNhdGlvbi5kYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckNhcGFjaXRvckV2ZW50cygpIHtcbiAgICBhd2FpdCBQdXNoTm90aWZpY2F0aW9ucy5hZGRMaXN0ZW5lcigncHVzaE5vdGlmaWNhdGlvblJlY2VpdmVkJywgKG4pID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldE5vdGlmaWNhdGlvblBheWxvYWREYXRhKG4pO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIGNhcGFjaXRvciBwdXNoIGV2ZW50OiAnICtcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgblxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZGF0YS5ub3RpZmljYXRpb25JZCwgZGF0YS5ldmVudFR5cGUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHVzaE5vdGlmaWNhdGlvbnMuYWRkTGlzdGVuZXIoXG4gICAgICAncHVzaE5vdGlmaWNhdGlvbkFjdGlvblBlcmZvcm1lZCcsXG4gICAgICAoYSkgPT4ge1xuICAgICAgICBsZXQgYWN0aW9uID0gKGEgYXMgYW55KS5ub3RpZmljYXRpb24uZGF0YS5ub3RpZmljYXRpb25BY3Rpb247XG4gICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcbiAgICAgICAgICBhY3Rpb24gPSAoYSBhcyBhbnkpLm5vdGlmaWNhdGlvbi5kYXRhLmRhdGEubm90aWZpY2F0aW9uQWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIGNhcGFjaXRvciBhY3Rpb24gZXZlbnQnLFxuICAgICAgICAgIGFjdGlvblxuICAgICAgICApO1xuICAgICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbkFjdGlvbihhY3Rpb24pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyV2ViUHVzaEV2ZW50cygpIHtcbiAgICB0aGlzLnN3UHVzaC5tZXNzYWdlcy5zdWJzY3JpYmUoKG4pID0+IHtcbiAgICAgIGNvbnN0IGRhdGE6IFBheWxvYWREYXRhID0gKG4gYXMgYW55KS5kYXRhO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIFdlYlB1c2ggZXZlbnQ6ICcgKyBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgblxuICAgICAgKTtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZGF0YS5ub3RpZmljYXRpb25JZCwgZGF0YS5ldmVudFR5cGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zd1B1c2gubm90aWZpY2F0aW9uQ2xpY2tzLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ051Y2xldXMuTm90aWZpY2F0aW9uczogUmVjZWl2ZWQgV2ViUHVzaCBhY3Rpb24gZXZlbnQnLFxuICAgICAgICBhY3Rpb25cbiAgICAgICk7XG4gICAgICBjb25zdCB0YWcgPSBhY3Rpb24ubm90aWZpY2F0aW9uLnRhZztcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uQWN0aW9uKHRhZyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZ2lzdHJhdGlvbkluZm8oKTogUHJvbWlzZTxSZWdpc3RyYXRpb24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RyYXRpb25JZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgdGhpcy5yZWdpc3RyYXRpb25TdG9yYWdlS2V5XG4gICAgICApIGFzIHN0cmluZztcbiAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnIHx8IHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJykge1xuICAgICAgICAvLyBjYXBhY2l0b3IgcGxhdGZvcm1cbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBQdXNoTm90aWZpY2F0aW9ucy5hZGRMaXN0ZW5lcihcbiAgICAgICAgICAncmVnaXN0cmF0aW9uJyxcbiAgICAgICAgICAodG9rZW4pID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgX3Jlc29sdmUoe1xuICAgICAgICAgICAgICBpZDogcmVnaXN0cmF0aW9uSWQsXG4gICAgICAgICAgICAgIHRva2VuOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IHRoaXMuX3BsYXRmb3JtLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBQdXNoTm90aWZpY2F0aW9ucy5yZWdpc3RlcigpLmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgICBfcmVqZWN0KCdDb3VsZCBub3QgcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnM6JyArIGVycm9yKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ3dlYicpIHtcbiAgICAgICAgLy8gV2ViIFB1c2ggQVBJXG4gICAgICAgIHRoaXMuaHR0cC5nZXQ8V2ViS2V5Pih0aGlzLmFwaVVybCArICdyZWdpc3RyYXRpb24vd2Via2V5Jykuc3Vic2NyaWJlKFxuICAgICAgICAgIChrZXkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0V2ViUHVzaFN1YnNjcmlwdGlvbihrZXkucHVibGljS2V5KS50aGVuKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IEpTT04uc3RyaW5naWZ5KHN1YnNjcmlwdGlvbi50b0pTT04oKSk7XG4gICAgICAgICAgICAgIF9yZXNvbHZlKHsgaWQ6IHJlZ2lzdHJhdGlvbklkLCB0b2tlbjogdCwgcGxhdGZvcm06ICd3ZWInIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IF9yZWplY3QoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcmVqZWN0KGBOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFBsYXRmb3JtIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2ViUHVzaFN1YnNjcmlwdGlvbihwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8UHVzaFN1YnNjcmlwdGlvbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc3dQdXNoLnN1YnNjcmlwdGlvbi5zdWJzY3JpYmUoXG4gICAgICAgIChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIF9yZXNvbHZlKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3dQdXNoXG4gICAgICAgICAgICAgIC5yZXF1ZXN0U3Vic2NyaXB0aW9uKHsgc2VydmVyUHVibGljS2V5OiBwdWJsaWNLZXkgfSlcbiAgICAgICAgICAgICAgLnRoZW4oKHMpID0+IF9yZXNvbHZlKHMpKVxuICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IF9yZWplY3QoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IENhbm5vdCBnZXQgd2ViIHB1c2ggc3Vic2NyaXB0aW9uJyxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBfcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -49,7 +49,7 @@ class NucleusNotificationsService {
|
|
|
49
49
|
this.apiUrl = url;
|
|
50
50
|
}
|
|
51
51
|
get unreadCount() {
|
|
52
|
-
return this.notifications.filter(x => !x.isRead).length;
|
|
52
|
+
return this.notifications.filter((x) => !x.isRead).length;
|
|
53
53
|
}
|
|
54
54
|
get newNotifications() {
|
|
55
55
|
return this._newNotifications.asObservable();
|
|
@@ -87,44 +87,56 @@ class NucleusNotificationsService {
|
|
|
87
87
|
}
|
|
88
88
|
register() {
|
|
89
89
|
return new Promise((_resolve, _reject) => {
|
|
90
|
-
this.getRegistrationInfo()
|
|
91
|
-
|
|
90
|
+
this.getRegistrationInfo()
|
|
91
|
+
.then((info) => {
|
|
92
|
+
this.http
|
|
93
|
+
.post(this.apiUrl + 'registration', info)
|
|
94
|
+
.subscribe((regResult) => {
|
|
92
95
|
window.localStorage.setItem(this.registrationStorageKey, regResult.id);
|
|
93
96
|
_resolve(null);
|
|
94
|
-
}, error => {
|
|
97
|
+
}, (error) => {
|
|
95
98
|
console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);
|
|
96
99
|
_reject(error);
|
|
97
100
|
});
|
|
98
|
-
})
|
|
101
|
+
})
|
|
102
|
+
.catch((error) => _reject(error));
|
|
99
103
|
});
|
|
100
104
|
}
|
|
101
105
|
unregister() {
|
|
102
106
|
return new Promise((_resolve, _reject) => {
|
|
103
|
-
this.getRegistrationInfo()
|
|
104
|
-
|
|
107
|
+
this.getRegistrationInfo()
|
|
108
|
+
.then((info) => {
|
|
109
|
+
this.http
|
|
110
|
+
.request('DELETE', this.apiUrl + 'registration', {
|
|
111
|
+
body: info,
|
|
112
|
+
})
|
|
113
|
+
.subscribe(() => {
|
|
105
114
|
window.localStorage.removeItem(this.registrationStorageKey);
|
|
106
115
|
_resolve(null);
|
|
107
|
-
}, error => {
|
|
116
|
+
}, (error) => {
|
|
108
117
|
console.log('Nucleus.Notifications: Failed to remove registration from server.', error);
|
|
109
118
|
_reject(error);
|
|
110
119
|
});
|
|
111
|
-
})
|
|
120
|
+
})
|
|
121
|
+
.catch((error) => _reject(error));
|
|
112
122
|
});
|
|
113
123
|
}
|
|
114
124
|
refresh(notifyAboutNew = false) {
|
|
115
|
-
this.http
|
|
125
|
+
this.http
|
|
126
|
+
.get(this.apiUrl + 'notifications')
|
|
127
|
+
.subscribe((res) => {
|
|
116
128
|
this.updateNotifications(res, notifyAboutNew);
|
|
117
129
|
});
|
|
118
130
|
}
|
|
119
131
|
getNotification(id) {
|
|
120
|
-
const localNotification = this.notifications.find(x => x.id === id);
|
|
132
|
+
const localNotification = this.notifications.find((x) => x.id === id);
|
|
121
133
|
if (localNotification) {
|
|
122
134
|
return of(localNotification);
|
|
123
135
|
}
|
|
124
136
|
return this.http.get(this.apiUrl + 'notifications/' + id);
|
|
125
137
|
}
|
|
126
138
|
readNotification(id) {
|
|
127
|
-
const n = this.notifications.find(x => x.id === id);
|
|
139
|
+
const n = this.notifications.find((x) => x.id === id);
|
|
128
140
|
if (n && !n.isRead) {
|
|
129
141
|
n.isRead = true;
|
|
130
142
|
this.notifyStateChanged();
|
|
@@ -155,14 +167,15 @@ class NucleusNotificationsService {
|
|
|
155
167
|
this.http.get(this.apiUrl + 'notifications/read/all').subscribe();
|
|
156
168
|
}
|
|
157
169
|
getChannelConfig(senderId, channelId, language) {
|
|
158
|
-
return this.http.get(this.apiUrl +
|
|
170
|
+
return this.http.get(this.apiUrl +
|
|
171
|
+
`settings/channel/${senderId}/${channelId}?language=${language}`);
|
|
159
172
|
}
|
|
160
173
|
getChannelConfigsForSender(senderId, channelIds, language) {
|
|
161
|
-
const idsStr = channelIds.map(x => senderId + ',' + x).join(';');
|
|
174
|
+
const idsStr = channelIds.map((x) => senderId + ',' + x).join(';');
|
|
162
175
|
return this.getChannelConfigsInternal(idsStr, language);
|
|
163
176
|
}
|
|
164
177
|
getChannelConfigs(ids, language) {
|
|
165
|
-
const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');
|
|
178
|
+
const idsStr = ids.map((x) => x.senderId + ',' + x.channelId).join(';');
|
|
166
179
|
return this.getChannelConfigsInternal(idsStr, language);
|
|
167
180
|
}
|
|
168
181
|
setChannelConfig(senderId, config) {
|
|
@@ -177,7 +190,7 @@ class NucleusNotificationsService {
|
|
|
177
190
|
updateNotifications(newNotifications, notifyAboutNew = false) {
|
|
178
191
|
let stateChanged = false;
|
|
179
192
|
for (const n of newNotifications) {
|
|
180
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
193
|
+
const existing = this.notifications.find((x) => x.id === n.id);
|
|
181
194
|
if (existing) {
|
|
182
195
|
if (existing.isRead !== n.isRead) {
|
|
183
196
|
existing.isRead = n.isRead;
|
|
@@ -186,7 +199,8 @@ class NucleusNotificationsService {
|
|
|
186
199
|
}
|
|
187
200
|
else {
|
|
188
201
|
let i = 0;
|
|
189
|
-
while (i < this.notifications.length &&
|
|
202
|
+
while (i < this.notifications.length &&
|
|
203
|
+
n.dateCreated < this.notifications[i].dateCreated) {
|
|
190
204
|
i++;
|
|
191
205
|
}
|
|
192
206
|
this.notifications.splice(i, 0, n);
|
|
@@ -199,7 +213,8 @@ class NucleusNotificationsService {
|
|
|
199
213
|
const now = Date.now();
|
|
200
214
|
for (let i = this.notifications.length - 1; i >= 0; i--) {
|
|
201
215
|
const n = this.notifications[i];
|
|
202
|
-
if (new Date(n.expirationDate).getTime() < now ||
|
|
216
|
+
if (new Date(n.expirationDate).getTime() < now ||
|
|
217
|
+
!newNotifications.find((x) => x.id === n.id)) {
|
|
203
218
|
this.notifications.splice(i, 1);
|
|
204
219
|
stateChanged = true;
|
|
205
220
|
}
|
|
@@ -217,20 +232,23 @@ class NucleusNotificationsService {
|
|
|
217
232
|
const str = window.localStorage.getItem(this.notificationsStorageKey);
|
|
218
233
|
if (str) {
|
|
219
234
|
const notifications = JSON.parse(str);
|
|
220
|
-
this.notifications = notifications.filter(x => !!x);
|
|
235
|
+
this.notifications = notifications.filter((x) => !!x);
|
|
221
236
|
// precaution for notification.isRead of undefined error
|
|
222
237
|
this.notifyStateChanged(false);
|
|
223
238
|
}
|
|
224
239
|
}
|
|
225
|
-
catch {
|
|
240
|
+
catch {
|
|
241
|
+
/* empty */
|
|
242
|
+
}
|
|
226
243
|
}
|
|
227
244
|
handleNotificationEvent(id, eventType) {
|
|
228
|
-
if (eventType.startsWith('new') || eventType === 'updated') {
|
|
229
|
-
|
|
245
|
+
if (eventType.startsWith('new') || eventType === 'updated') {
|
|
246
|
+
// we are handling new and newSilent
|
|
247
|
+
this.getNotification(id).subscribe((n) => {
|
|
230
248
|
if (eventType.startsWith('new') && !n.isRead) {
|
|
231
249
|
this._newNotifications.next(n);
|
|
232
250
|
}
|
|
233
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
251
|
+
const existing = this.notifications.find((x) => x.id === n.id);
|
|
234
252
|
if (existing) {
|
|
235
253
|
existing.isRead = n.isRead;
|
|
236
254
|
}
|
|
@@ -248,7 +266,7 @@ class NucleusNotificationsService {
|
|
|
248
266
|
}
|
|
249
267
|
}
|
|
250
268
|
deleteNotificaton(id) {
|
|
251
|
-
const i = this.notifications.findIndex(x => x.id === id);
|
|
269
|
+
const i = this.notifications.findIndex((x) => x.id === id);
|
|
252
270
|
if (i >= 0) {
|
|
253
271
|
this.notifications.splice(i, 1);
|
|
254
272
|
this.notifyStateChanged();
|
|
@@ -268,7 +286,7 @@ class NucleusNotificationsService {
|
|
|
268
286
|
const notificationClick = {
|
|
269
287
|
id: arr[0],
|
|
270
288
|
type: arr[1],
|
|
271
|
-
routerLink: arr[2]
|
|
289
|
+
routerLink: arr[2],
|
|
272
290
|
};
|
|
273
291
|
const validNotificationClickTypes = ['default', 'deeplink'];
|
|
274
292
|
if (validNotificationClickTypes.includes(notificationClick.type)) {
|
|
@@ -280,15 +298,15 @@ class NucleusNotificationsService {
|
|
|
280
298
|
}
|
|
281
299
|
removeDeliveredNotification(id) {
|
|
282
300
|
if (this._platform === 'ios' || this._platform === 'android') {
|
|
283
|
-
PushNotifications.getDeliveredNotifications().then(list => {
|
|
284
|
-
const toRemove = list.notifications.filter(n => {
|
|
301
|
+
PushNotifications.getDeliveredNotifications().then((list) => {
|
|
302
|
+
const toRemove = list.notifications.filter((n) => {
|
|
285
303
|
const data = this.getNotificationPayloadData(n);
|
|
286
|
-
return
|
|
304
|
+
return data.notificationId === id;
|
|
287
305
|
});
|
|
288
306
|
// TODO: On Android this does not currently work because notificationID is not set.
|
|
289
307
|
// This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523
|
|
290
308
|
PushNotifications.removeDeliveredNotifications({
|
|
291
|
-
notifications: toRemove
|
|
309
|
+
notifications: toRemove,
|
|
292
310
|
});
|
|
293
311
|
});
|
|
294
312
|
}
|
|
@@ -297,15 +315,18 @@ class NucleusNotificationsService {
|
|
|
297
315
|
}
|
|
298
316
|
}
|
|
299
317
|
getNotificationPayloadData(pushNotification) {
|
|
300
|
-
return
|
|
318
|
+
return this._platform === 'ios'
|
|
319
|
+
? pushNotification.data.data
|
|
320
|
+
: pushNotification.data;
|
|
301
321
|
}
|
|
302
322
|
async registerCapacitorEvents() {
|
|
303
|
-
await PushNotifications.addListener('pushNotificationReceived', n => {
|
|
323
|
+
await PushNotifications.addListener('pushNotificationReceived', (n) => {
|
|
304
324
|
const data = this.getNotificationPayloadData(n);
|
|
305
|
-
console.log('Nucleus.Notifications: Received capacitor push event: ' +
|
|
325
|
+
console.log('Nucleus.Notifications: Received capacitor push event: ' +
|
|
326
|
+
data.eventType, n);
|
|
306
327
|
this.handleNotificationEvent(data.notificationId, data.eventType);
|
|
307
328
|
});
|
|
308
|
-
await PushNotifications.addListener('pushNotificationActionPerformed', a => {
|
|
329
|
+
await PushNotifications.addListener('pushNotificationActionPerformed', (a) => {
|
|
309
330
|
let action = a.notification.data.notificationAction;
|
|
310
331
|
if (this._platform === 'ios') {
|
|
311
332
|
action = a.notification.data.data.notificationAction;
|
|
@@ -331,20 +352,24 @@ class NucleusNotificationsService {
|
|
|
331
352
|
const registrationId = window.localStorage.getItem(this.registrationStorageKey);
|
|
332
353
|
if (this._platform === 'android' || this._platform === 'ios') {
|
|
333
354
|
// capacitor platform
|
|
334
|
-
const listener = PushNotifications.addListener('registration', token => {
|
|
355
|
+
const listener = PushNotifications.addListener('registration', (token) => {
|
|
335
356
|
listener.remove();
|
|
336
|
-
_resolve({
|
|
357
|
+
_resolve({
|
|
358
|
+
id: registrationId,
|
|
359
|
+
token: token.value,
|
|
360
|
+
platform: this._platform,
|
|
361
|
+
});
|
|
337
362
|
});
|
|
338
|
-
PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));
|
|
363
|
+
PushNotifications.register().catch((error) => _reject('Could not register for notifications:' + error));
|
|
339
364
|
}
|
|
340
365
|
else if (this._platform === 'web') {
|
|
341
366
|
// Web Push API
|
|
342
|
-
this.http.get(this.apiUrl + 'registration/webkey').subscribe(key => {
|
|
343
|
-
this.getWebPushSubscription(key.publicKey).then(subscription => {
|
|
367
|
+
this.http.get(this.apiUrl + 'registration/webkey').subscribe((key) => {
|
|
368
|
+
this.getWebPushSubscription(key.publicKey).then((subscription) => {
|
|
344
369
|
const t = JSON.stringify(subscription.toJSON());
|
|
345
370
|
_resolve({ id: registrationId, token: t, platform: 'web' });
|
|
346
371
|
});
|
|
347
|
-
}, error => _reject(error));
|
|
372
|
+
}, (error) => _reject(error));
|
|
348
373
|
}
|
|
349
374
|
else {
|
|
350
375
|
_reject(`Nucleus.Notifications: Platform is not supported`);
|
|
@@ -353,14 +378,17 @@ class NucleusNotificationsService {
|
|
|
353
378
|
}
|
|
354
379
|
getWebPushSubscription(publicKey) {
|
|
355
380
|
return new Promise((_resolve, _reject) => {
|
|
356
|
-
this.swPush.subscription.subscribe(subscription => {
|
|
381
|
+
this.swPush.subscription.subscribe((subscription) => {
|
|
357
382
|
if (subscription != null) {
|
|
358
383
|
_resolve(subscription);
|
|
359
384
|
}
|
|
360
385
|
else {
|
|
361
|
-
this.swPush
|
|
386
|
+
this.swPush
|
|
387
|
+
.requestSubscription({ serverPublicKey: publicKey })
|
|
388
|
+
.then((s) => _resolve(s))
|
|
389
|
+
.catch((e) => _reject(e));
|
|
362
390
|
}
|
|
363
|
-
}, error => {
|
|
391
|
+
}, (error) => {
|
|
364
392
|
console.error('Nucleus.Notifications: Cannot get web push subscription', error);
|
|
365
393
|
_reject(error);
|
|
366
394
|
});
|
|
@@ -372,7 +400,7 @@ class NucleusNotificationsService {
|
|
|
372
400
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusNotificationsService, decorators: [{
|
|
373
401
|
type: Injectable,
|
|
374
402
|
args: [{
|
|
375
|
-
providedIn: 'root'
|
|
403
|
+
providedIn: 'root',
|
|
376
404
|
}]
|
|
377
405
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SwPush }, { type: i3.NucleusAppService }, { type: NucleusNotificationsConfig }]; } });
|
|
378
406
|
|
|
@@ -380,9 +408,7 @@ class NucleusNotificationsModule {
|
|
|
380
408
|
static forRoot(config) {
|
|
381
409
|
return {
|
|
382
410
|
ngModule: NucleusNotificationsModule,
|
|
383
|
-
providers: [
|
|
384
|
-
{ provide: NucleusNotificationsConfig, useValue: config }
|
|
385
|
-
]
|
|
411
|
+
providers: [{ provide: NucleusNotificationsConfig, useValue: config }],
|
|
386
412
|
};
|
|
387
413
|
}
|
|
388
414
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NucleusNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
@@ -394,7 +420,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
394
420
|
args: [{
|
|
395
421
|
declarations: [],
|
|
396
422
|
imports: [],
|
|
397
|
-
exports: []
|
|
423
|
+
exports: [],
|
|
398
424
|
}]
|
|
399
425
|
}] });
|
|
400
426
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kolektor-nucleus-notifications.mjs","sources":["../../../../../libs/ng/nucleus-notifications/src/lib/models.ts","../../../../../libs/ng/nucleus-notifications/src/lib/nucleus-notifications.service.ts","../../../../../libs/ng/nucleus-notifications/src/lib/nucleus-notifications.module.ts","../../../../../libs/ng/nucleus-notifications/src/kolektor-nucleus-notifications.ts"],"sourcesContent":["export class Notification {\n public id: string;\n public sender: Identity;\n public data: NotificationData;\n public isRead: boolean;\n public dateCreated: Date;\n public expirationDate: Date;\n}\n\nexport class Identity {\n public subject: string;\n public name: string;\n public pictureUrl: string;\n}\n\nexport class Recipient {\n public attributeName: string;\n public directoryName: string;\n public attributeValue: string;\n}\n\nexport class NotificationData {\n title: string;\n message: string;\n htmlMessage: string;\n preventDismissal: boolean;\n deepLink: string;\n}\n\nexport class WebKey {\n publicKey: string;\n}\n\nexport class Registration {\n id: string;\n token: string;\n platform: PlatformValue;\n}\n\nexport class RegistrationResult {\n id: string;\n}\n\nexport class PayloadData {\n notificationId: string;\n eventType: NotificationEventType;\n}\n\nexport class NucleusNotificationsConfig {\n serverApiUrl: string;\n}\n\nexport class NotificationClick {\n id: string;\n type: NotificationType;\n routerLink?: string;\n}\n\nexport type NotificationEventType = 'new' | 'updated' | 'deleted' | 'deletedAll' | 'updatedAll' | 'newSilent';\n\nexport type PlatformValue = 'ios' | 'android' | 'web' | 'none';\n\nexport type NotificationType = 'default' | 'deeplink';\n\nexport interface ChannelId {\n senderId: string;\n channelId: string;\n}\n\nexport class UserChannelConfig {\n channelId: string;\n displayName: string;\n isSubscribed: boolean;\n subscriptionType: ChannelSubscriptionType;\n methods: NotifyMethod[];\n allowedMethods: NotifyMethod[];\n}\n\nexport type ChannelSubscriptionType = 'invariant' | 'optIn' | 'optOut';\n\nexport type NotifyMethod = 'push' | 'email' | 'sms';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { SwPush } from '@angular/service-worker';\nimport { PushNotifications, PushNotificationSchema } from '@capacitor/push-notifications';\nimport { NucleusAppService } from '@kolektor/nucleus-common';\nimport { Observable, of, Subject } from 'rxjs';\nimport {\n ChannelId,\n Notification,\n NotificationClick,\n NotificationEventType,\n NotificationType,\n NucleusNotificationsConfig,\n PayloadData,\n PlatformValue,\n Registration,\n RegistrationResult,\n UserChannelConfig,\n WebKey\n} from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NucleusNotificationsService {\n\n constructor(\n private http: HttpClient,\n private swPush: SwPush,\n private appService: NucleusAppService,\n config: NucleusNotificationsConfig\n ) {\n let url = config.serverApiUrl;\n if (!url.endsWith('/')) {\n url += '/';\n }\n this.apiUrl = url;\n }\n\n private apiUrl: string;\n private readonly registrationStorageKey = 'NucleusNotificationsRegistrationId';\n private readonly notificationsStorageKey = 'NucleusNotificationsLocalCache';\n private _platform: PlatformValue;\n private _isInitialized = false;\n private _newNotifications = new Subject<Notification>();\n private _clicksSubject = new Subject<NotificationClick>();\n private _stateChangesSubject = new Subject<void>();\n\n public notifications: Notification[] = [];\n\n public get unreadCount() {\n return this.notifications.filter(x => !x.isRead).length;\n }\n\n public get newNotifications() {\n return this._newNotifications.asObservable();\n }\n\n public get clicks() {\n return this._clicksSubject.asObservable();\n }\n public get stateChanges() {\n return this._stateChangesSubject.asObservable();\n }\n\n public get isInitialized() {\n return this._isInitialized;\n }\n\n public async initialize() {\n // make sure app service has finished initializing\n await this.appService.init();\n\n this.loadFromStorage();\n\n if (this.appService.isNative) {\n this._platform = this.appService.deviceInfo.platform as PlatformValue;\n await this.registerCapacitorEvents();\n } else if (this.swPush.isEnabled) {\n this._platform = 'web';\n this.registerWebPushEvents();\n } else {\n console.warn('Nucleus.Notifications: There is no push capability, timer will be used to update notifications');\n setInterval(() => {\n console.log('Updating notifications...');\n this.refresh(true);\n }, 5 * 60 * 1000);\n }\n this._isInitialized = true;\n this.refresh();\n }\n\n public register(): Promise<any> {\n return new Promise((_resolve, _reject) => {\n this.getRegistrationInfo().then((info) => {\n this.http.post<RegistrationResult>(this.apiUrl + 'registration', info).subscribe((regResult) => {\n window.localStorage.setItem(this.registrationStorageKey, regResult.id);\n _resolve(null);\n }, error => {\n console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);\n _reject(error);\n });\n }).catch((error) => _reject(error));\n });\n }\n\n public unregister(): Promise<any> {\n return new Promise((_resolve, _reject) => {\n this.getRegistrationInfo().then((info) => {\n this.http.request<any>('DELETE', this.apiUrl + 'registration', { body: info }).subscribe(() => {\n window.localStorage.removeItem(this.registrationStorageKey);\n _resolve(null);\n }, error => {\n console.log('Nucleus.Notifications: Failed to remove registration from server.', error);\n _reject(error);\n });\n }).catch((error) => _reject(error));\n });\n }\n\n public refresh(notifyAboutNew = false) {\n this.http.get<Notification[]>(this.apiUrl + 'notifications').subscribe(res => {\n this.updateNotifications(res, notifyAboutNew);\n });\n }\n\n public getNotification(id: string): Observable<Notification> {\n const localNotification = this.notifications.find(x => x.id === id);\n if (localNotification) {\n return of(localNotification);\n }\n return this.http.get<Notification>(this.apiUrl + 'notifications/' + id);\n }\n\n public readNotification(id: string) {\n const n = this.notifications.find(x => x.id === id);\n if (n && !n.isRead) {\n n.isRead = true;\n this.notifyStateChanged();\n }\n this.http.get(this.apiUrl + 'notifications/read/' + id).subscribe();\n }\n\n public dismissNotification(id: string) {\n this.deleteNotificaton(id);\n this.http.delete(this.apiUrl + 'notifications/' + id).subscribe();\n this.removeDeliveredNotification(id);\n }\n\n public dismissAll() {\n this.notifications.splice(0);\n this.notifyStateChanged();\n this.http.delete(this.apiUrl + 'notifications/all').subscribe();\n if (this._platform === 'ios' || this._platform === 'android') {\n PushNotifications.removeAllDeliveredNotifications();\n } else if (this._platform === 'web') {\n // TODO: remove all web push notifications\n }\n }\n\n public readAll() {\n for (const n of this.notifications) {\n n.isRead = true;\n }\n this.notifyStateChanged();\n this.http.get(this.apiUrl + 'notifications/read/all').subscribe();\n }\n\n public getChannelConfig(senderId: string, channelId: string, language?: string) {\n return this.http.get<UserChannelConfig>(this.apiUrl + `settings/channel/${senderId}/${channelId}?language=${language}`);\n }\n\n public getChannelConfigsForSender(senderId: string, channelIds: string[], language?: string) {\n const idsStr = channelIds.map(x => senderId + ',' + x).join(';');\n return this.getChannelConfigsInternal(idsStr, language);\n }\n\n public getChannelConfigs(ids: ChannelId[], language?: string) {\n const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');\n return this.getChannelConfigsInternal(idsStr, language);\n }\n\n public setChannelConfig(senderId: string, config: UserChannelConfig) {\n return this.http.post<void>(`${this.apiUrl}settings/channel/${senderId}`, config);\n }\n\n public setChannelConfigs(configs: UserChannelConfig[]) {\n return this.http.post<void>(`${this.apiUrl}settings/channels`, configs);\n }\n\n private getChannelConfigsInternal(ids: string, language?: string) {\n return this.http.get<UserChannelConfig[]>(`${this.apiUrl}settings/channels?ids=${ids}&language=${language}`);\n }\n\n private updateNotifications(newNotifications: Notification[], notifyAboutNew = false) {\n let stateChanged = false;\n for (const n of newNotifications) {\n const existing = this.notifications.find(x => x.id === n.id);\n if (existing) {\n if (existing.isRead !== n.isRead) {\n existing.isRead = n.isRead;\n stateChanged = true;\n }\n } else {\n let i = 0;\n while (i < this.notifications.length && n.dateCreated < this.notifications[i].dateCreated) {\n i++;\n }\n this.notifications.splice(i, 0, n);\n stateChanged = true;\n if (notifyAboutNew) {\n this._newNotifications.next(n);\n }\n }\n }\n\n const now = Date.now();\n for (let i = this.notifications.length - 1; i >= 0; i--) {\n const n = this.notifications[i];\n if (new Date(n.expirationDate).getTime() < now || !newNotifications.find(x => x.id === n.id)) {\n this.notifications.splice(i, 1);\n stateChanged = true;\n }\n }\n\n if (stateChanged) {\n this.notifyStateChanged();\n }\n }\n\n private saveToStorage() {\n const str = JSON.stringify(this.notifications);\n window.localStorage.setItem(this.notificationsStorageKey, str);\n }\n\n private loadFromStorage() {\n try {\n const str = window.localStorage.getItem(this.notificationsStorageKey);\n if (str) {\n const notifications = JSON.parse(str) as Notification[];\n this.notifications = notifications.filter(x => !!x);\n // precaution for notification.isRead of undefined error\n this.notifyStateChanged(false);\n }\n } catch { /* empty */ }\n }\n\n private handleNotificationEvent(id: string, eventType: NotificationEventType) {\n if (eventType.startsWith('new') || eventType === 'updated') { // we are handling new and newSilent\n this.getNotification(id).subscribe(n => {\n if (eventType.startsWith('new') && !n.isRead) {\n this._newNotifications.next(n);\n }\n const existing = this.notifications.find(x => x.id === n.id);\n if (existing) {\n existing.isRead = n.isRead;\n } else {\n this.notifications.splice(0, 0, n);\n }\n this.notifyStateChanged();\n });\n } else if (eventType === 'deleted') {\n this.deleteNotificaton(id);\n } else {\n this.refresh();\n }\n }\n\n private deleteNotificaton(id: string) {\n const i = this.notifications.findIndex(x => x.id === id);\n if (i >= 0) {\n this.notifications.splice(i, 1);\n this.notifyStateChanged();\n }\n }\n\n private notifyStateChanged(persistState = true) {\n if (persistState) {\n this.saveToStorage();\n }\n this._stateChangesSubject.next();\n }\n\n private handleNotificationAction(notificationAction: string | undefined) {\n if (!notificationAction) {\n throw new Error('Notification action is empty!');\n }\n\n const arr = notificationAction.split(':');\n const notificationClick: NotificationClick = {\n id: arr[0],\n type: arr[1] as NotificationType,\n routerLink: arr[2]\n };\n\n const validNotificationClickTypes = ['default', 'deeplink'];\n if (validNotificationClickTypes.includes(notificationClick.type)) {\n this._clicksSubject.next(notificationClick);\n } else {\n console.error(`Nucleus.Notifications: Unknown notification action: '${notificationAction}'.`);\n }\n }\n\n private removeDeliveredNotification(id: string) {\n if (this._platform === 'ios' || this._platform === 'android') {\n PushNotifications.getDeliveredNotifications().then(list => {\n const toRemove = list.notifications.filter(n => {\n const data = this.getNotificationPayloadData(n);\n return (data.notificationId === id);\n });\n\n // TODO: On Android this does not currently work because notificationID is not set.\n // This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523\n PushNotifications.removeDeliveredNotifications({\n notifications: toRemove\n });\n });\n } else if (this._platform === 'web') {\n // TODO: remove web push notification\n }\n }\n\n private getNotificationPayloadData(pushNotification: PushNotificationSchema): PayloadData {\n return (this._platform === 'ios') ? pushNotification.data.data : pushNotification.data;\n }\n\n private async registerCapacitorEvents() {\n await PushNotifications.addListener('pushNotificationReceived', n => {\n const data = this.getNotificationPayloadData(n);\n console.log('Nucleus.Notifications: Received capacitor push event: ' + data.eventType, n);\n this.handleNotificationEvent(data.notificationId, data.eventType);\n });\n\n await PushNotifications.addListener('pushNotificationActionPerformed', a => {\n let action = (a as any).notification.data.notificationAction;\n if (this._platform === 'ios') {\n action = (a as any).notification.data.data.notificationAction;\n }\n console.log('Nucleus.Notifications: Received capacitor action event', action);\n this.handleNotificationAction(action);\n });\n }\n\n private registerWebPushEvents() {\n this.swPush.messages.subscribe((n) => {\n const data: PayloadData = (n as any).data;\n console.log('Nucleus.Notifications: Received WebPush event: ' + data.eventType, n);\n this.handleNotificationEvent(data.notificationId, data.eventType);\n });\n\n this.swPush.notificationClicks.subscribe((action) => {\n console.log('Nucleus.Notifications: Received WebPush action event', action);\n const tag = action.notification.tag;\n this.handleNotificationAction(tag);\n });\n }\n\n private getRegistrationInfo(): Promise<Registration> {\n return new Promise((_resolve, _reject) => {\n const registrationId = window.localStorage.getItem(this.registrationStorageKey) as string;\n if (this._platform === 'android' || this._platform === 'ios') {\n // capacitor platform\n const listener = PushNotifications.addListener('registration', token => {\n listener.remove();\n _resolve({ id: registrationId, token: token.value, platform: this._platform });\n });\n PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));\n } else if (this._platform === 'web') {\n // Web Push API\n this.http.get<WebKey>(this.apiUrl + 'registration/webkey').subscribe(key => {\n this.getWebPushSubscription(key.publicKey).then(subscription => {\n const t = JSON.stringify(subscription.toJSON());\n _resolve({ id: registrationId, token: t, platform: 'web' });\n });\n }, error => _reject(error));\n } else {\n _reject(`Nucleus.Notifications: Platform is not supported`);\n }\n });\n }\n\n private getWebPushSubscription(publicKey: string): Promise<PushSubscription> {\n return new Promise((_resolve, _reject) => {\n this.swPush.subscription.subscribe(subscription => {\n if (subscription != null) {\n _resolve(subscription);\n } else {\n this.swPush.requestSubscription({ serverPublicKey: publicKey }).then(s => _resolve(s)).catch(e => _reject(e));\n }\n }, error => {\n console.error('Nucleus.Notifications: Cannot get web push subscription', error);\n _reject(error);\n });\n });\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { NucleusNotificationsConfig } from './models';\n\n@NgModule({\n declarations: [],\n imports: [\n ],\n exports: []\n})\nexport class NucleusNotificationsModule {\n\n static forRoot(config: NucleusNotificationsConfig): ModuleWithProviders<NucleusNotificationsModule> {\n return {\n ngModule: NucleusNotificationsModule,\n providers: [\n { provide: NucleusNotificationsConfig, useValue: config }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4.NucleusNotificationsConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kolektor-nucleus-notifications.mjs","sources":["../../../../../../libs/ng/nucleus/nucleus-notifications/src/lib/models.ts","../../../../../../libs/ng/nucleus/nucleus-notifications/src/lib/nucleus-notifications.service.ts","../../../../../../libs/ng/nucleus/nucleus-notifications/src/lib/nucleus-notifications.module.ts","../../../../../../libs/ng/nucleus/nucleus-notifications/src/kolektor-nucleus-notifications.ts"],"sourcesContent":["export class Notification {\n public id: string;\n public sender: Identity;\n public data: NotificationData;\n public isRead: boolean;\n public dateCreated: Date;\n public expirationDate: Date;\n}\n\nexport class Identity {\n public subject: string;\n public name: string;\n public pictureUrl: string;\n}\n\nexport class Recipient {\n public attributeName: string;\n public directoryName: string;\n public attributeValue: string;\n}\n\nexport class NotificationData {\n title: string;\n message: string;\n htmlMessage: string;\n preventDismissal: boolean;\n deepLink: string;\n}\n\nexport class WebKey {\n publicKey: string;\n}\n\nexport class Registration {\n id: string;\n token: string;\n platform: PlatformValue;\n}\n\nexport class RegistrationResult {\n id: string;\n}\n\nexport class PayloadData {\n notificationId: string;\n eventType: NotificationEventType;\n}\n\nexport class NucleusNotificationsConfig {\n serverApiUrl: string;\n}\n\nexport class NotificationClick {\n id: string;\n type: NotificationType;\n routerLink?: string;\n}\n\nexport type NotificationEventType =\n | 'new'\n | 'updated'\n | 'deleted'\n | 'deletedAll'\n | 'updatedAll'\n | 'newSilent';\n\nexport type PlatformValue = 'ios' | 'android' | 'web' | 'none';\n\nexport type NotificationType = 'default' | 'deeplink';\n\nexport interface ChannelId {\n senderId: string;\n channelId: string;\n}\n\nexport class UserChannelConfig {\n channelId: string;\n displayName: string;\n isSubscribed: boolean;\n subscriptionType: ChannelSubscriptionType;\n methods: NotifyMethod[];\n allowedMethods: NotifyMethod[];\n}\n\nexport type ChannelSubscriptionType = 'invariant' | 'optIn' | 'optOut';\n\nexport type NotifyMethod = 'push' | 'email' | 'sms';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { SwPush } from '@angular/service-worker';\nimport {\n PushNotifications,\n PushNotificationSchema,\n} from '@capacitor/push-notifications';\nimport { NucleusAppService } from '@kolektor/nucleus-common';\nimport { Observable, of, Subject } from 'rxjs';\nimport {\n ChannelId,\n Notification,\n NotificationClick,\n NotificationEventType,\n NotificationType,\n NucleusNotificationsConfig,\n PayloadData,\n PlatformValue,\n Registration,\n RegistrationResult,\n UserChannelConfig,\n WebKey,\n} from './models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NucleusNotificationsService {\n constructor(\n private http: HttpClient,\n private swPush: SwPush,\n private appService: NucleusAppService,\n config: NucleusNotificationsConfig\n ) {\n let url = config.serverApiUrl;\n if (!url.endsWith('/')) {\n url += '/';\n }\n this.apiUrl = url;\n }\n\n private apiUrl: string;\n private readonly registrationStorageKey =\n 'NucleusNotificationsRegistrationId';\n private readonly notificationsStorageKey = 'NucleusNotificationsLocalCache';\n private _platform: PlatformValue;\n private _isInitialized = false;\n private _newNotifications = new Subject<Notification>();\n private _clicksSubject = new Subject<NotificationClick>();\n private _stateChangesSubject = new Subject<void>();\n\n public notifications: Notification[] = [];\n\n public get unreadCount() {\n return this.notifications.filter((x) => !x.isRead).length;\n }\n\n public get newNotifications() {\n return this._newNotifications.asObservable();\n }\n\n public get clicks() {\n return this._clicksSubject.asObservable();\n }\n public get stateChanges() {\n return this._stateChangesSubject.asObservable();\n }\n\n public get isInitialized() {\n return this._isInitialized;\n }\n\n public async initialize() {\n // make sure app service has finished initializing\n await this.appService.init();\n\n this.loadFromStorage();\n\n if (this.appService.isNative) {\n this._platform = this.appService.deviceInfo.platform as PlatformValue;\n await this.registerCapacitorEvents();\n } else if (this.swPush.isEnabled) {\n this._platform = 'web';\n this.registerWebPushEvents();\n } else {\n console.warn(\n 'Nucleus.Notifications: There is no push capability, timer will be used to update notifications'\n );\n setInterval(() => {\n console.log('Updating notifications...');\n this.refresh(true);\n }, 5 * 60 * 1000);\n }\n this._isInitialized = true;\n this.refresh();\n }\n\n public register(): Promise<any> {\n return new Promise((_resolve, _reject) => {\n this.getRegistrationInfo()\n .then((info) => {\n this.http\n .post<RegistrationResult>(this.apiUrl + 'registration', info)\n .subscribe(\n (regResult) => {\n window.localStorage.setItem(\n this.registrationStorageKey,\n regResult.id\n );\n _resolve(null);\n },\n (error) => {\n console.log(\n 'Nucleus.Notifications: Failed to send notification registration to server.',\n error\n );\n _reject(error);\n }\n );\n })\n .catch((error) => _reject(error));\n });\n }\n\n public unregister(): Promise<any> {\n return new Promise((_resolve, _reject) => {\n this.getRegistrationInfo()\n .then((info) => {\n this.http\n .request<any>('DELETE', this.apiUrl + 'registration', {\n body: info,\n })\n .subscribe(\n () => {\n window.localStorage.removeItem(this.registrationStorageKey);\n _resolve(null);\n },\n (error) => {\n console.log(\n 'Nucleus.Notifications: Failed to remove registration from server.',\n error\n );\n _reject(error);\n }\n );\n })\n .catch((error) => _reject(error));\n });\n }\n\n public refresh(notifyAboutNew = false) {\n this.http\n .get<Notification[]>(this.apiUrl + 'notifications')\n .subscribe((res) => {\n this.updateNotifications(res, notifyAboutNew);\n });\n }\n\n public getNotification(id: string): Observable<Notification> {\n const localNotification = this.notifications.find((x) => x.id === id);\n if (localNotification) {\n return of(localNotification);\n }\n return this.http.get<Notification>(this.apiUrl + 'notifications/' + id);\n }\n\n public readNotification(id: string) {\n const n = this.notifications.find((x) => x.id === id);\n if (n && !n.isRead) {\n n.isRead = true;\n this.notifyStateChanged();\n }\n this.http.get(this.apiUrl + 'notifications/read/' + id).subscribe();\n }\n\n public dismissNotification(id: string) {\n this.deleteNotificaton(id);\n this.http.delete(this.apiUrl + 'notifications/' + id).subscribe();\n this.removeDeliveredNotification(id);\n }\n\n public dismissAll() {\n this.notifications.splice(0);\n this.notifyStateChanged();\n this.http.delete(this.apiUrl + 'notifications/all').subscribe();\n if (this._platform === 'ios' || this._platform === 'android') {\n PushNotifications.removeAllDeliveredNotifications();\n } else if (this._platform === 'web') {\n // TODO: remove all web push notifications\n }\n }\n\n public readAll() {\n for (const n of this.notifications) {\n n.isRead = true;\n }\n this.notifyStateChanged();\n this.http.get(this.apiUrl + 'notifications/read/all').subscribe();\n }\n\n public getChannelConfig(\n senderId: string,\n channelId: string,\n language?: string\n ) {\n return this.http.get<UserChannelConfig>(\n this.apiUrl +\n `settings/channel/${senderId}/${channelId}?language=${language}`\n );\n }\n\n public getChannelConfigsForSender(\n senderId: string,\n channelIds: string[],\n language?: string\n ) {\n const idsStr = channelIds.map((x) => senderId + ',' + x).join(';');\n return this.getChannelConfigsInternal(idsStr, language);\n }\n\n public getChannelConfigs(ids: ChannelId[], language?: string) {\n const idsStr = ids.map((x) => x.senderId + ',' + x.channelId).join(';');\n return this.getChannelConfigsInternal(idsStr, language);\n }\n\n public setChannelConfig(senderId: string, config: UserChannelConfig) {\n return this.http.post<void>(\n `${this.apiUrl}settings/channel/${senderId}`,\n config\n );\n }\n\n public setChannelConfigs(configs: UserChannelConfig[]) {\n return this.http.post<void>(`${this.apiUrl}settings/channels`, configs);\n }\n\n private getChannelConfigsInternal(ids: string, language?: string) {\n return this.http.get<UserChannelConfig[]>(\n `${this.apiUrl}settings/channels?ids=${ids}&language=${language}`\n );\n }\n\n private updateNotifications(\n newNotifications: Notification[],\n notifyAboutNew = false\n ) {\n let stateChanged = false;\n for (const n of newNotifications) {\n const existing = this.notifications.find((x) => x.id === n.id);\n if (existing) {\n if (existing.isRead !== n.isRead) {\n existing.isRead = n.isRead;\n stateChanged = true;\n }\n } else {\n let i = 0;\n while (\n i < this.notifications.length &&\n n.dateCreated < this.notifications[i].dateCreated\n ) {\n i++;\n }\n this.notifications.splice(i, 0, n);\n stateChanged = true;\n if (notifyAboutNew) {\n this._newNotifications.next(n);\n }\n }\n }\n\n const now = Date.now();\n for (let i = this.notifications.length - 1; i >= 0; i--) {\n const n = this.notifications[i];\n if (\n new Date(n.expirationDate).getTime() < now ||\n !newNotifications.find((x) => x.id === n.id)\n ) {\n this.notifications.splice(i, 1);\n stateChanged = true;\n }\n }\n\n if (stateChanged) {\n this.notifyStateChanged();\n }\n }\n\n private saveToStorage() {\n const str = JSON.stringify(this.notifications);\n window.localStorage.setItem(this.notificationsStorageKey, str);\n }\n\n private loadFromStorage() {\n try {\n const str = window.localStorage.getItem(this.notificationsStorageKey);\n if (str) {\n const notifications = JSON.parse(str) as Notification[];\n this.notifications = notifications.filter((x) => !!x);\n // precaution for notification.isRead of undefined error\n this.notifyStateChanged(false);\n }\n } catch {\n /* empty */\n }\n }\n\n private handleNotificationEvent(\n id: string,\n eventType: NotificationEventType\n ) {\n if (eventType.startsWith('new') || eventType === 'updated') {\n // we are handling new and newSilent\n this.getNotification(id).subscribe((n) => {\n if (eventType.startsWith('new') && !n.isRead) {\n this._newNotifications.next(n);\n }\n const existing = this.notifications.find((x) => x.id === n.id);\n if (existing) {\n existing.isRead = n.isRead;\n } else {\n this.notifications.splice(0, 0, n);\n }\n this.notifyStateChanged();\n });\n } else if (eventType === 'deleted') {\n this.deleteNotificaton(id);\n } else {\n this.refresh();\n }\n }\n\n private deleteNotificaton(id: string) {\n const i = this.notifications.findIndex((x) => x.id === id);\n if (i >= 0) {\n this.notifications.splice(i, 1);\n this.notifyStateChanged();\n }\n }\n\n private notifyStateChanged(persistState = true) {\n if (persistState) {\n this.saveToStorage();\n }\n this._stateChangesSubject.next();\n }\n\n private handleNotificationAction(notificationAction: string | undefined) {\n if (!notificationAction) {\n throw new Error('Notification action is empty!');\n }\n\n const arr = notificationAction.split(':');\n const notificationClick: NotificationClick = {\n id: arr[0],\n type: arr[1] as NotificationType,\n routerLink: arr[2],\n };\n\n const validNotificationClickTypes = ['default', 'deeplink'];\n if (validNotificationClickTypes.includes(notificationClick.type)) {\n this._clicksSubject.next(notificationClick);\n } else {\n console.error(\n `Nucleus.Notifications: Unknown notification action: '${notificationAction}'.`\n );\n }\n }\n\n private removeDeliveredNotification(id: string) {\n if (this._platform === 'ios' || this._platform === 'android') {\n PushNotifications.getDeliveredNotifications().then((list) => {\n const toRemove = list.notifications.filter((n) => {\n const data = this.getNotificationPayloadData(n);\n return data.notificationId === id;\n });\n\n // TODO: On Android this does not currently work because notificationID is not set.\n // This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523\n PushNotifications.removeDeliveredNotifications({\n notifications: toRemove,\n });\n });\n } else if (this._platform === 'web') {\n // TODO: remove web push notification\n }\n }\n\n private getNotificationPayloadData(\n pushNotification: PushNotificationSchema\n ): PayloadData {\n return this._platform === 'ios'\n ? pushNotification.data.data\n : pushNotification.data;\n }\n\n private async registerCapacitorEvents() {\n await PushNotifications.addListener('pushNotificationReceived', (n) => {\n const data = this.getNotificationPayloadData(n);\n console.log(\n 'Nucleus.Notifications: Received capacitor push event: ' +\n data.eventType,\n n\n );\n this.handleNotificationEvent(data.notificationId, data.eventType);\n });\n\n await PushNotifications.addListener(\n 'pushNotificationActionPerformed',\n (a) => {\n let action = (a as any).notification.data.notificationAction;\n if (this._platform === 'ios') {\n action = (a as any).notification.data.data.notificationAction;\n }\n console.log(\n 'Nucleus.Notifications: Received capacitor action event',\n action\n );\n this.handleNotificationAction(action);\n }\n );\n }\n\n private registerWebPushEvents() {\n this.swPush.messages.subscribe((n) => {\n const data: PayloadData = (n as any).data;\n console.log(\n 'Nucleus.Notifications: Received WebPush event: ' + data.eventType,\n n\n );\n this.handleNotificationEvent(data.notificationId, data.eventType);\n });\n\n this.swPush.notificationClicks.subscribe((action) => {\n console.log(\n 'Nucleus.Notifications: Received WebPush action event',\n action\n );\n const tag = action.notification.tag;\n this.handleNotificationAction(tag);\n });\n }\n\n private getRegistrationInfo(): Promise<Registration> {\n return new Promise((_resolve, _reject) => {\n const registrationId = window.localStorage.getItem(\n this.registrationStorageKey\n ) as string;\n if (this._platform === 'android' || this._platform === 'ios') {\n // capacitor platform\n const listener = PushNotifications.addListener(\n 'registration',\n (token) => {\n listener.remove();\n _resolve({\n id: registrationId,\n token: token.value,\n platform: this._platform,\n });\n }\n );\n PushNotifications.register().catch((error) =>\n _reject('Could not register for notifications:' + error)\n );\n } else if (this._platform === 'web') {\n // Web Push API\n this.http.get<WebKey>(this.apiUrl + 'registration/webkey').subscribe(\n (key) => {\n this.getWebPushSubscription(key.publicKey).then((subscription) => {\n const t = JSON.stringify(subscription.toJSON());\n _resolve({ id: registrationId, token: t, platform: 'web' });\n });\n },\n (error) => _reject(error)\n );\n } else {\n _reject(`Nucleus.Notifications: Platform is not supported`);\n }\n });\n }\n\n private getWebPushSubscription(publicKey: string): Promise<PushSubscription> {\n return new Promise((_resolve, _reject) => {\n this.swPush.subscription.subscribe(\n (subscription) => {\n if (subscription != null) {\n _resolve(subscription);\n } else {\n this.swPush\n .requestSubscription({ serverPublicKey: publicKey })\n .then((s) => _resolve(s))\n .catch((e) => _reject(e));\n }\n },\n (error) => {\n console.error(\n 'Nucleus.Notifications: Cannot get web push subscription',\n error\n );\n _reject(error);\n }\n );\n });\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { NucleusNotificationsConfig } from './models';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n})\nexport class NucleusNotificationsModule {\n static forRoot(\n config: NucleusNotificationsConfig\n ): ModuleWithProviders<NucleusNotificationsModule> {\n return {\n ngModule: NucleusNotificationsModule,\n providers: [{ provide: NucleusNotificationsConfig, useValue: config }],\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4.NucleusNotificationsConfig"],"mappings":";;;;;;;;MAAa,YAAY,CAAA;AAOxB,CAAA;MAEY,QAAQ,CAAA;AAIpB,CAAA;MAEY,SAAS,CAAA;AAIrB,CAAA;MAEY,gBAAgB,CAAA;AAM5B,CAAA;MAEY,MAAM,CAAA;AAElB,CAAA;MAEY,YAAY,CAAA;AAIxB,CAAA;MAEY,kBAAkB,CAAA;AAE9B,CAAA;MAEY,WAAW,CAAA;AAGvB,CAAA;MAEY,0BAA0B,CAAA;AAEtC,CAAA;MAEY,iBAAiB,CAAA;AAI7B,CAAA;MAmBY,iBAAiB,CAAA;AAO7B;;AClFD;MA4Ba,2BAA2B,CAAA;AACtC,IAAA,WAAA,CACU,IAAgB,EAChB,MAAc,EACd,UAA6B,EACrC,MAAkC,EAAA;QAH1B,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QAChB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QACd,IAAU,CAAA,UAAA,GAAV,UAAU,CAAmB;QAWtB,IAAsB,CAAA,sBAAA,GACrC,oCAAoC,CAAC;QACtB,IAAuB,CAAA,uBAAA,GAAG,gCAAgC,CAAC;QAEpE,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAgB,CAAC;AAChD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAqB,CAAC;AAClD,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,OAAO,EAAQ,CAAC;QAE5C,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;AAjBxC,QAAA,IAAI,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC;AAC9B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtB,GAAG,IAAI,GAAG,CAAC;AACZ,SAAA;AACD,QAAA,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;KACnB;AAcD,IAAA,IAAW,WAAW,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;KAC3D;AAED,IAAA,IAAW,gBAAgB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;KAC9C;AAED,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;KAC3C;AACD,IAAA,IAAW,YAAY,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;KACjD;AAED,IAAA,IAAW,aAAa,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;KAC5B;AAEM,IAAA,MAAM,UAAU,GAAA;;AAErB,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,CAAC,eAAe,EAAE,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAyB,CAAC;AACtE,YAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACtC,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC9B,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,CAAC,IAAI,CACV,gGAAgG,CACjG,CAAC;YACF,WAAW,CAAC,MAAK;AACf,gBAAA,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrB,aAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACnB,SAAA;AACD,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;KAChB;IAEM,QAAQ,GAAA;QACb,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAI;YACvC,IAAI,CAAC,mBAAmB,EAAE;AACvB,iBAAA,IAAI,CAAC,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,IAAI;qBACN,IAAI,CAAqB,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,IAAI,CAAC;AAC5D,qBAAA,SAAS,CACR,CAAC,SAAS,KAAI;AACZ,oBAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CACzB,IAAI,CAAC,sBAAsB,EAC3B,SAAS,CAAC,EAAE,CACb,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjB,iBAAC,EACD,CAAC,KAAK,KAAI;AACR,oBAAA,OAAO,CAAC,GAAG,CACT,4EAA4E,EAC5E,KAAK,CACN,CAAC;oBACF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,iBAAC,CACF,CAAC;AACN,aAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,SAAC,CAAC,CAAC;KACJ;IAEM,UAAU,GAAA;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAI;YACvC,IAAI,CAAC,mBAAmB,EAAE;AACvB,iBAAA,IAAI,CAAC,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,IAAI;qBACN,OAAO,CAAM,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE;AACpD,oBAAA,IAAI,EAAE,IAAI;iBACX,CAAC;qBACD,SAAS,CACR,MAAK;oBACH,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBAC5D,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjB,iBAAC,EACD,CAAC,KAAK,KAAI;AACR,oBAAA,OAAO,CAAC,GAAG,CACT,mEAAmE,EACnE,KAAK,CACN,CAAC;oBACF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,iBAAC,CACF,CAAC;AACN,aAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,SAAC,CAAC,CAAC;KACJ;IAEM,OAAO,CAAC,cAAc,GAAG,KAAK,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI;AACN,aAAA,GAAG,CAAiB,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;AAClD,aAAA,SAAS,CAAC,CAAC,GAAG,KAAI;AACjB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAChD,SAAC,CAAC,CAAC;KACN;AAEM,IAAA,eAAe,CAAC,EAAU,EAAA;AAC/B,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,QAAA,IAAI,iBAAiB,EAAE;AACrB,YAAA,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAC9B,SAAA;AACD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,IAAI,CAAC,MAAM,GAAG,gBAAgB,GAAG,EAAE,CAAC,CAAC;KACzE;AAEM,IAAA,gBAAgB,CAAC,EAAU,EAAA;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;AAClB,YAAA,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3B,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,qBAAqB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;KACrE;AAEM,IAAA,mBAAmB,CAAC,EAAU,EAAA;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,gBAAgB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AAClE,QAAA,IAAI,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;KACtC;IAEM,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAC5D,iBAAiB,CAAC,+BAA+B,EAAE,CAAC;AACrD,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;;AAEpC,SAAA;KACF;IAEM,OAAO,GAAA;AACZ,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;AACjB,SAAA;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,wBAAwB,CAAC,CAAC,SAAS,EAAE,CAAC;KACnE;AAEM,IAAA,gBAAgB,CACrB,QAAgB,EAChB,SAAiB,EACjB,QAAiB,EAAA;QAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,MAAM;AACT,YAAA,CAAA,iBAAA,EAAoB,QAAQ,CAAI,CAAA,EAAA,SAAS,aAAa,QAAQ,CAAA,CAAE,CACnE,CAAC;KACH;AAEM,IAAA,0BAA0B,CAC/B,QAAgB,EAChB,UAAoB,EACpB,QAAiB,EAAA;QAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACzD;IAEM,iBAAiB,CAAC,GAAgB,EAAE,QAAiB,EAAA;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACzD;IAEM,gBAAgB,CAAC,QAAgB,EAAE,MAAyB,EAAA;AACjE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAG,EAAA,IAAI,CAAC,MAAM,oBAAoB,QAAQ,CAAA,CAAE,EAC5C,MAAM,CACP,CAAC;KACH;AAEM,IAAA,iBAAiB,CAAC,OAA4B,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,iBAAA,CAAmB,EAAE,OAAO,CAAC,CAAC;KACzE;IAEO,yBAAyB,CAAC,GAAW,EAAE,QAAiB,EAAA;AAC9D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAG,EAAA,IAAI,CAAC,MAAM,yBAAyB,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,CAClE,CAAC;KACH;AAEO,IAAA,mBAAmB,CACzB,gBAAgC,EAChC,cAAc,GAAG,KAAK,EAAA;QAEtB,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,QAAA,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/D,YAAA,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;AAChC,oBAAA,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;oBAC3B,YAAY,GAAG,IAAI,CAAC;AACrB,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,gBAAA,OACE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;oBAC7B,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EACjD;AACA,oBAAA,CAAC,EAAE,CAAC;AACL,iBAAA;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,YAAY,GAAG,IAAI,CAAC;AACpB,gBAAA,IAAI,cAAc,EAAE;AAClB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,iBAAA;AACF,aAAA;AACF,SAAA;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACvD,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAChC,IACE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG;AAC1C,gBAAA,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAC5C;gBACA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChC,YAAY,GAAG,IAAI,CAAC;AACrB,aAAA;AACF,SAAA;AAED,QAAA,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3B,SAAA;KACF;IAEO,aAAa,GAAA;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;KAChE;IAEO,eAAe,GAAA;QACrB,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACtE,YAAA,IAAI,GAAG,EAAE;gBACP,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;AACxD,gBAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;;AAEtD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAChC,aAAA;AACF,SAAA;QAAC,MAAM;;AAEP,SAAA;KACF;IAEO,uBAAuB,CAC7B,EAAU,EACV,SAAgC,EAAA;QAEhC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,SAAS,EAAE;;YAE1D,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;gBACvC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;AAC5C,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,iBAAA;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/D,gBAAA,IAAI,QAAQ,EAAE;AACZ,oBAAA,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC5B,iBAAA;AAAM,qBAAA;oBACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,iBAAA;gBACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC5B,aAAC,CAAC,CAAC;AACJ,SAAA;aAAM,IAAI,SAAS,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,OAAO,EAAE,CAAC;AAChB,SAAA;KACF;AAEO,IAAA,iBAAiB,CAAC,EAAU,EAAA;AAClC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3B,SAAA;KACF;IAEO,kBAAkB,CAAC,YAAY,GAAG,IAAI,EAAA;AAC5C,QAAA,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;AACtB,SAAA;AACD,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;KAClC;AAEO,IAAA,wBAAwB,CAAC,kBAAsC,EAAA;QACrE,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AAClD,SAAA;QAED,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,iBAAiB,GAAsB;AAC3C,YAAA,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACV,YAAA,IAAI,EAAE,GAAG,CAAC,CAAC,CAAqB;AAChC,YAAA,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC;AAEF,QAAA,MAAM,2BAA2B,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,2BAA2B,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;AAChE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7C,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,CAAC,KAAK,CACX,wDAAwD,kBAAkB,CAAA,EAAA,CAAI,CAC/E,CAAC;AACH,SAAA;KACF;AAEO,IAAA,2BAA2B,CAAC,EAAU,EAAA;QAC5C,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAC5D,iBAAiB,CAAC,yBAAyB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;gBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;oBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;AAChD,oBAAA,OAAO,IAAI,CAAC,cAAc,KAAK,EAAE,CAAC;AACpC,iBAAC,CAAC,CAAC;;;gBAIH,iBAAiB,CAAC,4BAA4B,CAAC;AAC7C,oBAAA,aAAa,EAAE,QAAQ;AACxB,iBAAA,CAAC,CAAC;AACL,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;;AAEpC,SAAA;KACF;AAEO,IAAA,0BAA0B,CAChC,gBAAwC,EAAA;AAExC,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK;AAC7B,cAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI;AAC5B,cAAE,gBAAgB,CAAC,IAAI,CAAC;KAC3B;AAEO,IAAA,MAAM,uBAAuB,GAAA;QACnC,MAAM,iBAAiB,CAAC,WAAW,CAAC,0BAA0B,EAAE,CAAC,CAAC,KAAI;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CACT,wDAAwD;AACtD,gBAAA,IAAI,CAAC,SAAS,EAChB,CAAC,CACF,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACpE,SAAC,CAAC,CAAC;QAEH,MAAM,iBAAiB,CAAC,WAAW,CACjC,iCAAiC,EACjC,CAAC,CAAC,KAAI;YACJ,IAAI,MAAM,GAAI,CAAS,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7D,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;gBAC5B,MAAM,GAAI,CAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC/D,aAAA;AACD,YAAA,OAAO,CAAC,GAAG,CACT,wDAAwD,EACxD,MAAM,CACP,CAAC;AACF,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACxC,SAAC,CACF,CAAC;KACH;IAEO,qBAAqB,GAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACnC,YAAA,MAAM,IAAI,GAAiB,CAAS,CAAC,IAAI,CAAC;YAC1C,OAAO,CAAC,GAAG,CACT,iDAAiD,GAAG,IAAI,CAAC,SAAS,EAClE,CAAC,CACF,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACpE,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAClD,YAAA,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,MAAM,CACP,CAAC;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;AACpC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;AACrC,SAAC,CAAC,CAAC;KACJ;IAEO,mBAAmB,GAAA;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAI;AACvC,YAAA,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAChD,IAAI,CAAC,sBAAsB,CAClB,CAAC;YACZ,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;;gBAE5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAC5C,cAAc,EACd,CAAC,KAAK,KAAI;oBACR,QAAQ,CAAC,MAAM,EAAE,CAAC;AAClB,oBAAA,QAAQ,CAAC;AACP,wBAAA,EAAE,EAAE,cAAc;wBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,IAAI,CAAC,SAAS;AACzB,qBAAA,CAAC,CAAC;AACL,iBAAC,CACF,CAAC;AACF,gBAAA,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KACvC,OAAO,CAAC,uCAAuC,GAAG,KAAK,CAAC,CACzD,CAAC;AACH,aAAA;AAAM,iBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;;AAEnC,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAC,SAAS,CAClE,CAAC,GAAG,KAAI;AACN,oBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAI;wBAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AAChD,wBAAA,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9D,qBAAC,CAAC,CAAC;iBACJ,EACD,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAC1B,CAAC;AACH,aAAA;AAAM,iBAAA;gBACL,OAAO,CAAC,CAAkD,gDAAA,CAAA,CAAC,CAAC;AAC7D,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,sBAAsB,CAAC,SAAiB,EAAA;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAI;YACvC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAChC,CAAC,YAAY,KAAI;gBACf,IAAI,YAAY,IAAI,IAAI,EAAE;oBACxB,QAAQ,CAAC,YAAY,CAAC,CAAC;AACxB,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,MAAM;AACR,yBAAA,mBAAmB,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;yBACnD,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;yBACxB,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,iBAAA;AACH,aAAC,EACD,CAAC,KAAK,KAAI;AACR,gBAAA,OAAO,CAAC,KAAK,CACX,yDAAyD,EACzD,KAAK,CACN,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,aAAC,CACF,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;+GA3dU,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,0BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCnBY,0BAA0B,CAAA;IACrC,OAAO,OAAO,CACZ,MAAkC,EAAA;QAElC,OAAO;AACL,YAAA,QAAQ,EAAE,0BAA0B;YACpC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;SACvE,CAAC;KACH;+GARU,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAA1B,0BAA0B,EAAA,CAAA,CAAA,EAAA;gHAA1B,0BAA0B,EAAA,CAAA,CAAA,EAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA,CAAA;;;ACPD;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kolektor/nucleus-notifications",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.139",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^16.2.0",
|
|
6
6
|
"@angular/core": "^16.2.0",
|
|
7
7
|
"@angular/service-worker": "^16.2.0",
|
|
8
|
-
"@kolektor/nucleus-common": "
|
|
8
|
+
"@kolektor/nucleus-common": "0.1.x",
|
|
9
9
|
"@capacitor/push-notifications": "^5.0.0",
|
|
10
10
|
"rxjs": "~7.8.0"
|
|
11
11
|
},
|