ionic-logging-service 16.0.0 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/esm2022/lib/ajax-appender.model.mjs +149 -0
- package/esm2022/lib/local-storage-appender.model.mjs +177 -0
- package/esm2022/lib/log-level.converter.mjs +92 -0
- package/esm2022/lib/logger.model.mjs +191 -0
- package/{esm2020 → esm2022}/lib/logging-service.module.mjs +5 -5
- package/esm2022/lib/logging.service.mjs +167 -0
- package/esm2022/lib/memory-appender.model.mjs +133 -0
- package/{fesm2015 → fesm2022}/ionic-logging-service.mjs +15 -15
- package/{fesm2020 → fesm2022}/ionic-logging-service.mjs.map +1 -1
- package/package.json +7 -13
- package/esm2020/lib/ajax-appender.model.mjs +0 -149
- package/esm2020/lib/local-storage-appender.model.mjs +0 -177
- package/esm2020/lib/log-level.converter.mjs +0 -92
- package/esm2020/lib/logger.model.mjs +0 -191
- package/esm2020/lib/logging.service.mjs +0 -167
- package/esm2020/lib/memory-appender.model.mjs +0 -133
- package/fesm2015/ionic-logging-service.mjs.map +0 -1
- package/fesm2020/ionic-logging-service.mjs +0 -992
- /package/{esm2020 → esm2022}/ionic-logging-service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/ajax-appender.configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/browser-console-appender.configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/json-layout.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/local-storage-appender.configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/log-level.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/log-message.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/logging-service.configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/memory-appender.configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
package/README.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# ionic-logging-service
|
|
2
2
|
|
|
3
|
-
**The dependencies used by the latest version are the same as needed for [Ionic
|
|
3
|
+
**The dependencies used by the latest version are the same as needed for [Ionic 7.0.0](https://github.com/ionic-team/ionic/blob/master/CHANGELOG.md). For older versions use:**
|
|
4
4
|
|
|
5
5
|
| ionic-logging-service | Ionic | Angular
|
|
6
6
|
| ------ | -------- | ------
|
|
7
|
+
| 18.0.0 | >= 7.0.0 | >=17.0.0
|
|
8
|
+
| 17.0.0 | >= 6.1.9 | ^16.0.0
|
|
7
9
|
| 16.0.0 | >= 6.1.9 | ^15.0.0
|
|
8
10
|
| 15.0.0 | >= 6.1.9 | ^14.0.0
|
|
9
11
|
| 14.0.0 | >= 6.0.0 | ^13.0.0
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { EventEmitter } from "@angular/core";
|
|
2
|
+
import * as log4javascript from "log4javascript";
|
|
3
|
+
import { JsonLayout } from "./json-layout.model";
|
|
4
|
+
import { LogLevelConverter } from "./log-level.converter";
|
|
5
|
+
/**
|
|
6
|
+
* An appender which sends the log messages to a server via HTTP.
|
|
7
|
+
*
|
|
8
|
+
* A typical configuration could be:
|
|
9
|
+
*
|
|
10
|
+
* ```json
|
|
11
|
+
* {
|
|
12
|
+
* "url": "https://my.backend.xy/LoggingBackend",
|
|
13
|
+
* "batchSize": 10,
|
|
14
|
+
* "timerInterval": 60000,
|
|
15
|
+
* "threshold": "INFO"
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export class AjaxAppender extends log4javascript.Appender {
|
|
20
|
+
static { this.batchSizeDefault = 1; }
|
|
21
|
+
static { this.timerIntervalDefault = 0; }
|
|
22
|
+
static { this.thresholdDefault = "WARN"; }
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new instance of the appender.
|
|
25
|
+
*
|
|
26
|
+
* @param configuration configuration for the appender.
|
|
27
|
+
*/
|
|
28
|
+
constructor(configuration) {
|
|
29
|
+
super();
|
|
30
|
+
if (!configuration) {
|
|
31
|
+
throw new Error("configuration must be not empty");
|
|
32
|
+
}
|
|
33
|
+
if (!configuration.url) {
|
|
34
|
+
throw new Error("url must be not empty");
|
|
35
|
+
}
|
|
36
|
+
this.ajaxAppender = new log4javascript.AjaxAppender(configuration.url, configuration.withCredentials);
|
|
37
|
+
this.url = configuration.url;
|
|
38
|
+
this.withCredentials = configuration.withCredentials;
|
|
39
|
+
this.ajaxAppender.setLayout(new JsonLayout(false, false));
|
|
40
|
+
this.ajaxAppender.addHeader("Content-Type", "application/json; charset=utf-8");
|
|
41
|
+
this.ajaxAppender.setSendAllOnUnload(true);
|
|
42
|
+
this.appenderFailed = new EventEmitter();
|
|
43
|
+
this.ajaxAppender.setFailCallback((message) => {
|
|
44
|
+
this.appenderFailed.emit(message);
|
|
45
|
+
});
|
|
46
|
+
// process remaining configuration
|
|
47
|
+
this.configure({
|
|
48
|
+
batchSize: configuration.batchSize || AjaxAppender.batchSizeDefault,
|
|
49
|
+
threshold: configuration.threshold || AjaxAppender.thresholdDefault,
|
|
50
|
+
timerInterval: configuration.timerInterval || AjaxAppender.timerIntervalDefault,
|
|
51
|
+
url: configuration.url,
|
|
52
|
+
withCredentials: configuration.withCredentials
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Configures the logging depending on the given configuration.
|
|
57
|
+
*
|
|
58
|
+
* Only the defined properties get overwritten.
|
|
59
|
+
* Neither url nor withCredentials can be modified.
|
|
60
|
+
*
|
|
61
|
+
* @param configuration configuration data.
|
|
62
|
+
*/
|
|
63
|
+
configure(configuration) {
|
|
64
|
+
if (configuration) {
|
|
65
|
+
if (configuration.url && configuration.url !== this.url) {
|
|
66
|
+
throw new Error("url must not be changed");
|
|
67
|
+
}
|
|
68
|
+
if (configuration.withCredentials && configuration.withCredentials !== this.withCredentials) {
|
|
69
|
+
throw new Error("withCredentials must not be changed");
|
|
70
|
+
}
|
|
71
|
+
if (configuration.batchSize) {
|
|
72
|
+
this.setBatchSize(configuration.batchSize);
|
|
73
|
+
}
|
|
74
|
+
if (typeof configuration.timerInterval === "number") {
|
|
75
|
+
this.setTimerInterval(configuration.timerInterval);
|
|
76
|
+
}
|
|
77
|
+
if (configuration.threshold) {
|
|
78
|
+
const convertedThreshold = LogLevelConverter.levelToLog4Javascript(LogLevelConverter.levelFromString(configuration.threshold));
|
|
79
|
+
this.setThreshold(convertedThreshold);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Appender-specific method to append a log message.
|
|
85
|
+
*
|
|
86
|
+
* @param loggingEvent event to be appended.
|
|
87
|
+
*/
|
|
88
|
+
append(loggingEvent) {
|
|
89
|
+
this.ajaxAppender.append(loggingEvent);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Gets the appender's name.
|
|
93
|
+
* Mainly for unit testing purposes.
|
|
94
|
+
*
|
|
95
|
+
* @return appender's name
|
|
96
|
+
*/
|
|
97
|
+
toString() {
|
|
98
|
+
return "Ionic.Logging.AjaxAppender";
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the internally used appender.
|
|
102
|
+
* Mainly for unit testing purposes.
|
|
103
|
+
*/
|
|
104
|
+
getInternalAppender() {
|
|
105
|
+
return this.ajaxAppender;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Returns the number of log messages sent in each request.
|
|
109
|
+
*/
|
|
110
|
+
getBatchSize() {
|
|
111
|
+
return this.ajaxAppender.getBatchSize();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Sets the number of log messages to send in each request.
|
|
115
|
+
*
|
|
116
|
+
* @param batchSize new batch size
|
|
117
|
+
*/
|
|
118
|
+
setBatchSize(batchSize) {
|
|
119
|
+
this.ajaxAppender.setBatchSize(batchSize);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Returns the appender's layout.
|
|
123
|
+
*/
|
|
124
|
+
getLayout() {
|
|
125
|
+
return this.ajaxAppender.getLayout();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Sets the appender's layout.
|
|
129
|
+
*/
|
|
130
|
+
setLayout(layout) {
|
|
131
|
+
this.ajaxAppender.setLayout(layout);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns the length of time in milliseconds between each sending of queued log messages.
|
|
135
|
+
*/
|
|
136
|
+
getTimerInterval() {
|
|
137
|
+
return this.ajaxAppender.getTimerInterval();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Sets the length of time in milliseconds between each sending of queued log messages.
|
|
141
|
+
*
|
|
142
|
+
* @param timerInterval new timer interval
|
|
143
|
+
*/
|
|
144
|
+
setTimerInterval(timerInterval) {
|
|
145
|
+
this.ajaxAppender.setTimed(timerInterval > 0);
|
|
146
|
+
this.ajaxAppender.setTimerInterval(timerInterval);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC1hcHBlbmRlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWxvZ2dpbmctc2VydmljZS9zcmMvbGliL2FqYXgtYXBwZW5kZXIubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEtBQUssY0FBYyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxjQUFjLENBQUMsUUFBUTthQUV6QyxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7YUFDckIseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQztJQWF6Qzs7OztPQUlHO0lBQ0gsWUFBWSxhQUF3QztRQUNuRCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFD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RDs7T0FFRztJQUNJLFNBQVM7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE1BQTZCO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLGFBQXFCO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgKiBhcyBsb2c0amF2YXNjcmlwdCBmcm9tIFwibG9nNGphdmFzY3JpcHRcIjtcblxuaW1wb3J0IHsgQWpheEFwcGVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2FqYXgtYXBwZW5kZXIuY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgSnNvbkxheW91dCB9IGZyb20gXCIuL2pzb24tbGF5b3V0Lm1vZGVsXCI7XG5pbXBvcnQgeyBMb2dMZXZlbENvbnZlcnRlciB9IGZyb20gXCIuL2xvZy1sZXZlbC5jb252ZXJ0ZXJcIjtcblxuLyoqXG4gKiBBbiBhcHBlbmRlciB3aGljaCBzZW5kcyB0aGUgbG9nIG1lc3NhZ2VzIHRvIGEgc2VydmVyIHZpYSBIVFRQLlxuICpcbiAqIEEgdHlwaWNhbCBjb25maWd1cmF0aW9uIGNvdWxkIGJlOlxuICpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJ1cmxcIjogXCJodHRwczovL215LmJhY2tlbmQueHkvTG9nZ2luZ0JhY2tlbmRcIixcbiAqICAgXCJiYXRjaFNpemVcIjogMTAsXG4gKiAgIFwidGltZXJJbnRlcnZhbFwiOiA2MDAwMCxcbiAqICAgXCJ0aHJlc2hvbGRcIjogXCJJTkZPXCJcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWpheEFwcGVuZGVyIGV4dGVuZHMgbG9nNGphdmFzY3JpcHQuQXBwZW5kZXIge1xuXG5cdHByaXZhdGUgc3RhdGljIGJhdGNoU2l6ZURlZmF1bHQgPSAxO1xuXHRwcml2YXRlIHN0YXRpYyB0aW1lckludGVydmFsRGVmYXVsdCA9IDA7XG5cdHByaXZhdGUgc3RhdGljIHRocmVzaG9sZERlZmF1bHQgPSBcIldBUk5cIjtcblxuXHQvKipcblx0ICogRXZlbnQgdHJpZ2dlcmVkIHdoZW4gdGhlIGFwcGVuZGVyIGNvdWxkIG5vdCBzZW5kIGxvZyBtZXNzYWdlcyB0byB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kZXJGYWlsZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+O1xuXG5cdHByaXZhdGUgYWpheEFwcGVuZGVyOiBsb2c0amF2YXNjcmlwdC5BamF4QXBwZW5kZXI7XG5cdHByaXZhdGUgdXJsOiBzdHJpbmc7XG5cdHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHBlbmRlci5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGVuZGVyLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogQWpheEFwcGVuZGVyQ29uZmlndXJhdGlvbikge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAoIWNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBub3QgZW1wdHlcIik7XG5cdFx0fVxuXHRcdGlmICghY29uZmlndXJhdGlvbi51cmwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInVybCBtdXN0IGJlIG5vdCBlbXB0eVwiKTtcblx0XHR9XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIgPSBuZXcgbG9nNGphdmFzY3JpcHQuQWpheEFwcGVuZGVyKGNvbmZpZ3VyYXRpb24udXJsLCBjb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyk7XG5cdFx0dGhpcy51cmwgPSBjb25maWd1cmF0aW9uLnVybDtcblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0TGF5b3V0KG5ldyBKc29uTGF5b3V0KGZhbHNlLCBmYWxzZSkpO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLmFkZEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0U2VuZEFsbE9uVW5sb2FkKHRydWUpO1xuXG5cdFx0dGhpcy5hcHBlbmRlckZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLnNldEZhaWxDYWxsYmFjaygobWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHR0aGlzLmFwcGVuZGVyRmFpbGVkLmVtaXQobWVzc2FnZSk7XG5cdFx0fSk7XG5cblx0XHQvLyBwcm9jZXNzIHJlbWFpbmluZyBjb25maWd1cmF0aW9uXG5cdFx0dGhpcy5jb25maWd1cmUoe1xuXHRcdFx0YmF0Y2hTaXplOiBjb25maWd1cmF0aW9uLmJhdGNoU2l6ZSB8fCBBamF4QXBwZW5kZXIuYmF0Y2hTaXplRGVmYXVsdCxcblx0XHRcdHRocmVzaG9sZDogY29uZmlndXJhdGlvbi50aHJlc2hvbGQgfHwgQWpheEFwcGVuZGVyLnRocmVzaG9sZERlZmF1bHQsXG5cdFx0XHR0aW1lckludGVydmFsOiBjb25maWd1cmF0aW9uLnRpbWVySW50ZXJ2YWwgfHwgQWpheEFwcGVuZGVyLnRpbWVySW50ZXJ2YWxEZWZhdWx0LFxuXHRcdFx0dXJsOiBjb25maWd1cmF0aW9uLnVybCxcblx0XHRcdHdpdGhDcmVkZW50aWFsczogY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHNcblx0XHR9KTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGxvZ2dpbmcgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuXHQgKlxuXHQgKiBPbmx5IHRoZSBkZWZpbmVkIHByb3BlcnRpZXMgZ2V0IG92ZXJ3cml0dGVuLlxuXHQgKiBOZWl0aGVyIHVybCBub3Igd2l0aENyZWRlbnRpYWxzIGNhbiBiZSBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvbmZpZ3VyZShjb25maWd1cmF0aW9uOiBBamF4QXBwZW5kZXJDb25maWd1cmF0aW9uKTogdm9pZCB7XG5cdFx0aWYgKGNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGlmIChjb25maWd1cmF0aW9uLnVybCAmJiBjb25maWd1cmF0aW9uLnVybCAhPT0gdGhpcy51cmwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidXJsIG11c3Qgbm90IGJlIGNoYW5nZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMgJiYgY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMgIT09IHRoaXMud2l0aENyZWRlbnRpYWxzKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIndpdGhDcmVkZW50aWFscyBtdXN0IG5vdCBiZSBjaGFuZ2VkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24uYmF0Y2hTaXplKSB7XG5cdFx0XHRcdHRoaXMuc2V0QmF0Y2hTaXplKGNvbmZpZ3VyYXRpb24uYmF0Y2hTaXplKTtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgY29uZmlndXJhdGlvbi50aW1lckludGVydmFsID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdHRoaXMuc2V0VGltZXJJbnRlcnZhbChjb25maWd1cmF0aW9uLnRpbWVySW50ZXJ2YWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24udGhyZXNob2xkKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFRocmVzaG9sZCA9IExvZ0xldmVsQ29udmVydGVyLmxldmVsVG9Mb2c0SmF2YXNjcmlwdChcblx0XHRcdFx0XHRMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21TdHJpbmcoY29uZmlndXJhdGlvbi50aHJlc2hvbGQpKTtcblx0XHRcdFx0dGhpcy5zZXRUaHJlc2hvbGQoY29udmVydGVkVGhyZXNob2xkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kZXItc3BlY2lmaWMgbWV0aG9kIHRvIGFwcGVuZCBhIGxvZyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9nZ2luZ0V2ZW50IGV2ZW50IHRvIGJlIGFwcGVuZGVkLlxuXHQgKi9cblx0cHVibGljIGFwcGVuZChsb2dnaW5nRXZlbnQ6IGxvZzRqYXZhc2NyaXB0LkxvZ2dpbmdFdmVudCk6IHZvaWQge1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLmFwcGVuZChsb2dnaW5nRXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGVuZGVyJ3MgbmFtZS5cblx0ICogTWFpbmx5IGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4gYXBwZW5kZXIncyBuYW1lXG5cdCAqL1xuXHRwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gXCJJb25pYy5Mb2dnaW5nLkFqYXhBcHBlbmRlclwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgaW50ZXJuYWxseSB1c2VkIGFwcGVuZGVyLlxuXHQgKiBNYWlubHkgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3Nlcy5cblx0ICovXG5cdHB1YmxpYyBnZXRJbnRlcm5hbEFwcGVuZGVyKCk6IGxvZzRqYXZhc2NyaXB0LkFqYXhBcHBlbmRlciB7XG5cdFx0cmV0dXJuIHRoaXMuYWpheEFwcGVuZGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsb2cgbWVzc2FnZXMgc2VudCBpbiBlYWNoIHJlcXVlc3QuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QmF0Y2hTaXplKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYWpheEFwcGVuZGVyLmdldEJhdGNoU2l6ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG51bWJlciBvZiBsb2cgbWVzc2FnZXMgdG8gc2VuZCBpbiBlYWNoIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiYXRjaFNpemUgbmV3IGJhdGNoIHNpemVcblx0ICovXG5cdHB1YmxpYyBzZXRCYXRjaFNpemUoYmF0Y2hTaXplOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLmFqYXhBcHBlbmRlci5zZXRCYXRjaFNpemUoYmF0Y2hTaXplKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhcHBlbmRlcidzIGxheW91dC5cblx0ICovXG5cdHB1YmxpYyBnZXRMYXlvdXQoKTogbG9nNGphdmFzY3JpcHQuTGF5b3V0IHtcblx0XHRyZXR1cm4gdGhpcy5hamF4QXBwZW5kZXIuZ2V0TGF5b3V0KCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYXBwZW5kZXIncyBsYXlvdXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0TGF5b3V0KGxheW91dDogbG9nNGphdmFzY3JpcHQuTGF5b3V0KTogdm9pZCB7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0TGF5b3V0KGxheW91dCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBzZW5kaW5nIG9mIHF1ZXVlZCBsb2cgbWVzc2FnZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGltZXJJbnRlcnZhbCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmFqYXhBcHBlbmRlci5nZXRUaW1lckludGVydmFsKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBzZW5kaW5nIG9mIHF1ZXVlZCBsb2cgbWVzc2FnZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB0aW1lckludGVydmFsIG5ldyB0aW1lciBpbnRlcnZhbFxuXHQgKi9cblx0cHVibGljIHNldFRpbWVySW50ZXJ2YWwodGltZXJJbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0VGltZWQodGltZXJJbnRlcnZhbCA+IDApO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLnNldFRpbWVySW50ZXJ2YWwodGltZXJJbnRlcnZhbCk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import * as log4javascript from "log4javascript";
|
|
2
|
+
import { LogLevelConverter } from "./log-level.converter";
|
|
3
|
+
import { LogLevel } from "./log-level.model";
|
|
4
|
+
/**
|
|
5
|
+
* An appender which stores the log messages in the browser's local storage.
|
|
6
|
+
*
|
|
7
|
+
* The messages are saved JSON-serialized.
|
|
8
|
+
* You have to configure which key is used for storing the messages.
|
|
9
|
+
*
|
|
10
|
+
* A typical configuration could be:
|
|
11
|
+
*
|
|
12
|
+
* ```json
|
|
13
|
+
* {
|
|
14
|
+
* "localStorageKey": "myLogs",
|
|
15
|
+
* "maxMessages": 500,
|
|
16
|
+
* "threshold": "INFO"
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class LocalStorageAppender extends log4javascript.Appender {
|
|
21
|
+
static { this.maxMessagesDefault = 250; }
|
|
22
|
+
static { this.thresholdDefault = "WARN"; }
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new instance of the appender.
|
|
25
|
+
*
|
|
26
|
+
* @param configuration configuration for the appender.
|
|
27
|
+
*/
|
|
28
|
+
constructor(configuration) {
|
|
29
|
+
super();
|
|
30
|
+
if (!configuration) {
|
|
31
|
+
throw new Error("configuration must be not empty");
|
|
32
|
+
}
|
|
33
|
+
if (!configuration.localStorageKey || configuration.localStorageKey === "") {
|
|
34
|
+
throw new Error("localStorageKey must be not empty");
|
|
35
|
+
}
|
|
36
|
+
this.localStorageKey = configuration.localStorageKey;
|
|
37
|
+
// read existing logMessages
|
|
38
|
+
this.logMessages = LocalStorageAppender.loadLogMessages(this.localStorageKey);
|
|
39
|
+
// process remaining configuration
|
|
40
|
+
this.configure({
|
|
41
|
+
localStorageKey: configuration.localStorageKey,
|
|
42
|
+
maxMessages: configuration.maxMessages || LocalStorageAppender.maxMessagesDefault,
|
|
43
|
+
threshold: configuration.threshold || LocalStorageAppender.thresholdDefault,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load log messages from local storage which are stored there under the given key.
|
|
48
|
+
*
|
|
49
|
+
* @param localStorageKey local storage key
|
|
50
|
+
* @return stored messages
|
|
51
|
+
*/
|
|
52
|
+
static loadLogMessages(localStorageKey) {
|
|
53
|
+
let logMessages;
|
|
54
|
+
if (!localStorageKey || localStorage.getItem(localStorageKey) === null) {
|
|
55
|
+
logMessages = [];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
logMessages = JSON.parse(localStorage.getItem(localStorageKey));
|
|
59
|
+
for (const logMessage of logMessages) {
|
|
60
|
+
// timestamps are serialized as strings
|
|
61
|
+
logMessage.timeStamp = new Date(logMessage.timeStamp);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return logMessages;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Remove log messages from local storage which are stored there under the given key.
|
|
68
|
+
*
|
|
69
|
+
* @param localStorageKey local storage key
|
|
70
|
+
*/
|
|
71
|
+
static removeLogMessages(localStorageKey) {
|
|
72
|
+
localStorage.removeItem(localStorageKey);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Configures the logging depending on the given configuration.
|
|
76
|
+
*
|
|
77
|
+
* Only the defined properties get overwritten.
|
|
78
|
+
* The localStorageKey cannot be modified.
|
|
79
|
+
*
|
|
80
|
+
* @param configuration configuration data.
|
|
81
|
+
*/
|
|
82
|
+
configure(configuration) {
|
|
83
|
+
if (configuration) {
|
|
84
|
+
if (configuration.localStorageKey && configuration.localStorageKey !== this.localStorageKey) {
|
|
85
|
+
throw new Error("localStorageKey must not be changed");
|
|
86
|
+
}
|
|
87
|
+
if (configuration.maxMessages) {
|
|
88
|
+
this.setMaxMessages(configuration.maxMessages);
|
|
89
|
+
}
|
|
90
|
+
if (configuration.threshold) {
|
|
91
|
+
const convertedThreshold = LogLevelConverter.levelToLog4Javascript(LogLevelConverter.levelFromString(configuration.threshold));
|
|
92
|
+
this.setThreshold(convertedThreshold);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Appender-specific method to append a log message.
|
|
98
|
+
*
|
|
99
|
+
* @param loggingEvent event to be appended.
|
|
100
|
+
*/
|
|
101
|
+
append(loggingEvent) {
|
|
102
|
+
// if logMessages is already full, remove oldest element
|
|
103
|
+
while (this.logMessages.length >= this.maxMessages) {
|
|
104
|
+
this.logMessages.shift();
|
|
105
|
+
}
|
|
106
|
+
// add event to logMessages
|
|
107
|
+
const message = {
|
|
108
|
+
level: LogLevel[LogLevelConverter.levelFromLog4Javascript(loggingEvent.level)],
|
|
109
|
+
logger: typeof loggingEvent.logger !== "undefined" ? loggingEvent.logger.name : undefined,
|
|
110
|
+
message: loggingEvent.messages.slice(1),
|
|
111
|
+
methodName: loggingEvent.messages[0],
|
|
112
|
+
timeStamp: loggingEvent.timeStamp,
|
|
113
|
+
};
|
|
114
|
+
this.logMessages.push(message);
|
|
115
|
+
// write values to localStorage
|
|
116
|
+
localStorage.setItem(this.localStorageKey, JSON.stringify(this.logMessages));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Gets the appender's name.
|
|
120
|
+
* Mainly for unit testing purposes.
|
|
121
|
+
*
|
|
122
|
+
* @return appender's name
|
|
123
|
+
*/
|
|
124
|
+
toString() {
|
|
125
|
+
return "Ionic.Logging.LocalStorageAppender";
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the key which is used to store the messages in the local storage.
|
|
129
|
+
*/
|
|
130
|
+
getLocalStorageKey() {
|
|
131
|
+
return this.localStorageKey;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get the maximum number of messages which will be stored in local storage.
|
|
135
|
+
*/
|
|
136
|
+
getMaxMessages() {
|
|
137
|
+
return this.maxMessages;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Set the maximum number of messages which will be stored in local storage.
|
|
141
|
+
*
|
|
142
|
+
* If the appender stores currently more messages than the new value allows, the oldest messages get removed.
|
|
143
|
+
*
|
|
144
|
+
* @param value new maximum number
|
|
145
|
+
*/
|
|
146
|
+
setMaxMessages(value) {
|
|
147
|
+
if (this.maxMessages !== value) {
|
|
148
|
+
this.maxMessages = value;
|
|
149
|
+
if (this.logMessages.length > this.maxMessages) {
|
|
150
|
+
// there are too much logMessages for the new value, therefore remove oldest messages
|
|
151
|
+
while (this.logMessages.length > this.maxMessages) {
|
|
152
|
+
this.logMessages.shift();
|
|
153
|
+
}
|
|
154
|
+
// write values to localStorage
|
|
155
|
+
localStorage.setItem(this.localStorageKey, JSON.stringify(this.logMessages));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Gets all messages stored in local storage.
|
|
161
|
+
* Mainly for unit testing purposes.
|
|
162
|
+
*
|
|
163
|
+
* @return stored messages
|
|
164
|
+
*/
|
|
165
|
+
getLogMessages() {
|
|
166
|
+
return this.logMessages;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Removes all messages from local storage.
|
|
170
|
+
* Mainly for unit testing purposes.
|
|
171
|
+
*/
|
|
172
|
+
clearLog() {
|
|
173
|
+
this.logMessages = [];
|
|
174
|
+
localStorage.removeItem(this.localStorageKey);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS1hcHBlbmRlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWxvZ2dpbmctc2VydmljZS9zcmMvbGliL2xvY2FsLXN0b3JhZ2UtYXBwZW5kZXIubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHN0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGNBQWMsQ0FBQyxRQUFRO2FBRWpELHVCQUFrQixHQUFHLEdBQUcsQ0FBQzthQUN6QixxQkFBZ0IsR0FBRyxNQUFNLENBQUM7SUFPekM7Ozs7T0FJRztJQUNILFlBQVksYUFBZ0Q7UUFDM0QsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsSUFBSSxhQUFhLENBQUMsZUFBZSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDO1FBRXJELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFOUUsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDZCxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7WUFD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cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9nNGphdmFzY3JpcHQgZnJvbSBcImxvZzRqYXZhc2NyaXB0XCI7XG5cbmltcG9ydCB7IExvY2FsU3RvcmFnZUFwcGVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2xvY2FsLXN0b3JhZ2UtYXBwZW5kZXIuY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgTG9nTGV2ZWxDb252ZXJ0ZXIgfSBmcm9tIFwiLi9sb2ctbGV2ZWwuY29udmVydGVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZy1sZXZlbC5tb2RlbFwiO1xuaW1wb3J0IHsgTG9nTWVzc2FnZSB9IGZyb20gXCIuL2xvZy1tZXNzYWdlLm1vZGVsXCI7XG5cbi8qKlxuICogQW4gYXBwZW5kZXIgd2hpY2ggc3RvcmVzIHRoZSBsb2cgbWVzc2FnZXMgaW4gdGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlLlxuICpcbiAqIFRoZSBtZXNzYWdlcyBhcmUgc2F2ZWQgSlNPTi1zZXJpYWxpemVkLlxuICogWW91IGhhdmUgdG8gY29uZmlndXJlIHdoaWNoIGtleSBpcyB1c2VkIGZvciBzdG9yaW5nIHRoZSBtZXNzYWdlcy5cbiAqXG4gKiBBIHR5cGljYWwgY29uZmlndXJhdGlvbiBjb3VsZCBiZTpcbiAqXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwibG9jYWxTdG9yYWdlS2V5XCI6IFwibXlMb2dzXCIsXG4gKiAgIFwibWF4TWVzc2FnZXNcIjogNTAwLFxuICogICBcInRocmVzaG9sZFwiOiBcIklORk9cIlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2VBcHBlbmRlciBleHRlbmRzIGxvZzRqYXZhc2NyaXB0LkFwcGVuZGVyIHtcblxuXHRwcml2YXRlIHN0YXRpYyBtYXhNZXNzYWdlc0RlZmF1bHQgPSAyNTA7XG5cdHByaXZhdGUgc3RhdGljIHRocmVzaG9sZERlZmF1bHQgPSBcIldBUk5cIjtcblxuXHRwcml2YXRlIG1heE1lc3NhZ2VzOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBsb2NhbFN0b3JhZ2VLZXk6IHN0cmluZztcblx0cHJpdmF0ZSBsb2dNZXNzYWdlczogTG9nTWVzc2FnZVtdO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHBlbmRlci5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGVuZGVyLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogTG9jYWxTdG9yYWdlQXBwZW5kZXJDb25maWd1cmF0aW9uKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGlmICghY29uZmlndXJhdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29uZmlndXJhdGlvbiBtdXN0IGJlIG5vdCBlbXB0eVwiKTtcblx0XHR9XG5cdFx0aWYgKCFjb25maWd1cmF0aW9uLmxvY2FsU3RvcmFnZUtleSB8fCBjb25maWd1cmF0aW9uLmxvY2FsU3RvcmFnZUtleSA9PT0gXCJcIikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibG9jYWxTdG9yYWdlS2V5IG11c3QgYmUgbm90IGVtcHR5XCIpO1xuXHRcdH1cblx0XHR0aGlzLmxvY2FsU3RvcmFnZUtleSA9IGNvbmZpZ3VyYXRpb24ubG9jYWxTdG9yYWdlS2V5O1xuXG5cdFx0Ly8gcmVhZCBleGlzdGluZyBsb2dNZXNzYWdlc1xuXHRcdHRoaXMubG9nTWVzc2FnZXMgPSBMb2NhbFN0b3JhZ2VBcHBlbmRlci5sb2FkTG9nTWVzc2FnZXModGhpcy5sb2NhbFN0b3JhZ2VLZXkpO1xuXG5cdFx0Ly8gcHJvY2VzcyByZW1haW5pbmcgY29uZmlndXJhdGlvblxuXHRcdHRoaXMuY29uZmlndXJlKHtcblx0XHRcdGxvY2FsU3RvcmFnZUtleTogY29uZmlndXJhdGlvbi5sb2NhbFN0b3JhZ2VLZXksXG5cdFx0XHRtYXhNZXNzYWdlczogY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcyB8fCBMb2NhbFN0b3JhZ2VBcHBlbmRlci5tYXhNZXNzYWdlc0RlZmF1bHQsXG5cdFx0XHR0aHJlc2hvbGQ6IGNvbmZpZ3VyYXRpb24udGhyZXNob2xkIHx8IExvY2FsU3RvcmFnZUFwcGVuZGVyLnRocmVzaG9sZERlZmF1bHQsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBsb2cgbWVzc2FnZXMgZnJvbSBsb2NhbCBzdG9yYWdlIHdoaWNoIGFyZSBzdG9yZWQgdGhlcmUgdW5kZXIgdGhlIGdpdmVuIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGxvY2FsU3RvcmFnZUtleSBsb2NhbCBzdG9yYWdlIGtleVxuXHQgKiBAcmV0dXJuIHN0b3JlZCBtZXNzYWdlc1xuXHQgKi9cblx0cHVibGljIHN0YXRpYyBsb2FkTG9nTWVzc2FnZXMobG9jYWxTdG9yYWdlS2V5OiBzdHJpbmcpOiBMb2dNZXNzYWdlW10ge1xuXHRcdGxldCBsb2dNZXNzYWdlczogTG9nTWVzc2FnZVtdO1xuXG5cdFx0aWYgKCFsb2NhbFN0b3JhZ2VLZXkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KSA9PT0gbnVsbCkge1xuXHRcdFx0bG9nTWVzc2FnZXMgPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bG9nTWVzc2FnZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSkpO1xuXHRcdFx0Zm9yIChjb25zdCBsb2dNZXNzYWdlIG9mIGxvZ01lc3NhZ2VzKSB7XG5cdFx0XHRcdC8vIHRpbWVzdGFtcHMgYXJlIHNlcmlhbGl6ZWQgYXMgc3RyaW5nc1xuXHRcdFx0XHRsb2dNZXNzYWdlLnRpbWVTdGFtcCA9IG5ldyBEYXRlKGxvZ01lc3NhZ2UudGltZVN0YW1wKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbG9nTWVzc2FnZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGxvZyBtZXNzYWdlcyBmcm9tIGxvY2FsIHN0b3JhZ2Ugd2hpY2ggYXJlIHN0b3JlZCB0aGVyZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9jYWxTdG9yYWdlS2V5IGxvY2FsIHN0b3JhZ2Uga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHJlbW92ZUxvZ01lc3NhZ2VzKGxvY2FsU3RvcmFnZUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obG9jYWxTdG9yYWdlS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25maWd1cmVzIHRoZSBsb2dnaW5nIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cblx0ICpcblx0ICogT25seSB0aGUgZGVmaW5lZCBwcm9wZXJ0aWVzIGdldCBvdmVyd3JpdHRlbi5cblx0ICogVGhlIGxvY2FsU3RvcmFnZUtleSBjYW5ub3QgYmUgbW9kaWZpZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gZGF0YS5cblx0ICovXG5cdHB1YmxpYyBjb25maWd1cmUoY29uZmlndXJhdGlvbjogTG9jYWxTdG9yYWdlQXBwZW5kZXJDb25maWd1cmF0aW9uKTogdm9pZCB7XG5cdFx0aWYgKGNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGlmIChjb25maWd1cmF0aW9uLmxvY2FsU3RvcmFnZUtleSAmJiBjb25maWd1cmF0aW9uLmxvY2FsU3RvcmFnZUtleSAhPT0gdGhpcy5sb2NhbFN0b3JhZ2VLZXkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibG9jYWxTdG9yYWdlS2V5IG11c3Qgbm90IGJlIGNoYW5nZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcykge1xuXHRcdFx0XHR0aGlzLnNldE1heE1lc3NhZ2VzKGNvbmZpZ3VyYXRpb24ubWF4TWVzc2FnZXMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24udGhyZXNob2xkKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFRocmVzaG9sZCA9IExvZ0xldmVsQ29udmVydGVyLmxldmVsVG9Mb2c0SmF2YXNjcmlwdChcblx0XHRcdFx0XHRMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21TdHJpbmcoY29uZmlndXJhdGlvbi50aHJlc2hvbGQpKTtcblx0XHRcdFx0dGhpcy5zZXRUaHJlc2hvbGQoY29udmVydGVkVGhyZXNob2xkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kZXItc3BlY2lmaWMgbWV0aG9kIHRvIGFwcGVuZCBhIGxvZyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9nZ2luZ0V2ZW50IGV2ZW50IHRvIGJlIGFwcGVuZGVkLlxuXHQgKi9cblx0cHVibGljIGFwcGVuZChsb2dnaW5nRXZlbnQ6IGxvZzRqYXZhc2NyaXB0LkxvZ2dpbmdFdmVudCk6IHZvaWQge1xuXHRcdC8vIGlmIGxvZ01lc3NhZ2VzIGlzIGFscmVhZHkgZnVsbCwgcmVtb3ZlIG9sZGVzdCBlbGVtZW50XG5cdFx0d2hpbGUgKHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoID49IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMuc2hpZnQoKTtcblx0XHR9XG5cdFx0Ly8gYWRkIGV2ZW50IHRvIGxvZ01lc3NhZ2VzXG5cdFx0Y29uc3QgbWVzc2FnZTogTG9nTWVzc2FnZSA9IHtcblx0XHRcdGxldmVsOiBMb2dMZXZlbFtMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21Mb2c0SmF2YXNjcmlwdChsb2dnaW5nRXZlbnQubGV2ZWwpXSxcblx0XHRcdGxvZ2dlcjogdHlwZW9mIGxvZ2dpbmdFdmVudC5sb2dnZXIgIT09IFwidW5kZWZpbmVkXCIgPyBsb2dnaW5nRXZlbnQubG9nZ2VyLm5hbWUgOiB1bmRlZmluZWQsXG5cdFx0XHRtZXNzYWdlOiBsb2dnaW5nRXZlbnQubWVzc2FnZXMuc2xpY2UoMSksXG5cdFx0XHRtZXRob2ROYW1lOiBsb2dnaW5nRXZlbnQubWVzc2FnZXNbMF0sXG5cdFx0XHR0aW1lU3RhbXA6IGxvZ2dpbmdFdmVudC50aW1lU3RhbXAsXG5cdFx0fTtcblx0XHR0aGlzLmxvZ01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cblx0XHQvLyB3cml0ZSB2YWx1ZXMgdG8gbG9jYWxTdG9yYWdlXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHRoaXMubG9nTWVzc2FnZXMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHBlbmRlcidzIG5hbWUuXG5cdCAqIE1haW5seSBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIGFwcGVuZGVyJ3MgbmFtZVxuXHQgKi9cblx0cHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwiSW9uaWMuTG9nZ2luZy5Mb2NhbFN0b3JhZ2VBcHBlbmRlclwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUga2V5IHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1lc3NhZ2VzIGluIHRoZSBsb2NhbCBzdG9yYWdlLlxuXHQgKi9cblx0cHVibGljIGdldExvY2FsU3RvcmFnZUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZUtleTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIGxvY2FsIHN0b3JhZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TWF4TWVzc2FnZXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhNZXNzYWdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIGxvY2FsIHN0b3JhZ2UuXG5cdCAqXG5cdCAqIElmIHRoZSBhcHBlbmRlciBzdG9yZXMgY3VycmVudGx5IG1vcmUgbWVzc2FnZXMgdGhhbiB0aGUgbmV3IHZhbHVlIGFsbG93cywgdGhlIG9sZGVzdCBtZXNzYWdlcyBnZXQgcmVtb3ZlZC5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIG5ldyBtYXhpbXVtIG51bWJlclxuXHQgKi9cblx0cHVibGljIHNldE1heE1lc3NhZ2VzKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5tYXhNZXNzYWdlcyAhPT0gdmFsdWUpIHtcblx0XHRcdHRoaXMubWF4TWVzc2FnZXMgPSB2YWx1ZTtcblxuXHRcdFx0aWYgKHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhNZXNzYWdlcykge1xuXHRcdFx0XHQvLyB0aGVyZSBhcmUgdG9vIG11Y2ggbG9nTWVzc2FnZXMgZm9yIHRoZSBuZXcgdmFsdWUsIHRoZXJlZm9yZSByZW1vdmUgb2xkZXN0IG1lc3NhZ2VzXG5cdFx0XHRcdHdoaWxlICh0aGlzLmxvZ01lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdFx0XHR0aGlzLmxvZ01lc3NhZ2VzLnNoaWZ0KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB3cml0ZSB2YWx1ZXMgdG8gbG9jYWxTdG9yYWdlXG5cdFx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLmxvZ01lc3NhZ2VzKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYWxsIG1lc3NhZ2VzIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlLlxuXHQgKiBNYWlubHkgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3Nlcy5cblx0ICpcblx0ICogQHJldHVybiBzdG9yZWQgbWVzc2FnZXNcblx0ICovXG5cdHB1YmxpYyBnZXRMb2dNZXNzYWdlcygpOiBMb2dNZXNzYWdlW10ge1xuXHRcdHJldHVybiB0aGlzLmxvZ01lc3NhZ2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gbG9jYWwgc3RvcmFnZS5cblx0ICogTWFpbmx5IGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJMb2coKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dNZXNzYWdlcyA9IFtdO1xuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KTtcblx0fVxufVxuIl19
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as log4javascript from "log4javascript";
|
|
2
|
+
import { LogLevel } from "./log-level.model";
|
|
3
|
+
/**
|
|
4
|
+
* Helper class for converting log levels from and to different data type.
|
|
5
|
+
*/
|
|
6
|
+
export class LogLevelConverter {
|
|
7
|
+
/**
|
|
8
|
+
* Converts log4javascript.Level to internal LogLevel.
|
|
9
|
+
*
|
|
10
|
+
* @param level log4javascript's data type
|
|
11
|
+
* @return internal data type.
|
|
12
|
+
*/
|
|
13
|
+
static levelFromLog4Javascript(level) {
|
|
14
|
+
switch (level) {
|
|
15
|
+
case log4javascript.Level.ALL:
|
|
16
|
+
return LogLevel.ALL;
|
|
17
|
+
case log4javascript.Level.DEBUG:
|
|
18
|
+
return LogLevel.DEBUG;
|
|
19
|
+
case log4javascript.Level.ERROR:
|
|
20
|
+
return LogLevel.ERROR;
|
|
21
|
+
case log4javascript.Level.FATAL:
|
|
22
|
+
return LogLevel.FATAL;
|
|
23
|
+
case log4javascript.Level.INFO:
|
|
24
|
+
return LogLevel.INFO;
|
|
25
|
+
case log4javascript.Level.OFF:
|
|
26
|
+
return LogLevel.OFF;
|
|
27
|
+
case log4javascript.Level.TRACE:
|
|
28
|
+
return LogLevel.TRACE;
|
|
29
|
+
case log4javascript.Level.WARN:
|
|
30
|
+
return LogLevel.WARN;
|
|
31
|
+
default:
|
|
32
|
+
throw new Error(`invalid level ${level}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Converts string representation to internal LogLevel.
|
|
37
|
+
*
|
|
38
|
+
* @param level string representation
|
|
39
|
+
* @return internal data type.
|
|
40
|
+
*/
|
|
41
|
+
static levelFromString(level) {
|
|
42
|
+
switch (level) {
|
|
43
|
+
case "ALL":
|
|
44
|
+
return LogLevel.ALL;
|
|
45
|
+
case "DEBUG":
|
|
46
|
+
return LogLevel.DEBUG;
|
|
47
|
+
case "ERROR":
|
|
48
|
+
return LogLevel.ERROR;
|
|
49
|
+
case "FATAL":
|
|
50
|
+
return LogLevel.FATAL;
|
|
51
|
+
case "INFO":
|
|
52
|
+
return LogLevel.INFO;
|
|
53
|
+
case "OFF":
|
|
54
|
+
return LogLevel.OFF;
|
|
55
|
+
case "TRACE":
|
|
56
|
+
return LogLevel.TRACE;
|
|
57
|
+
case "WARN":
|
|
58
|
+
return LogLevel.WARN;
|
|
59
|
+
default:
|
|
60
|
+
throw new Error(`invalid level ${level}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Converts internal LogLevel to log4javascript.Level.
|
|
65
|
+
*
|
|
66
|
+
* @param internal data type.
|
|
67
|
+
* @return level log4javascript's data type
|
|
68
|
+
*/
|
|
69
|
+
static levelToLog4Javascript(level) {
|
|
70
|
+
switch (level) {
|
|
71
|
+
case LogLevel.ALL:
|
|
72
|
+
return log4javascript.Level.ALL;
|
|
73
|
+
case LogLevel.DEBUG:
|
|
74
|
+
return log4javascript.Level.DEBUG;
|
|
75
|
+
case LogLevel.ERROR:
|
|
76
|
+
return log4javascript.Level.ERROR;
|
|
77
|
+
case LogLevel.FATAL:
|
|
78
|
+
return log4javascript.Level.FATAL;
|
|
79
|
+
case LogLevel.INFO:
|
|
80
|
+
return log4javascript.Level.INFO;
|
|
81
|
+
case LogLevel.OFF:
|
|
82
|
+
return log4javascript.Level.OFF;
|
|
83
|
+
case LogLevel.TRACE:
|
|
84
|
+
return log4javascript.Level.TRACE;
|
|
85
|
+
case LogLevel.WARN:
|
|
86
|
+
return log4javascript.Level.WARN;
|
|
87
|
+
default:
|
|
88
|
+
throw new Error(`invalid level ${level}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWxldmVsLmNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWxvZ2dpbmctc2VydmljZS9zcmMvbGliL2xvZy1sZXZlbC5jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBRTdCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQTJCO1FBQ2hFLFFBQVEsS0FBSyxFQUFFLENBQUM7WUFDZixLQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDNUIsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3JCLEtBQUssY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUM5QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdkIsS0FBSyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2QixLQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLEtBQUssY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUM3QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQzVCLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNyQixLQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLEtBQUssY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUM3QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEI7Z0JBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFhO1FBQzFDLFFBQVEsS0FBSyxFQUFFLENBQUM7WUFDZixLQUFLLEtBQUs7Z0JBQ1QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3JCLEtBQUssT0FBTztnQkFDWCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdkIsS0FBSyxPQUFPO2dCQUNYLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2QixLQUFLLE9BQU87Z0JBQ1gsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLEtBQUssTUFBTTtnQkFDVixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxLQUFLO2dCQUNULE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNyQixLQUFLLE9BQU87Z0JBQ1gsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLEtBQUssTUFBTTtnQkFDVixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEI7Z0JBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWU7UUFDbEQsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUssUUFBUSxDQUFDLEdBQUc7Z0JBQ2hCLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDakMsS0FBSyxRQUFRLENBQUMsS0FBSztnQkFDbEIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNuQyxLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNsQixPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ25DLEtBQUssUUFBUSxDQUFDLEtBQUs7Z0JBQ2xCLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbkMsS0FBSyxRQUFRLENBQUMsSUFBSTtnQkFDakIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNsQyxLQUFLLFFBQVEsQ0FBQyxHQUFHO2dCQUNoQixPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ2pDLEtBQUssUUFBUSxDQUFDLEtBQUs7Z0JBQ2xCLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbkMsS0FBSyxRQUFRLENBQUMsSUFBSTtnQkFDakIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNsQztnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBsb2c0amF2YXNjcmlwdCBmcm9tIFwibG9nNGphdmFzY3JpcHRcIjtcblxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9sb2ctbGV2ZWwubW9kZWxcIjtcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgbG9nIGxldmVscyBmcm9tIGFuZCB0byBkaWZmZXJlbnQgZGF0YSB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgTG9nTGV2ZWxDb252ZXJ0ZXIge1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBsb2c0amF2YXNjcmlwdC5MZXZlbCB0byBpbnRlcm5hbCBMb2dMZXZlbC5cblx0ICpcblx0ICogQHBhcmFtIGxldmVsIGxvZzRqYXZhc2NyaXB0J3MgZGF0YSB0eXBlXG5cdCAqIEByZXR1cm4gaW50ZXJuYWwgZGF0YSB0eXBlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBsZXZlbEZyb21Mb2c0SmF2YXNjcmlwdChsZXZlbDogbG9nNGphdmFzY3JpcHQuTGV2ZWwpOiBMb2dMZXZlbCB7XG5cdFx0c3dpdGNoIChsZXZlbCkge1xuXHRcdFx0Y2FzZSBsb2c0amF2YXNjcmlwdC5MZXZlbC5BTEw6XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5BTEw7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLkRFQlVHOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuREVCVUc7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLkVSUk9SOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuRVJST1I7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLkZBVEFMOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuRkFUQUw7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLklORk86XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5JTkZPO1xuXHRcdFx0Y2FzZSBsb2c0amF2YXNjcmlwdC5MZXZlbC5PRkY6XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5PRkY7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLlRSQUNFOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuVFJBQ0U7XG5cdFx0XHRjYXNlIGxvZzRqYXZhc2NyaXB0LkxldmVsLldBUk46XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5XQVJOO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGxldmVsICR7bGV2ZWx9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBpbnRlcm5hbCBMb2dMZXZlbC5cblx0ICpcblx0ICogQHBhcmFtIGxldmVsIHN0cmluZyByZXByZXNlbnRhdGlvblxuXHQgKiBAcmV0dXJuIGludGVybmFsIGRhdGEgdHlwZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgbGV2ZWxGcm9tU3RyaW5nKGxldmVsOiBzdHJpbmcpOiBMb2dMZXZlbCB7XG5cdFx0c3dpdGNoIChsZXZlbCkge1xuXHRcdFx0Y2FzZSBcIkFMTFwiOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuQUxMO1xuXHRcdFx0Y2FzZSBcIkRFQlVHXCI6XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5ERUJVRztcblx0XHRcdGNhc2UgXCJFUlJPUlwiOlxuXHRcdFx0XHRyZXR1cm4gTG9nTGV2ZWwuRVJST1I7XG5cdFx0XHRjYXNlIFwiRkFUQUxcIjpcblx0XHRcdFx0cmV0dXJuIExvZ0xldmVsLkZBVEFMO1xuXHRcdFx0Y2FzZSBcIklORk9cIjpcblx0XHRcdFx0cmV0dXJuIExvZ0xldmVsLklORk87XG5cdFx0XHRjYXNlIFwiT0ZGXCI6XG5cdFx0XHRcdHJldHVybiBMb2dMZXZlbC5PRkY7XG5cdFx0XHRjYXNlIFwiVFJBQ0VcIjpcblx0XHRcdFx0cmV0dXJuIExvZ0xldmVsLlRSQUNFO1xuXHRcdFx0Y2FzZSBcIldBUk5cIjpcblx0XHRcdFx0cmV0dXJuIExvZ0xldmVsLldBUk47XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbGV2ZWwgJHtsZXZlbH1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgaW50ZXJuYWwgTG9nTGV2ZWwgdG8gbG9nNGphdmFzY3JpcHQuTGV2ZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnRlcm5hbCBkYXRhIHR5cGUuXG5cdCAqIEByZXR1cm4gbGV2ZWwgbG9nNGphdmFzY3JpcHQncyBkYXRhIHR5cGVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgbGV2ZWxUb0xvZzRKYXZhc2NyaXB0KGxldmVsOiBMb2dMZXZlbCk6IGxvZzRqYXZhc2NyaXB0LkxldmVsIHtcblx0XHRzd2l0Y2ggKGxldmVsKSB7XG5cdFx0XHRjYXNlIExvZ0xldmVsLkFMTDpcblx0XHRcdFx0cmV0dXJuIGxvZzRqYXZhc2NyaXB0LkxldmVsLkFMTDtcblx0XHRcdGNhc2UgTG9nTGV2ZWwuREVCVUc6XG5cdFx0XHRcdHJldHVybiBsb2c0amF2YXNjcmlwdC5MZXZlbC5ERUJVRztcblx0XHRcdGNhc2UgTG9nTGV2ZWwuRVJST1I6XG5cdFx0XHRcdHJldHVybiBsb2c0amF2YXNjcmlwdC5MZXZlbC5FUlJPUjtcblx0XHRcdGNhc2UgTG9nTGV2ZWwuRkFUQUw6XG5cdFx0XHRcdHJldHVybiBsb2c0amF2YXNjcmlwdC5MZXZlbC5GQVRBTDtcblx0XHRcdGNhc2UgTG9nTGV2ZWwuSU5GTzpcblx0XHRcdFx0cmV0dXJuIGxvZzRqYXZhc2NyaXB0LkxldmVsLklORk87XG5cdFx0XHRjYXNlIExvZ0xldmVsLk9GRjpcblx0XHRcdFx0cmV0dXJuIGxvZzRqYXZhc2NyaXB0LkxldmVsLk9GRjtcblx0XHRcdGNhc2UgTG9nTGV2ZWwuVFJBQ0U6XG5cdFx0XHRcdHJldHVybiBsb2c0amF2YXNjcmlwdC5MZXZlbC5UUkFDRTtcblx0XHRcdGNhc2UgTG9nTGV2ZWwuV0FSTjpcblx0XHRcdFx0cmV0dXJuIGxvZzRqYXZhc2NyaXB0LkxldmVsLldBUk47XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbGV2ZWwgJHtsZXZlbH1gKTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==
|