@decaf-ts/for-fabric 0.5.1-query → 0.5.1-query.3
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/dist/for-fabric.cjs +3 -3
- package/dist/for-fabric.js +3 -3
- package/lib/contract/logging-context.cjs +77 -0
- package/lib/contract/logging-context.d.ts +8 -0
- package/lib/contracts/ContractAdapter.cjs +27 -11
- package/lib/contracts/logging.cjs +26 -15
- package/lib/contracts/logging.d.ts +11 -6
- package/lib/esm/contract/logging-context.d.ts +8 -0
- package/lib/esm/contract/logging-context.js +71 -0
- package/lib/esm/contracts/ContractAdapter.js +27 -11
- package/lib/esm/contracts/logging.d.ts +11 -6
- package/lib/esm/contracts/logging.js +26 -15
- package/lib/esm/shared/decorators.js +2 -2
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/shared/decorators.cjs +2 -2
- package/lib/version.cjs +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +2 -2
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ContractLogger = void 0;
|
|
4
4
|
const logging_1 = require("@decaf-ts/logging");
|
|
5
5
|
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
6
|
+
const logging_context_1 = require("./../contract/logging-context.cjs");
|
|
7
|
+
(0, logging_context_1.ensureContractLogFieldRegistration)();
|
|
6
8
|
/**
|
|
7
9
|
* @description Logger implementation for Fabric chaincode contracts
|
|
8
10
|
* @summary Adapts the standard logging interface to work with Fabric's chaincode context
|
|
@@ -35,13 +37,22 @@ const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
|
35
37
|
*/
|
|
36
38
|
class ContractLogger extends logging_1.MiniLogger {
|
|
37
39
|
constructor(context, conf, ctx) {
|
|
38
|
-
|
|
40
|
+
const normalizedConfig = (0, logging_context_1.enrichContractLoggingConfig)(conf, ctx);
|
|
41
|
+
super(context, normalizedConfig);
|
|
39
42
|
if (!ctx) {
|
|
40
|
-
this.
|
|
43
|
+
this.sink = {
|
|
44
|
+
info: (msg) => console.log(msg),
|
|
45
|
+
verbose: (msg) => console.log(msg),
|
|
46
|
+
debug: (msg) => console.debug(msg),
|
|
47
|
+
error: (msg) => console.error(msg),
|
|
48
|
+
trace: (msg) => console.trace(msg),
|
|
49
|
+
warn: (msg) => console.warn(msg),
|
|
50
|
+
silly: (msg) => console.debug(msg),
|
|
51
|
+
};
|
|
41
52
|
}
|
|
42
53
|
else {
|
|
43
|
-
this.
|
|
44
|
-
ctx.logging.setLevel(
|
|
54
|
+
this.sink = ctx.logging.getLogger(context);
|
|
55
|
+
ctx.logging.setLevel(normalizedConfig?.level || logging_1.Logging.getConfig().level);
|
|
45
56
|
}
|
|
46
57
|
}
|
|
47
58
|
/**
|
|
@@ -52,40 +63,40 @@ class ContractLogger extends logging_1.MiniLogger {
|
|
|
52
63
|
* @param {Error} [stack] - Optional stack trace for errors
|
|
53
64
|
* @return {void}
|
|
54
65
|
*/
|
|
55
|
-
log(level, msg,
|
|
66
|
+
log(level, msg, error, meta) {
|
|
56
67
|
if (logging_1.NumericLogLevels[this.config("level")] <
|
|
57
68
|
logging_1.NumericLogLevels[level])
|
|
58
69
|
return;
|
|
59
70
|
let method;
|
|
60
71
|
switch (level) {
|
|
61
72
|
case logging_1.LogLevel.benchmark:
|
|
62
|
-
method = this.
|
|
73
|
+
method = this.sink.verbose;
|
|
63
74
|
break;
|
|
64
75
|
case logging_1.LogLevel.info:
|
|
65
|
-
method = this.
|
|
76
|
+
method = this.sink.info;
|
|
66
77
|
break;
|
|
67
78
|
case logging_1.LogLevel.verbose:
|
|
68
|
-
method = this.
|
|
79
|
+
method = this.sink.verbose;
|
|
69
80
|
break;
|
|
70
81
|
case logging_1.LogLevel.debug:
|
|
71
|
-
method = this.
|
|
82
|
+
method = this.sink.debug;
|
|
72
83
|
break;
|
|
73
84
|
case logging_1.LogLevel.error:
|
|
74
|
-
method = this.
|
|
85
|
+
method = this.sink.error;
|
|
75
86
|
break;
|
|
76
87
|
case logging_1.LogLevel.trace:
|
|
77
|
-
method = this.
|
|
88
|
+
method = this.sink.trace;
|
|
78
89
|
break;
|
|
79
90
|
case logging_1.LogLevel.warn:
|
|
80
|
-
method = this.
|
|
91
|
+
method = this.sink.warn;
|
|
81
92
|
break;
|
|
82
93
|
case logging_1.LogLevel.silly:
|
|
83
|
-
method = this.
|
|
94
|
+
method = this.sink.silly;
|
|
84
95
|
break;
|
|
85
96
|
default:
|
|
86
97
|
throw new db_decorators_1.InternalError("Invalid log level");
|
|
87
98
|
}
|
|
88
|
-
method.call(this.
|
|
99
|
+
method.call(this.sink, this.createLog(level, msg, error, meta));
|
|
89
100
|
}
|
|
90
101
|
}
|
|
91
102
|
exports.ContractLogger = ContractLogger;
|
|
@@ -104,4 +115,4 @@ const factory = (object, config, ctx) => {
|
|
|
104
115
|
};
|
|
105
116
|
// Set the factory as the default logger factory
|
|
106
117
|
logging_1.Logging.setFactory(factory);
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvbG9nZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FRMkI7QUFHM0IsMkRBQXdEO0FBQ3hELHVFQUdxQztBQUVyQyxJQUFBLG9EQUFrQyxHQUFFLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsb0JBQVU7SUFXNUMsWUFDRSxPQUFlLEVBQ2YsSUFBd0MsRUFDeEMsR0FBUztRQUVULE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSw2Q0FBMkIsRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsS0FBSyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxJQUFJLEdBQUc7Z0JBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFDdkMsT0FBTyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDeEMsS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUMzQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBZ0MsQ0FBQztZQUMxRSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDbEIsZ0JBQWdCLEVBQUUsS0FBSyxJQUFJLGlCQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUNyRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ2dCLEdBQUcsQ0FDcEIsS0FBZSxFQUNmLEdBQXVCLEVBQ3ZCLEtBQWEsRUFDYixJQUFjO1FBRWQsSUFDRSwwQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBYSxDQUFDO1lBQ2xELDBCQUFnQixDQUFDLEtBQUssQ0FBQztZQUV2QixPQUFPO1FBRVQsSUFBSSxNQUFNLENBQUM7UUFDWCxRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxrQkFBUSxDQUFDLFNBQVM7Z0JBQ3JCLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsTUFBTTtZQUNSLEtBQUssa0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLE1BQU07WUFDUixLQUFLLGtCQUFRLENBQUMsT0FBTztnQkFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUMzQixNQUFNO1lBQ1IsS0FBSyxrQkFBUSxDQUFDLEtBQUs7Z0JBQ2pCLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDekIsTUFBTTtZQUNSLEtBQUssa0JBQVEsQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLGtCQUFRLENBQUMsS0FBSztnQkFDakIsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN6QixNQUFNO1lBQ1IsS0FBSyxrQkFBUSxDQUFDLElBQUk7Z0JBQ2hCLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDeEIsTUFBTTtZQUNSLEtBQUssa0JBQVEsQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksNkJBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQXhGRCx3Q0F3RkM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sR0FBa0IsQ0FDN0IsTUFBZSxFQUNmLE1BQStCLEVBQy9CLEdBQVMsRUFDVCxFQUFFO0lBQ0YsT0FBTyxJQUFJLGNBQWMsQ0FDdkIsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQzdCLE1BQU0sSUFBSSxFQUFFLEVBQ1osR0FBVSxDQUNYLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixnREFBZ0Q7QUFDaEQsaUJBQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBMb2dnZXJGYWN0b3J5LFxuICBMb2dnaW5nLFxuICBMb2dMZXZlbCxcbiAgTG9nTWV0YSxcbiAgTWluaUxvZ2dlcixcbiAgTnVtZXJpY0xvZ0xldmVscyxcbiAgU3RyaW5nTGlrZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBDb250ZXh0IGFzIEN0eCB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBlbnJpY2hDb250cmFjdExvZ2dpbmdDb25maWcsXG4gIGVuc3VyZUNvbnRyYWN0TG9nRmllbGRSZWdpc3RyYXRpb24sXG59IGZyb20gXCIuLi9jb250cmFjdC9sb2dnaW5nLWNvbnRleHRcIjtcblxuZW5zdXJlQ29udHJhY3RMb2dGaWVsZFJlZ2lzdHJhdGlvbigpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RzXG4gKiBAc3VtbWFyeSBBZGFwdHMgdGhlIHN0YW5kYXJkIGxvZ2dpbmcgaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBGYWJyaWMncyBjaGFpbmNvZGUgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0IC0gVGhlIGxvZ2dpbmcgY29udGV4dCBuYW1lXG4gKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz4gfCB1bmRlZmluZWR9IGNvbmYgLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gKlxuICogQGNsYXNzIENvbnRyYWN0TG9nZ2VyXG4gKiBAZXh0ZW5kcyB7TWluaUxvZ2dlcn1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RcbiAqIGltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBteUZ1bmN0aW9uKGN0eDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBDb250cmFjdExvZ2dlcignTXlDb250cmFjdCcsIHsgbGV2ZWw6ICdpbmZvJyB9LCBjdHgpO1xuICpcbiAqICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyB0cmFuc2FjdGlvbicpO1xuICogICAgIGxvZ2dlci5kZWJ1ZygnVHJhbnNhY3Rpb24gZGV0YWlsczonLCB7IC4uLiB9KTtcbiAqXG4gKiAgICAgLy8gRG8gc29tZXRoaW5nXG4gKlxuICogICAgIGxvZ2dlci5pbmZvKCdUcmFuc2FjdGlvbiBjb21wbGV0ZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0TG9nZ2VyIGV4dGVuZHMgTWluaUxvZ2dlciB7XG4gIHByb3RlY3RlZCBzaW5rIToge1xuICAgIHZlcmJvc2U6IChtc2c6IHN0cmluZykgPT4gdm9pZDtcbiAgICBpbmZvOiAobXNnOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgZGVidWc6IChtc2c6IHN0cmluZykgPT4gdm9pZDtcbiAgICBlcnJvcjogKG1zZzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHRyYWNlOiAobXNnOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgd2FybjogKG1zZzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNpbGx5OiAobXNnOiBzdHJpbmcpID0+IHZvaWQ7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29udGV4dDogc3RyaW5nLFxuICAgIGNvbmY6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4gfCB1bmRlZmluZWQsXG4gICAgY3R4PzogQ3R4XG4gICkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSBlbnJpY2hDb250cmFjdExvZ2dpbmdDb25maWcoY29uZiwgY3R4KTtcbiAgICBzdXBlcihjb250ZXh0LCBub3JtYWxpemVkQ29uZmlnKTtcblxuICAgIGlmICghY3R4KSB7XG4gICAgICB0aGlzLnNpbmsgPSB7XG4gICAgICAgIGluZm86IChtc2c6IHN0cmluZykgPT4gY29uc29sZS5sb2cobXNnKSxcbiAgICAgICAgdmVyYm9zZTogKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmxvZyhtc2cpLFxuICAgICAgICBkZWJ1ZzogKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmRlYnVnKG1zZyksXG4gICAgICAgIGVycm9yOiAobXNnOiBzdHJpbmcpID0+IGNvbnNvbGUuZXJyb3IobXNnKSxcbiAgICAgICAgdHJhY2U6IChtc2c6IHN0cmluZykgPT4gY29uc29sZS50cmFjZShtc2cpLFxuICAgICAgICB3YXJuOiAobXNnOiBzdHJpbmcpID0+IGNvbnNvbGUud2Fybihtc2cpLFxuICAgICAgICBzaWxseTogKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmRlYnVnKG1zZyksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNpbmsgPSBjdHgubG9nZ2luZy5nZXRMb2dnZXIoY29udGV4dCkgYXMgdW5rbm93biBhcyB0eXBlb2YgdGhpcy5zaW5rO1xuICAgICAgY3R4LmxvZ2dpbmcuc2V0TGV2ZWwoXG4gICAgICAgIG5vcm1hbGl6ZWRDb25maWc/LmxldmVsIHx8IExvZ2dpbmcuZ2V0Q29uZmlnKCkubGV2ZWxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSBsb2cgbWV0aG9kIHRvIHVzZSB0aGUgRmFicmljIGNvbnRleHQncyBsb2dnZXJcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZSB8IEVycm9yfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2dcbiAgICogQHBhcmFtIHtFcnJvcn0gW3N0YWNrXSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlIGZvciBlcnJvcnNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIGVycm9yPzogRXJyb3IsXG4gICAgbWV0YT86IExvZ01ldGFcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGxldCBtZXRob2Q7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5iZW5jaG1hcms6XG4gICAgICAgIG1ldGhvZCA9IHRoaXMuc2luay52ZXJib3NlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwuaW5mbzpcbiAgICAgICAgbWV0aG9kID0gdGhpcy5zaW5rLmluZm87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC52ZXJib3NlOlxuICAgICAgICBtZXRob2QgPSB0aGlzLnNpbmsudmVyYm9zZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmRlYnVnOlxuICAgICAgICBtZXRob2QgPSB0aGlzLnNpbmsuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gdGhpcy5zaW5rLmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudHJhY2U6XG4gICAgICAgIG1ldGhvZCA9IHRoaXMuc2luay50cmFjZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLndhcm46XG4gICAgICAgIG1ldGhvZCA9IHRoaXMuc2luay53YXJuO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwuc2lsbHk6XG4gICAgICAgIG1ldGhvZCA9IHRoaXMuc2luay5zaWxseTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QuY2FsbCh0aGlzLnNpbmssIHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIGVycm9yLCBtZXRhKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgQ29udHJhY3RMb2dnZXIgaW5zdGFuY2VzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0TG9nZ2VyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQsIGNvbmZpZywgYW5kIEZhYnJpYyBjb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0IC0gVGhlIGxvZ2dpbmcgY29udGV4dCBuYW1lXG4gKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz4gfCB1bmRlZmluZWR9IGNvbmZpZyAtIE9wdGlvbmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAqIEByZXR1cm4ge0NvbnRyYWN0TG9nZ2VyfSBBIG5ldyBDb250cmFjdExvZ2dlciBpbnN0YW5jZVxuICogQGZ1bmN0aW9uIGZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZmFicmljLmNvbnRyYWN0c1xuICovXG5jb25zdCBmYWN0b3J5OiBMb2dnZXJGYWN0b3J5ID0gKFxuICBvYmplY3Q/OiBzdHJpbmcsXG4gIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gIGN0eD86IEN0eFxuKSA9PiB7XG4gIHJldHVybiBuZXcgQ29udHJhY3RMb2dnZXIoXG4gICAgb2JqZWN0IHx8IENvbnRyYWN0TG9nZ2VyLm5hbWUsXG4gICAgY29uZmlnIHx8IHt9LFxuICAgIGN0eCBhcyBDdHhcbiAgKTtcbn07XG5cbi8vIFNldCB0aGUgZmFjdG9yeSBhcyB0aGUgZGVmYXVsdCBsb2dnZXIgZmFjdG9yeVxuTG9nZ2luZy5zZXRGYWN0b3J5KGZhY3RvcnkpO1xuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogLevel, LogMeta, MiniLogger, StringLike } from "@decaf-ts/logging";
|
|
2
2
|
import { LoggingConfig } from "@decaf-ts/logging";
|
|
3
3
|
import { Context as Ctx } from "fabric-contract-api";
|
|
4
4
|
/**
|
|
@@ -32,10 +32,15 @@ import { Context as Ctx } from "fabric-contract-api";
|
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
34
|
export declare class ContractLogger extends MiniLogger {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
protected sink: {
|
|
36
|
+
verbose: (msg: string) => void;
|
|
37
|
+
info: (msg: string) => void;
|
|
38
|
+
debug: (msg: string) => void;
|
|
39
|
+
error: (msg: string) => void;
|
|
40
|
+
trace: (msg: string) => void;
|
|
41
|
+
warn: (msg: string) => void;
|
|
42
|
+
silly: (msg: string) => void;
|
|
43
|
+
};
|
|
39
44
|
constructor(context: string, conf: Partial<LoggingConfig> | undefined, ctx?: Ctx);
|
|
40
45
|
/**
|
|
41
46
|
* @description Logs a message at the specified level
|
|
@@ -45,5 +50,5 @@ export declare class ContractLogger extends MiniLogger {
|
|
|
45
50
|
* @param {Error} [stack] - Optional stack trace for errors
|
|
46
51
|
* @return {void}
|
|
47
52
|
*/
|
|
48
|
-
protected log(level: LogLevel, msg: StringLike | Error,
|
|
53
|
+
protected log(level: LogLevel, msg: StringLike | Error, error?: Error, meta?: LogMeta): void;
|
|
49
54
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LoggingConfig } from "@decaf-ts/logging";
|
|
2
|
+
import { Context as Ctx } from "fabric-contract-api";
|
|
3
|
+
export declare function ensureContractLogFieldRegistration(): void;
|
|
4
|
+
export declare function enrichContractLoggingConfig(conf: Partial<LoggingConfig> | undefined, ctx?: Ctx): (Partial<LoggingConfig> & {
|
|
5
|
+
user?: string;
|
|
6
|
+
}) | undefined;
|
|
7
|
+
export declare function extractUserFromIdentity(id?: string): string | undefined;
|
|
8
|
+
export declare function trimCorrelationId(id?: string): string | undefined;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Logging } from "@decaf-ts/logging";
|
|
2
|
+
let userFieldRegistered = false;
|
|
3
|
+
export function ensureContractLogFieldRegistration() {
|
|
4
|
+
if (userFieldRegistered)
|
|
5
|
+
return;
|
|
6
|
+
userFieldRegistered = true;
|
|
7
|
+
Logging.register({
|
|
8
|
+
key: "correlationId",
|
|
9
|
+
shouldInclude(payload) {
|
|
10
|
+
const value = payload?.correlationId ?? payload?.config?.correlationId;
|
|
11
|
+
return Boolean(value);
|
|
12
|
+
},
|
|
13
|
+
render(payload) {
|
|
14
|
+
const value = payload?.correlationId ?? payload?.config?.correlationId;
|
|
15
|
+
return value === undefined || value === null
|
|
16
|
+
? undefined
|
|
17
|
+
: `, correlationId: ${String(value)}`;
|
|
18
|
+
},
|
|
19
|
+
style(rendered, payload) {
|
|
20
|
+
return payload.applyTheme(rendered, "id");
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
Logging.register({
|
|
24
|
+
key: "user",
|
|
25
|
+
shouldInclude(payload) {
|
|
26
|
+
const value = payload?.user ?? payload?.config?.user;
|
|
27
|
+
return Boolean(value);
|
|
28
|
+
},
|
|
29
|
+
render(payload) {
|
|
30
|
+
const value = payload?.user ?? payload?.config?.user;
|
|
31
|
+
return value === undefined || value === null
|
|
32
|
+
? undefined
|
|
33
|
+
: `, user: ${String(value)}`;
|
|
34
|
+
},
|
|
35
|
+
style(rendered, payload) {
|
|
36
|
+
return payload.applyTheme(rendered, "id");
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function enrichContractLoggingConfig(conf, ctx) {
|
|
41
|
+
if (!ctx)
|
|
42
|
+
return conf;
|
|
43
|
+
const txId = ctx.stub?.getTxID?.();
|
|
44
|
+
const compactTxId = trimCorrelationId(txId);
|
|
45
|
+
const user = extractUserFromIdentity(ctx.clientIdentity?.getID?.());
|
|
46
|
+
const useDefaultFabricFormatting = !conf?.pattern;
|
|
47
|
+
return {
|
|
48
|
+
...(conf || {}),
|
|
49
|
+
correlationId: conf?.correlationId || compactTxId,
|
|
50
|
+
user: conf?.user || user,
|
|
51
|
+
pattern: conf?.pattern || "{message}{user}{correlationId} {stack}",
|
|
52
|
+
logLevel: useDefaultFabricFormatting ? false : conf?.logLevel,
|
|
53
|
+
timestamp: useDefaultFabricFormatting ? false : conf?.timestamp,
|
|
54
|
+
context: useDefaultFabricFormatting ? false : conf?.context,
|
|
55
|
+
separator: useDefaultFabricFormatting ? "" : conf?.separator,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function extractUserFromIdentity(id) {
|
|
59
|
+
if (!id)
|
|
60
|
+
return undefined;
|
|
61
|
+
const emailMatch = id.match(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/);
|
|
62
|
+
return emailMatch?.[0];
|
|
63
|
+
}
|
|
64
|
+
export function trimCorrelationId(id) {
|
|
65
|
+
if (!id)
|
|
66
|
+
return undefined;
|
|
67
|
+
if (id.length <= 10)
|
|
68
|
+
return id;
|
|
69
|
+
return `${id.slice(0, 5)}-${id.slice(-5)}`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0L2xvZ2dpbmctY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFpQixNQUFNLG1CQUFtQixDQUFDO0FBRzNELElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDLE1BQU0sVUFBVSxrQ0FBa0M7SUFDaEQsSUFBSSxtQkFBbUI7UUFBRSxPQUFPO0lBQ2hDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2YsR0FBRyxFQUFFLGVBQWU7UUFDcEIsYUFBYSxDQUFDLE9BQVk7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLGFBQWEsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQztZQUN2RSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQVk7WUFDakIsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLGFBQWEsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQztZQUN2RSxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7Z0JBQzFDLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxvQkFBb0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELEtBQUssQ0FBQyxRQUFnQixFQUFFLE9BQVk7WUFDbEMsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDO0tBQ0ssQ0FBQyxDQUFDO0lBQ1YsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNmLEdBQUcsRUFBRSxNQUFNO1FBQ1gsYUFBYSxDQUFDLE9BQVk7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztZQUNyRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQVk7WUFDakIsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztZQUNyRCxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7Z0JBQzFDLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxLQUFLLENBQUMsUUFBZ0IsRUFBRSxPQUFZO1lBQ2xDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQztLQUNLLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLElBQXdDLEVBQ3hDLEdBQVM7SUFFVCxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRSxNQUFNLDBCQUEwQixHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztJQUNsRCxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDZixhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsSUFBSSxXQUFXO1FBQ2pELElBQUksRUFBRyxJQUFZLEVBQUUsSUFBSSxJQUFJLElBQUk7UUFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLElBQUksd0NBQXdDO1FBQ2xFLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUTtRQUM3RCxTQUFTLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVM7UUFDL0QsT0FBTyxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPO1FBQzNELFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUztLQUM3RCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxFQUFXO0lBQ2pELElBQUksQ0FBQyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDMUIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FDekIsZ0RBQWdELENBQ2pELENBQUM7SUFDRixPQUFPLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBVztJQUMzQyxJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFCLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nLCBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBDb250ZXh0IGFzIEN0eCB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5cbmxldCB1c2VyRmllbGRSZWdpc3RlcmVkID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFjdExvZ0ZpZWxkUmVnaXN0cmF0aW9uKCkge1xuICBpZiAodXNlckZpZWxkUmVnaXN0ZXJlZCkgcmV0dXJuO1xuICB1c2VyRmllbGRSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgTG9nZ2luZy5yZWdpc3Rlcih7XG4gICAga2V5OiBcImNvcnJlbGF0aW9uSWRcIixcbiAgICBzaG91bGRJbmNsdWRlKHBheWxvYWQ6IGFueSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkPy5jb3JyZWxhdGlvbklkID8/IHBheWxvYWQ/LmNvbmZpZz8uY29ycmVsYXRpb25JZDtcbiAgICAgIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbmRlcihwYXlsb2FkOiBhbnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcGF5bG9hZD8uY29ycmVsYXRpb25JZCA/PyBwYXlsb2FkPy5jb25maWc/LmNvcnJlbGF0aW9uSWQ7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGAsIGNvcnJlbGF0aW9uSWQ6ICR7U3RyaW5nKHZhbHVlKX1gO1xuICAgIH0sXG4gICAgc3R5bGUocmVuZGVyZWQ6IHN0cmluZywgcGF5bG9hZDogYW55KSB7XG4gICAgICByZXR1cm4gcGF5bG9hZC5hcHBseVRoZW1lKHJlbmRlcmVkLCBcImlkXCIpO1xuICAgIH0sXG4gIH0gYXMgYW55KTtcbiAgTG9nZ2luZy5yZWdpc3Rlcih7XG4gICAga2V5OiBcInVzZXJcIixcbiAgICBzaG91bGRJbmNsdWRlKHBheWxvYWQ6IGFueSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkPy51c2VyID8/IHBheWxvYWQ/LmNvbmZpZz8udXNlcjtcbiAgICAgIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbmRlcihwYXlsb2FkOiBhbnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcGF5bG9hZD8udXNlciA/PyBwYXlsb2FkPy5jb25maWc/LnVzZXI7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGAsIHVzZXI6ICR7U3RyaW5nKHZhbHVlKX1gO1xuICAgIH0sXG4gICAgc3R5bGUocmVuZGVyZWQ6IHN0cmluZywgcGF5bG9hZDogYW55KSB7XG4gICAgICByZXR1cm4gcGF5bG9hZC5hcHBseVRoZW1lKHJlbmRlcmVkLCBcImlkXCIpO1xuICAgIH0sXG4gIH0gYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVucmljaENvbnRyYWN0TG9nZ2luZ0NvbmZpZyhcbiAgY29uZjogUGFydGlhbDxMb2dnaW5nQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgY3R4PzogQ3R4XG4pOiAoUGFydGlhbDxMb2dnaW5nQ29uZmlnPiAmIHsgdXNlcj86IHN0cmluZyB9KSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY3R4KSByZXR1cm4gY29uZjtcbiAgY29uc3QgdHhJZCA9IGN0eC5zdHViPy5nZXRUeElEPy4oKTtcbiAgY29uc3QgY29tcGFjdFR4SWQgPSB0cmltQ29ycmVsYXRpb25JZCh0eElkKTtcbiAgY29uc3QgdXNlciA9IGV4dHJhY3RVc2VyRnJvbUlkZW50aXR5KGN0eC5jbGllbnRJZGVudGl0eT8uZ2V0SUQ/LigpKTtcbiAgY29uc3QgdXNlRGVmYXVsdEZhYnJpY0Zvcm1hdHRpbmcgPSAhY29uZj8ucGF0dGVybjtcbiAgcmV0dXJuIHtcbiAgICAuLi4oY29uZiB8fCB7fSksXG4gICAgY29ycmVsYXRpb25JZDogY29uZj8uY29ycmVsYXRpb25JZCB8fCBjb21wYWN0VHhJZCxcbiAgICB1c2VyOiAoY29uZiBhcyBhbnkpPy51c2VyIHx8IHVzZXIsXG4gICAgcGF0dGVybjogY29uZj8ucGF0dGVybiB8fCBcInttZXNzYWdlfXt1c2VyfXtjb3JyZWxhdGlvbklkfSB7c3RhY2t9XCIsXG4gICAgbG9nTGV2ZWw6IHVzZURlZmF1bHRGYWJyaWNGb3JtYXR0aW5nID8gZmFsc2UgOiBjb25mPy5sb2dMZXZlbCxcbiAgICB0aW1lc3RhbXA6IHVzZURlZmF1bHRGYWJyaWNGb3JtYXR0aW5nID8gZmFsc2UgOiBjb25mPy50aW1lc3RhbXAsXG4gICAgY29udGV4dDogdXNlRGVmYXVsdEZhYnJpY0Zvcm1hdHRpbmcgPyBmYWxzZSA6IGNvbmY/LmNvbnRleHQsXG4gICAgc2VwYXJhdG9yOiB1c2VEZWZhdWx0RmFicmljRm9ybWF0dGluZyA/IFwiXCIgOiBjb25mPy5zZXBhcmF0b3IsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VXNlckZyb21JZGVudGl0eShpZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsTWF0Y2ggPSBpZC5tYXRjaChcbiAgICAvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcXC5bQS1aYS16XXsyLH0vXG4gICk7XG4gIHJldHVybiBlbWFpbE1hdGNoPy5bMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmltQ29ycmVsYXRpb25JZChpZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpZC5sZW5ndGggPD0gMTApIHJldHVybiBpZDtcbiAgcmV0dXJuIGAke2lkLnNsaWNlKDAsIDUpfS0ke2lkLnNsaWNlKC01KX1gO1xufVxuIl19
|