@webex/plugin-logger 3.0.0-bnr.5 → 3.0.0-next.2
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/.eslintrc.js +6 -0
- package/babel.config.js +3 -0
- package/dist/config.js +2 -3
- package/dist/config.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.js +40 -20
- package/dist/logger.js.map +1 -1
- package/jest.config.js +3 -0
- package/package.json +28 -9
- package/process +1 -0
- package/src/config.js +1 -1
- package/src/logger.js +27 -1
- package/test/unit/spec/logger.js +156 -16
- package/dist/plugin-logger.d.ts +0 -10
- package/dist/tsdoc-metadata.json +0 -11
- package/dist/types/config.d.ts +0 -19
- package/dist/types/index.d.ts +0 -1
- package/dist/types/logger.d.ts +0 -7
package/.eslintrc.js
ADDED
package/babel.config.js
ADDED
package/dist/config.js
CHANGED
|
@@ -20,11 +20,10 @@ exports.default = void 0;
|
|
|
20
20
|
* historyLength: 1000
|
|
21
21
|
* }
|
|
22
22
|
*/
|
|
23
|
-
var _default = {
|
|
23
|
+
var _default = exports.default = {
|
|
24
24
|
logger: {
|
|
25
25
|
level: process.env.WEBEX_LOG_LEVEL,
|
|
26
|
-
historyLength:
|
|
26
|
+
historyLength: 10000
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
|
-
exports.default = _default;
|
|
30
29
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["logger","level","process","env","WEBEX_LOG_LEVEL","historyLength"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * @typedef {Object} LoggerConfig\n * @property {string} [level=process.env.WEBEX_LOG_LEVEL] - Maximum log level that\n * should be printed to the console. One of\n * silent|error|warn|log|info|debug|trace\n * @property {number} [historyLength=1000] - Maximum number of entries to store in the log buffer.\n * @example\n * {\n * level: process.env.WEBEX_LOG_LEVEL,\n * historyLength: 1000\n * }\n */\n\nexport default {\n logger: {\n level: process.env.WEBEX_LOG_LEVEL,\n historyLength:
|
|
1
|
+
{"version":3,"names":["_default","exports","default","logger","level","process","env","WEBEX_LOG_LEVEL","historyLength"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * @typedef {Object} LoggerConfig\n * @property {string} [level=process.env.WEBEX_LOG_LEVEL] - Maximum log level that\n * should be printed to the console. One of\n * silent|error|warn|log|info|debug|trace\n * @property {number} [historyLength=1000] - Maximum number of entries to store in the log buffer.\n * @example\n * {\n * level: process.env.WEBEX_LOG_LEVEL,\n * historyLength: 1000\n * }\n */\n\nexport default {\n logger: {\n level: process.env.WEBEX_LOG_LEVEL,\n historyLength: 10000,\n },\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA,IAAAA,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAae;EACbC,MAAM,EAAE;IACNC,KAAK,EAAEC,OAAO,CAACC,GAAG,CAACC,eAAe;IAClCC,aAAa,EAAE;EACjB;AACF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -23,8 +23,8 @@ _Object$defineProperty(exports, "levels", {
|
|
|
23
23
|
var _webexCore = require("@webex/webex-core");
|
|
24
24
|
var _logger = _interopRequireWildcard(require("./logger"));
|
|
25
25
|
var _config = _interopRequireDefault(require("./config"));
|
|
26
|
-
function _getRequireWildcardCache(
|
|
27
|
-
function _interopRequireWildcard(
|
|
26
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof _WeakMap) return null; var r = new _WeakMap(), t = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
27
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
28
28
|
/*!
|
|
29
29
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
30
30
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["registerPlugin","Logger","config","replace"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Logger from './logger';\nimport config from './config';\n\nregisterPlugin('logger', Logger, {\n config,\n replace: true,\n});\n\nexport {default, levels} from './logger';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA;AAEA;AACA;AAA8B;AAAA;AAP9B;AACA;AACA;;AAOA,
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_logger","_interopRequireWildcard","_config","_interopRequireDefault","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerPlugin","Logger","config","replace"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Logger from './logger';\nimport config from './config';\n\nregisterPlugin('logger', Logger, {\n config,\n replace: true,\n});\n\nexport {default, levels} from './logger';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAA8B,SAAAK,yBAAAC,CAAA,6BAAAC,QAAA,mBAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,gBAAAK,OAAA,CAAAL,CAAA,0BAAAA,CAAA,WAAAM,OAAA,EAAAN,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAI,GAAA,CAAAP,CAAA,UAAAG,CAAA,CAAAK,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAlB,CAAA,EAAAc,CAAA,SAAAK,CAAA,GAAAR,CAAA,GAAAE,gCAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAK,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,sBAAA,CAAAH,CAAA,EAAAK,CAAA,EAAAK,CAAA,IAAAV,CAAA,CAAAK,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAL,CAAA,CAAAH,OAAA,GAAAN,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAiB,GAAA,CAAApB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAP9B;AACA;AACA;;AAOA,IAAAY,yBAAc,EAAC,QAAQ,EAAEC,eAAM,EAAE;EAC/BC,MAAM,EAANA,eAAM;EACNC,OAAO,EAAE;AACX,CAAC,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -6,18 +6,16 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.levels = exports.default = void 0;
|
|
9
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
11
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
9
12
|
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
10
13
|
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
|
|
11
14
|
var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/delete-property"));
|
|
12
|
-
var
|
|
13
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
14
|
-
var _isString2 = _interopRequireDefault(require("lodash/isString"));
|
|
15
|
-
var _isObject2 = _interopRequireDefault(require("lodash/isObject"));
|
|
16
|
-
var _isArray2 = _interopRequireDefault(require("lodash/isArray"));
|
|
17
|
-
var _has2 = _interopRequireDefault(require("lodash/has"));
|
|
18
|
-
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
15
|
+
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
19
16
|
var _common = require("@webex/common");
|
|
20
17
|
var _webexCore = require("@webex/webex-core");
|
|
18
|
+
var _lodash = require("lodash");
|
|
21
19
|
/*!
|
|
22
20
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
23
21
|
*/
|
|
@@ -33,10 +31,9 @@ var precedence = {
|
|
|
33
31
|
debug: 7,
|
|
34
32
|
trace: 8
|
|
35
33
|
};
|
|
36
|
-
var levels = (0, _keys.default)(precedence).filter(function (level) {
|
|
34
|
+
var levels = exports.levels = (0, _keys.default)(precedence).filter(function (level) {
|
|
37
35
|
return level !== 'silent';
|
|
38
36
|
});
|
|
39
|
-
exports.levels = levels;
|
|
40
37
|
var fallbacks = {
|
|
41
38
|
error: ['log'],
|
|
42
39
|
warn: ['error', 'log'],
|
|
@@ -65,16 +62,19 @@ function walkAndFilter(object) {
|
|
|
65
62
|
return object;
|
|
66
63
|
}
|
|
67
64
|
visited.push(object);
|
|
68
|
-
if ((0,
|
|
65
|
+
if ((0, _lodash.isArray)(object)) {
|
|
69
66
|
return object.map(function (o) {
|
|
70
67
|
return walkAndFilter(o, visited);
|
|
71
68
|
});
|
|
72
69
|
}
|
|
73
|
-
if (!(0,
|
|
74
|
-
if ((0,
|
|
70
|
+
if (!(0, _lodash.isObject)(object)) {
|
|
71
|
+
if ((0, _lodash.isString)(object)) {
|
|
75
72
|
if (_common.patterns.containsEmails.test(object)) {
|
|
76
73
|
return object.replace(_common.patterns.containsEmails, '[REDACTED]');
|
|
77
74
|
}
|
|
75
|
+
if (_common.patterns.containsMTID.test(object)) {
|
|
76
|
+
return object.replace(_common.patterns.containsMTID, '$1[REDACTED]');
|
|
77
|
+
}
|
|
78
78
|
}
|
|
79
79
|
return object;
|
|
80
80
|
}
|
|
@@ -146,8 +146,8 @@ var Logger = _webexCore.WebexPlugin.extend({
|
|
|
146
146
|
* @returns {Array<mixed>}
|
|
147
147
|
*/
|
|
148
148
|
filter: function filter() {
|
|
149
|
-
for (var _len = arguments.length, args = new Array(_len),
|
|
150
|
-
args[
|
|
149
|
+
for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
|
|
150
|
+
args[_key2] = arguments[_key2];
|
|
151
151
|
}
|
|
152
152
|
return args.map(function (arg) {
|
|
153
153
|
// WebexHttpError already ensures auth tokens don't get printed, so, no
|
|
@@ -164,7 +164,7 @@ var Logger = _webexCore.WebexPlugin.extend({
|
|
|
164
164
|
}
|
|
165
165
|
return arg;
|
|
166
166
|
}
|
|
167
|
-
arg = (0,
|
|
167
|
+
arg = (0, _lodash.cloneDeep)(arg);
|
|
168
168
|
return walkAndFilter(arg);
|
|
169
169
|
});
|
|
170
170
|
},
|
|
@@ -288,7 +288,7 @@ var Logger = _webexCore.WebexPlugin.extend({
|
|
|
288
288
|
}
|
|
289
289
|
return buffer.join('\n');
|
|
290
290
|
},
|
|
291
|
-
version: "3.0.0-
|
|
291
|
+
version: "3.0.0-next.2"
|
|
292
292
|
});
|
|
293
293
|
|
|
294
294
|
/**
|
|
@@ -337,6 +337,27 @@ function makeLoggerMethod(level, impl, type) {
|
|
|
337
337
|
if (item instanceof _webexCore.WebexHttpError) {
|
|
338
338
|
return item.toString();
|
|
339
339
|
}
|
|
340
|
+
if ((0, _typeof2.default)(item) === 'object') {
|
|
341
|
+
var cache = [];
|
|
342
|
+
var returnItem;
|
|
343
|
+
try {
|
|
344
|
+
returnItem = (0, _stringify.default)(item, function (_key, value) {
|
|
345
|
+
if ((0, _typeof2.default)(value) === 'object' && value !== null) {
|
|
346
|
+
if (cache.includes(value)) {
|
|
347
|
+
// Circular reference found, discard key
|
|
348
|
+
return undefined;
|
|
349
|
+
}
|
|
350
|
+
// Store value in our collection
|
|
351
|
+
cache.push(value);
|
|
352
|
+
}
|
|
353
|
+
return value;
|
|
354
|
+
});
|
|
355
|
+
} catch (e) {
|
|
356
|
+
returnItem = "Failed to stringify: ".concat(item);
|
|
357
|
+
}
|
|
358
|
+
cache = null;
|
|
359
|
+
return returnItem;
|
|
360
|
+
}
|
|
340
361
|
return item;
|
|
341
362
|
});
|
|
342
363
|
if (shouldPrint) {
|
|
@@ -348,7 +369,7 @@ function makeLoggerMethod(level, impl, type) {
|
|
|
348
369
|
var toPrint = _common.inBrowser ? stringified : filtered;
|
|
349
370
|
|
|
350
371
|
/* istanbul ignore if */
|
|
351
|
-
if (process.env.NODE_ENV === 'test' && (0,
|
|
372
|
+
if (process.env.NODE_ENV === 'test' && (0, _lodash.has)(this, 'webex.internal.device.url')) {
|
|
352
373
|
toPrint.unshift(this.webex.internal.device.url.slice(-3));
|
|
353
374
|
}
|
|
354
375
|
// eslint-disable-next-line no-console
|
|
@@ -360,7 +381,7 @@ function makeLoggerMethod(level, impl, type) {
|
|
|
360
381
|
stringified.unshift('| '.repeat(this.groupLevel));
|
|
361
382
|
buffer.push(stringified);
|
|
362
383
|
if (buffer.length > historyLength) {
|
|
363
|
-
buffer.
|
|
384
|
+
buffer.splice(0, buffer.length - historyLength);
|
|
364
385
|
}
|
|
365
386
|
if (level === 'group') this.groupLevel += 1;
|
|
366
387
|
if (level === 'groupEnd' && this.groupLevel > 0) this.groupLevel -= 1;
|
|
@@ -391,6 +412,5 @@ levels.forEach(function (level) {
|
|
|
391
412
|
});
|
|
392
413
|
Logger.prototype.client_logToBuffer = makeLoggerMethod(levels.info, levels.info, LOG_TYPES.CLIENT, true, true);
|
|
393
414
|
Logger.prototype.logToBuffer = makeLoggerMethod(levels.info, levels.info, LOG_TYPES.SDK, true, true);
|
|
394
|
-
var _default2 = Logger;
|
|
395
|
-
exports.default = _default2;
|
|
415
|
+
var _default2 = exports.default = Logger;
|
|
396
416
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["precedence","silent","group","groupEnd","error","warn","log","info","debug","trace","levels","filter","level","fallbacks","LOG_TYPES","SDK","CLIENT","SDK_LOG_TYPE_NAME","authTokenKeyPattern","walkAndFilter","object","visited","includes","push","map","o","patterns","containsEmails","test","replace","key","value","Logger","WebexPlugin","extend","namespace","derived","cache","fn","getCurrentLevel","client_level","getCurrentClientLevel","session","buffer","type","default","groupLevel","sdkBuffer","clientBuffer","args","arg","Error","process","env","NODE_ENV","inBrowser","ret","toString","stack","shouldPrint","shouldBuffer","config","bufferLogLevel","WEBEX_LOG_LEVEL","webex","internal","device","features","developer","get","clientLevel","formatLogs","getDate","clientIndex","sdkIndex","separateLogBuffers","length","Date","join","makeLoggerMethod","impl","neverPrint","alwaysBuffer","wrappedConsoleMethod","logType","clientName","historyLength","clientHistoryLength","filtered","stringified","item","WebexHttpError","toPrint","unshift","url","slice","console","logDate","toISOString","repeat","shift","reason","forEach","impls","pop","prototype","client_logToBuffer","logToBuffer"],"sources":["logger.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {inBrowser, patterns} from '@webex/common';\nimport {WebexHttpError, WebexPlugin} from '@webex/webex-core';\nimport {cloneDeep, has, isArray, isObject, isString} from 'lodash';\n\nconst precedence = {\n silent: 0,\n group: 1,\n groupEnd: 2,\n error: 3,\n warn: 4,\n log: 5,\n info: 6,\n debug: 7,\n trace: 8,\n};\n\nexport const levels = Object.keys(precedence).filter((level) => level !== 'silent');\n\nconst fallbacks = {\n error: ['log'],\n warn: ['error', 'log'],\n info: ['log'],\n debug: ['info', 'log'],\n trace: ['debug', 'info', 'log'],\n};\n\nconst LOG_TYPES = {\n SDK: 'sdk',\n CLIENT: 'client',\n};\n\nconst SDK_LOG_TYPE_NAME = 'wx-js-sdk';\n\nconst authTokenKeyPattern = /[Aa]uthorization/;\n\n/**\n * Recursively strips \"authorization\" fields from the specified object\n * @param {Object} object\n * @param {Array<mixed>} [visited]\n * @private\n * @returns {Object}\n */\nfunction walkAndFilter(object, visited = []) {\n if (visited.includes(object)) {\n // Prevent circular references\n return object;\n }\n\n visited.push(object);\n\n if (isArray(object)) {\n return object.map((o) => walkAndFilter(o, visited));\n }\n if (!isObject(object)) {\n if (isString(object)) {\n if (patterns.containsEmails.test(object)) {\n return object.replace(patterns.containsEmails, '[REDACTED]');\n }\n }\n\n return object;\n }\n\n for (const [key, value] of Object.entries(object)) {\n if (authTokenKeyPattern.test(key)) {\n Reflect.deleteProperty(object, key);\n } else {\n object[key] = walkAndFilter(value, visited);\n }\n }\n\n return object;\n}\n\n/**\n * @class\n */\nconst Logger = WebexPlugin.extend({\n namespace: 'Logger',\n\n derived: {\n level: {\n cache: false,\n fn() {\n return this.getCurrentLevel();\n },\n },\n client_level: {\n cache: false,\n fn() {\n return this.getCurrentClientLevel();\n },\n },\n },\n session: {\n // for when configured to use single buffer\n buffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n groupLevel: {\n type: 'number',\n default() {\n return 0;\n },\n },\n // for when configured to use separate buffers\n sdkBuffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n clientBuffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n /**\n * Ensures auth headers don't get printed in logs\n * @param {Array<mixed>} args\n * @private\n * @memberof Logger\n * @returns {Array<mixed>}\n */\n filter(...args) {\n return args.map((arg) => {\n // WebexHttpError already ensures auth tokens don't get printed, so, no\n // need to alter it here.\n if (arg instanceof Error) {\n // karma logs won't print subclassed errors correctly, so we need\n // explicitly call their tostring methods.\n if (process.env.NODE_ENV === 'test' && inBrowser) {\n let ret = arg.toString();\n\n ret += 'BEGIN STACK';\n ret += arg.stack;\n ret += 'END STACK';\n\n return ret;\n }\n\n return arg;\n }\n\n arg = cloneDeep(arg);\n\n return walkAndFilter(arg);\n });\n },\n\n /**\n * Determines if the current level allows logs at the specified level to be\n * printed\n * @param {string} level\n * @param {string} type type of log, SDK or client\n * @private\n * @memberof Logger\n * @returns {boolean}\n */\n shouldPrint(level, type = LOG_TYPES.SDK) {\n return (\n precedence[level] <=\n precedence[type === LOG_TYPES.SDK ? this.getCurrentLevel() : this.getCurrentClientLevel()]\n );\n },\n\n /**\n * Determines if the current level allows logs at the specified level to be\n * put into the log buffer. We're configuring it omit trace and debug logs\n * because there are *a lot* of debug logs that really don't provide value at\n * runtime (they're helpful for debugging locally, but really just pollute the\n * uploaded logs and push useful info out).\n * @param {string} level\n * @param {string} type type of log, SDK or client\n * @private\n * @memberof Logger\n * @returns {boolean}\n */\n shouldBuffer(level) {\n return (\n precedence[level] <=\n (this.config.bufferLogLevel ? precedence[this.config.bufferLogLevel] : precedence.info)\n );\n },\n\n /**\n * Indicates the current SDK log level based on env vars, feature toggles, and\n * user type.\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {string}\n */\n // eslint-disable-next-line complexity\n getCurrentLevel() {\n // If a level has been explicitly set via config, alway use it.\n if (this.config.level) {\n return this.config.level;\n }\n\n if (levels.includes(process.env.WEBEX_LOG_LEVEL)) {\n return process.env.WEBEX_LOG_LEVEL;\n }\n\n // Always use debug-level logging in test mode;\n if (process.env.NODE_ENV === 'test') {\n return 'trace';\n }\n\n // Use server-side-feature toggles to configure log levels\n const level =\n this.webex.internal.device && this.webex.internal.device.features.developer.get('log-level');\n\n if (level) {\n if (levels.includes(level)) {\n return level;\n }\n }\n\n return 'error';\n },\n\n /**\n * Indicates the current client log level based on config, defaults to SDK level\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {string}\n */\n getCurrentClientLevel() {\n // If a client log level has been explicitly set via config, alway use it.\n if (this.config.clientLevel) {\n return this.config.clientLevel;\n }\n\n // otherwise default to SDK level\n return this.getCurrentLevel();\n },\n\n /**\n * Format logs (for upload)\n *\n * If separate client, SDK buffers is configured, merge the buffers, if configured\n *\n * @instance\n * @memberof Logger\n * @public\n * @memberof Logger\n * @returns {string} formatted buffer\n */\n formatLogs() {\n function getDate(log) {\n return log[1];\n }\n let buffer = [];\n let clientIndex = 0;\n let sdkIndex = 0;\n\n if (this.config.separateLogBuffers) {\n // merge the client and sdk buffers\n // while we have entries in either buffer\n while (clientIndex < this.clientBuffer.length || sdkIndex < this.sdkBuffer.length) {\n // if we have remaining entries in the SDK buffer\n if (\n sdkIndex < this.sdkBuffer.length &&\n // and we haven't exhausted all the client buffer entries, or SDK date is before client date\n (clientIndex >= this.clientBuffer.length ||\n new Date(getDate(this.sdkBuffer[sdkIndex])) <=\n new Date(getDate(this.clientBuffer[clientIndex])))\n ) {\n // then add to the SDK buffer\n buffer.push(this.sdkBuffer[sdkIndex]);\n sdkIndex += 1;\n }\n // otherwise if we haven't exhausted all the client buffer entries, add client entry, whether it was because\n // it was the only remaining entries or date was later (the above if)\n else if (clientIndex < this.clientBuffer.length) {\n buffer.push(this.clientBuffer[clientIndex]);\n clientIndex += 1;\n }\n }\n } else {\n buffer = this.buffer;\n }\n\n return buffer.join('\\n');\n },\n});\n\n/**\n * Creates a logger method\n *\n *\n * @param {string} level level to create (info, error, warn, etc.)\n * @param {string} impl the level to use when writing to console\n * @param {string} type type of log, SDK or client\n * @param {bool} neverPrint function never prints to console\n * @param {bool} alwaysBuffer function always logs to log buffer\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {function} logger method with specified params\n */\nfunction makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer = false) {\n // Much of the complexity in the following function is due to a test-mode-only\n // helper\n return function wrappedConsoleMethod(...args) {\n // it would be easier to just pass in the name and buffer here, but the config isn't completely initialized\n // in Ampersand, even if the initialize method is used to set this up. so we keep the type to achieve\n // a sort of late binding to allow retrieving a name from config.\n const logType = type;\n const clientName =\n logType === LOG_TYPES.SDK ? SDK_LOG_TYPE_NAME : this.config.clientName || logType;\n\n let buffer;\n let historyLength;\n\n if (this.config.separateLogBuffers) {\n historyLength = this.config.clientHistoryLength\n ? this.config.clientHistoryLength\n : this.config.historyLength;\n buffer = logType === LOG_TYPES.SDK ? this.sdkBuffer : this.clientBuffer;\n } else {\n buffer = this.buffer;\n historyLength = this.config.historyLength;\n }\n\n try {\n const shouldPrint = !neverPrint && this.shouldPrint(level, logType);\n const shouldBuffer = alwaysBuffer || this.shouldBuffer(level);\n\n if (!shouldBuffer && !shouldPrint) {\n return;\n }\n\n const filtered = [clientName, ...this.filter(...args)];\n const stringified = filtered.map((item) => {\n if (item instanceof WebexHttpError) {\n return item.toString();\n }\n\n return item;\n });\n\n if (shouldPrint) {\n // when logging an object in browsers, we tend to get a dynamic\n // reference, thus going back to look at the logged value doesn't\n // necessarily show the state at log time, thus we print the stringified\n // value.\n const toPrint = inBrowser ? stringified : filtered;\n\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test' && has(this, 'webex.internal.device.url')) {\n toPrint.unshift(this.webex.internal.device.url.slice(-3));\n }\n // eslint-disable-next-line no-console\n console[impl](...toPrint);\n }\n\n if (shouldBuffer) {\n const logDate = new Date();\n\n stringified.unshift(logDate.toISOString());\n stringified.unshift('| '.repeat(this.groupLevel));\n buffer.push(stringified);\n if (buffer.length > historyLength) {\n buffer.shift();\n }\n if (level === 'group') this.groupLevel += 1;\n if (level === 'groupEnd' && this.groupLevel > 0) this.groupLevel -= 1;\n }\n } catch (reason) {\n if (!neverPrint) {\n /* istanbul ignore next */\n // eslint-disable-next-line no-console\n console.warn(`failed to execute Logger#${level}`, reason);\n }\n }\n };\n}\n\nlevels.forEach((level) => {\n let impls = fallbacks[level];\n let impl = level;\n\n if (impls) {\n impls = impls.slice();\n // eslint-disable-next-line no-console\n while (!console[impl]) {\n impl = impls.pop();\n }\n }\n\n // eslint-disable-next-line complexity\n Logger.prototype[`client_${level}`] = makeLoggerMethod(level, impl, LOG_TYPES.CLIENT);\n Logger.prototype[level] = makeLoggerMethod(level, impl, LOG_TYPES.SDK);\n});\n\nLogger.prototype.client_logToBuffer = makeLoggerMethod(\n levels.info,\n levels.info,\n LOG_TYPES.CLIENT,\n true,\n true\n);\nLogger.prototype.logToBuffer = makeLoggerMethod(\n levels.info,\n levels.info,\n LOG_TYPES.SDK,\n true,\n true\n);\n\nexport default Logger;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_common","require","_webexCore","_lodash","precedence","silent","group","groupEnd","error","warn","log","info","debug","trace","levels","exports","_keys","default","filter","level","fallbacks","LOG_TYPES","SDK","CLIENT","SDK_LOG_TYPE_NAME","authTokenKeyPattern","walkAndFilter","object","visited","arguments","length","undefined","includes","push","isArray","map","o","isObject","isString","patterns","containsEmails","test","replace","containsMTID","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","key","value","_deleteProperty","Logger","WebexPlugin","extend","namespace","derived","cache","fn","getCurrentLevel","client_level","getCurrentClientLevel","session","buffer","type","_default","groupLevel","sdkBuffer","clientBuffer","_len","args","Array","_key2","arg","Error","process","env","NODE_ENV","inBrowser","ret","toString","stack","cloneDeep","shouldPrint","shouldBuffer","config","bufferLogLevel","WEBEX_LOG_LEVEL","webex","internal","device","features","developer","get","clientLevel","formatLogs","getDate","clientIndex","sdkIndex","separateLogBuffers","Date","join","version","makeLoggerMethod","impl","neverPrint","alwaysBuffer","wrappedConsoleMethod","logType","clientName","historyLength","clientHistoryLength","filtered","concat","_toConsumableArray2","apply","stringified","item","WebexHttpError","_typeof2","returnItem","_stringify","_key","e","_console","toPrint","has","unshift","url","slice","console","logDate","toISOString","repeat","splice","reason","forEach","impls","pop","prototype","client_logToBuffer","logToBuffer","_default2"],"sources":["logger.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {inBrowser, patterns} from '@webex/common';\nimport {WebexHttpError, WebexPlugin} from '@webex/webex-core';\nimport {cloneDeep, has, isArray, isObject, isString} from 'lodash';\n\nconst precedence = {\n silent: 0,\n group: 1,\n groupEnd: 2,\n error: 3,\n warn: 4,\n log: 5,\n info: 6,\n debug: 7,\n trace: 8,\n};\n\nexport const levels = Object.keys(precedence).filter((level) => level !== 'silent');\n\nconst fallbacks = {\n error: ['log'],\n warn: ['error', 'log'],\n info: ['log'],\n debug: ['info', 'log'],\n trace: ['debug', 'info', 'log'],\n};\n\nconst LOG_TYPES = {\n SDK: 'sdk',\n CLIENT: 'client',\n};\n\nconst SDK_LOG_TYPE_NAME = 'wx-js-sdk';\n\nconst authTokenKeyPattern = /[Aa]uthorization/;\n\n/**\n * Recursively strips \"authorization\" fields from the specified object\n * @param {Object} object\n * @param {Array<mixed>} [visited]\n * @private\n * @returns {Object}\n */\nfunction walkAndFilter(object, visited = []) {\n if (visited.includes(object)) {\n // Prevent circular references\n return object;\n }\n\n visited.push(object);\n\n if (isArray(object)) {\n return object.map((o) => walkAndFilter(o, visited));\n }\n if (!isObject(object)) {\n if (isString(object)) {\n if (patterns.containsEmails.test(object)) {\n return object.replace(patterns.containsEmails, '[REDACTED]');\n }\n if (patterns.containsMTID.test(object)) {\n return object.replace(patterns.containsMTID, '$1[REDACTED]');\n }\n }\n\n return object;\n }\n\n for (const [key, value] of Object.entries(object)) {\n if (authTokenKeyPattern.test(key)) {\n Reflect.deleteProperty(object, key);\n } else {\n object[key] = walkAndFilter(value, visited);\n }\n }\n\n return object;\n}\n\n/**\n * @class\n */\nconst Logger = WebexPlugin.extend({\n namespace: 'Logger',\n\n derived: {\n level: {\n cache: false,\n fn() {\n return this.getCurrentLevel();\n },\n },\n client_level: {\n cache: false,\n fn() {\n return this.getCurrentClientLevel();\n },\n },\n },\n session: {\n // for when configured to use single buffer\n buffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n groupLevel: {\n type: 'number',\n default() {\n return 0;\n },\n },\n // for when configured to use separate buffers\n sdkBuffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n clientBuffer: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n /**\n * Ensures auth headers don't get printed in logs\n * @param {Array<mixed>} args\n * @private\n * @memberof Logger\n * @returns {Array<mixed>}\n */\n filter(...args) {\n return args.map((arg) => {\n // WebexHttpError already ensures auth tokens don't get printed, so, no\n // need to alter it here.\n if (arg instanceof Error) {\n // karma logs won't print subclassed errors correctly, so we need\n // explicitly call their tostring methods.\n if (process.env.NODE_ENV === 'test' && inBrowser) {\n let ret = arg.toString();\n\n ret += 'BEGIN STACK';\n ret += arg.stack;\n ret += 'END STACK';\n\n return ret;\n }\n\n return arg;\n }\n\n arg = cloneDeep(arg);\n\n return walkAndFilter(arg);\n });\n },\n\n /**\n * Determines if the current level allows logs at the specified level to be\n * printed\n * @param {string} level\n * @param {string} type type of log, SDK or client\n * @private\n * @memberof Logger\n * @returns {boolean}\n */\n shouldPrint(level, type = LOG_TYPES.SDK) {\n return (\n precedence[level] <=\n precedence[type === LOG_TYPES.SDK ? this.getCurrentLevel() : this.getCurrentClientLevel()]\n );\n },\n\n /**\n * Determines if the current level allows logs at the specified level to be\n * put into the log buffer. We're configuring it omit trace and debug logs\n * because there are *a lot* of debug logs that really don't provide value at\n * runtime (they're helpful for debugging locally, but really just pollute the\n * uploaded logs and push useful info out).\n * @param {string} level\n * @param {string} type type of log, SDK or client\n * @private\n * @memberof Logger\n * @returns {boolean}\n */\n shouldBuffer(level) {\n return (\n precedence[level] <=\n (this.config.bufferLogLevel ? precedence[this.config.bufferLogLevel] : precedence.info)\n );\n },\n\n /**\n * Indicates the current SDK log level based on env vars, feature toggles, and\n * user type.\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {string}\n */\n // eslint-disable-next-line complexity\n getCurrentLevel() {\n // If a level has been explicitly set via config, alway use it.\n if (this.config.level) {\n return this.config.level;\n }\n\n if (levels.includes(process.env.WEBEX_LOG_LEVEL)) {\n return process.env.WEBEX_LOG_LEVEL;\n }\n\n // Always use debug-level logging in test mode;\n if (process.env.NODE_ENV === 'test') {\n return 'trace';\n }\n\n // Use server-side-feature toggles to configure log levels\n const level =\n this.webex.internal.device && this.webex.internal.device.features.developer.get('log-level');\n\n if (level) {\n if (levels.includes(level)) {\n return level;\n }\n }\n\n return 'error';\n },\n\n /**\n * Indicates the current client log level based on config, defaults to SDK level\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {string}\n */\n getCurrentClientLevel() {\n // If a client log level has been explicitly set via config, alway use it.\n if (this.config.clientLevel) {\n return this.config.clientLevel;\n }\n\n // otherwise default to SDK level\n return this.getCurrentLevel();\n },\n\n /**\n * Format logs (for upload)\n *\n * If separate client, SDK buffers is configured, merge the buffers, if configured\n *\n * @instance\n * @memberof Logger\n * @public\n * @memberof Logger\n * @returns {string} formatted buffer\n */\n formatLogs() {\n function getDate(log) {\n return log[1];\n }\n let buffer = [];\n let clientIndex = 0;\n let sdkIndex = 0;\n\n if (this.config.separateLogBuffers) {\n // merge the client and sdk buffers\n // while we have entries in either buffer\n while (clientIndex < this.clientBuffer.length || sdkIndex < this.sdkBuffer.length) {\n // if we have remaining entries in the SDK buffer\n if (\n sdkIndex < this.sdkBuffer.length &&\n // and we haven't exhausted all the client buffer entries, or SDK date is before client date\n (clientIndex >= this.clientBuffer.length ||\n new Date(getDate(this.sdkBuffer[sdkIndex])) <=\n new Date(getDate(this.clientBuffer[clientIndex])))\n ) {\n // then add to the SDK buffer\n buffer.push(this.sdkBuffer[sdkIndex]);\n sdkIndex += 1;\n }\n // otherwise if we haven't exhausted all the client buffer entries, add client entry, whether it was because\n // it was the only remaining entries or date was later (the above if)\n else if (clientIndex < this.clientBuffer.length) {\n buffer.push(this.clientBuffer[clientIndex]);\n clientIndex += 1;\n }\n }\n } else {\n buffer = this.buffer;\n }\n\n return buffer.join('\\n');\n },\n});\n\n/**\n * Creates a logger method\n *\n *\n * @param {string} level level to create (info, error, warn, etc.)\n * @param {string} impl the level to use when writing to console\n * @param {string} type type of log, SDK or client\n * @param {bool} neverPrint function never prints to console\n * @param {bool} alwaysBuffer function always logs to log buffer\n * @instance\n * @memberof Logger\n * @private\n * @memberof Logger\n * @returns {function} logger method with specified params\n */\nfunction makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer = false) {\n // Much of the complexity in the following function is due to a test-mode-only\n // helper\n return function wrappedConsoleMethod(...args) {\n // it would be easier to just pass in the name and buffer here, but the config isn't completely initialized\n // in Ampersand, even if the initialize method is used to set this up. so we keep the type to achieve\n // a sort of late binding to allow retrieving a name from config.\n const logType = type;\n const clientName =\n logType === LOG_TYPES.SDK ? SDK_LOG_TYPE_NAME : this.config.clientName || logType;\n\n let buffer;\n let historyLength;\n\n if (this.config.separateLogBuffers) {\n historyLength = this.config.clientHistoryLength\n ? this.config.clientHistoryLength\n : this.config.historyLength;\n buffer = logType === LOG_TYPES.SDK ? this.sdkBuffer : this.clientBuffer;\n } else {\n buffer = this.buffer;\n historyLength = this.config.historyLength;\n }\n\n try {\n const shouldPrint = !neverPrint && this.shouldPrint(level, logType);\n const shouldBuffer = alwaysBuffer || this.shouldBuffer(level);\n\n if (!shouldBuffer && !shouldPrint) {\n return;\n }\n\n const filtered = [clientName, ...this.filter(...args)];\n const stringified = filtered.map((item) => {\n if (item instanceof WebexHttpError) {\n return item.toString();\n }\n if (typeof item === 'object') {\n let cache = [];\n let returnItem;\n try {\n returnItem = JSON.stringify(item, (_key, value) => {\n if (typeof value === 'object' && value !== null) {\n if (cache.includes(value)) {\n // Circular reference found, discard key\n return undefined;\n }\n // Store value in our collection\n cache.push(value);\n }\n\n return value;\n });\n } catch (e) {\n returnItem = `Failed to stringify: ${item}`;\n }\n cache = null;\n\n return returnItem;\n }\n\n return item;\n });\n\n if (shouldPrint) {\n // when logging an object in browsers, we tend to get a dynamic\n // reference, thus going back to look at the logged value doesn't\n // necessarily show the state at log time, thus we print the stringified\n // value.\n const toPrint = inBrowser ? stringified : filtered;\n\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test' && has(this, 'webex.internal.device.url')) {\n toPrint.unshift(this.webex.internal.device.url.slice(-3));\n }\n // eslint-disable-next-line no-console\n console[impl](...toPrint);\n }\n\n if (shouldBuffer) {\n const logDate = new Date();\n\n stringified.unshift(logDate.toISOString());\n stringified.unshift('| '.repeat(this.groupLevel));\n buffer.push(stringified);\n if (buffer.length > historyLength) {\n buffer.splice(0, buffer.length - historyLength);\n }\n if (level === 'group') this.groupLevel += 1;\n if (level === 'groupEnd' && this.groupLevel > 0) this.groupLevel -= 1;\n }\n } catch (reason) {\n if (!neverPrint) {\n /* istanbul ignore next */\n // eslint-disable-next-line no-console\n console.warn(`failed to execute Logger#${level}`, reason);\n }\n }\n };\n}\n\nlevels.forEach((level) => {\n let impls = fallbacks[level];\n let impl = level;\n\n if (impls) {\n impls = impls.slice();\n // eslint-disable-next-line no-console\n while (!console[impl]) {\n impl = impls.pop();\n }\n }\n\n // eslint-disable-next-line complexity\n Logger.prototype[`client_${level}`] = makeLoggerMethod(level, impl, LOG_TYPES.CLIENT);\n Logger.prototype[level] = makeLoggerMethod(level, impl, LOG_TYPES.SDK);\n});\n\nLogger.prototype.client_logToBuffer = makeLoggerMethod(\n levels.info,\n levels.info,\n LOG_TYPES.CLIENT,\n true,\n true\n);\nLogger.prototype.logToBuffer = makeLoggerMethod(\n levels.info,\n levels.info,\n LOG_TYPES.SDK,\n true,\n true\n);\n\nexport default Logger;\n"],"mappings":"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"}
|
package/jest.config.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-logger",
|
|
3
|
-
"version": "3.0.0-bnr.5",
|
|
4
3
|
"description": "",
|
|
5
4
|
"license": "MIT",
|
|
6
5
|
"main": "dist/index.js",
|
|
@@ -20,15 +19,35 @@
|
|
|
20
19
|
]
|
|
21
20
|
},
|
|
22
21
|
"devDependencies": {
|
|
22
|
+
"@babel/core": "^7.17.10",
|
|
23
|
+
"@webex/babel-config-legacy": "0.0.0",
|
|
24
|
+
"@webex/eslint-config-legacy": "0.0.0",
|
|
25
|
+
"@webex/jest-config-legacy": "0.0.0",
|
|
26
|
+
"@webex/legacy-tools": "0.0.0",
|
|
27
|
+
"@webex/test-helper-chai": "3.0.0-next.2",
|
|
28
|
+
"@webex/test-helper-mocha": "3.0.0-next.2",
|
|
29
|
+
"@webex/test-helper-mock-webex": "3.0.0-next.2",
|
|
30
|
+
"@webex/test-helper-test-users": "3.0.0-next.2",
|
|
31
|
+
"eslint": "^8.24.0",
|
|
32
|
+
"prettier": "^2.7.1",
|
|
23
33
|
"sinon": "^9.2.4"
|
|
24
34
|
},
|
|
25
35
|
"dependencies": {
|
|
26
|
-
"@webex/common": "3.0.0-
|
|
27
|
-
"@webex/
|
|
28
|
-
"@webex/test-helper-
|
|
29
|
-
"@webex/test-helper-
|
|
30
|
-
"@webex/
|
|
31
|
-
"@webex/webex-core": "3.0.0-bnr.5",
|
|
36
|
+
"@webex/common": "3.0.0-next.2",
|
|
37
|
+
"@webex/test-helper-chai": "3.0.0-next.2",
|
|
38
|
+
"@webex/test-helper-mocha": "3.0.0-next.2",
|
|
39
|
+
"@webex/test-helper-mock-webex": "3.0.0-next.2",
|
|
40
|
+
"@webex/webex-core": "3.0.0-next.2",
|
|
32
41
|
"lodash": "^4.17.21"
|
|
33
|
-
}
|
|
34
|
-
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "yarn build:src",
|
|
45
|
+
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
|
|
46
|
+
"deploy:npm": "yarn npm publish",
|
|
47
|
+
"test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
48
|
+
"test:browser": "webex-legacy-tools test --unit --runner karma",
|
|
49
|
+
"test:style": "eslint ./src/**/*.*",
|
|
50
|
+
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
51
|
+
},
|
|
52
|
+
"version": "3.0.0-next.2"
|
|
53
|
+
}
|
package/process
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = {browser: true};
|
package/src/config.js
CHANGED
package/src/logger.js
CHANGED
|
@@ -60,6 +60,9 @@ function walkAndFilter(object, visited = []) {
|
|
|
60
60
|
if (patterns.containsEmails.test(object)) {
|
|
61
61
|
return object.replace(patterns.containsEmails, '[REDACTED]');
|
|
62
62
|
}
|
|
63
|
+
if (patterns.containsMTID.test(object)) {
|
|
64
|
+
return object.replace(patterns.containsMTID, '$1[REDACTED]');
|
|
65
|
+
}
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
return object;
|
|
@@ -351,6 +354,29 @@ function makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer =
|
|
|
351
354
|
if (item instanceof WebexHttpError) {
|
|
352
355
|
return item.toString();
|
|
353
356
|
}
|
|
357
|
+
if (typeof item === 'object') {
|
|
358
|
+
let cache = [];
|
|
359
|
+
let returnItem;
|
|
360
|
+
try {
|
|
361
|
+
returnItem = JSON.stringify(item, (_key, value) => {
|
|
362
|
+
if (typeof value === 'object' && value !== null) {
|
|
363
|
+
if (cache.includes(value)) {
|
|
364
|
+
// Circular reference found, discard key
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
// Store value in our collection
|
|
368
|
+
cache.push(value);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return value;
|
|
372
|
+
});
|
|
373
|
+
} catch (e) {
|
|
374
|
+
returnItem = `Failed to stringify: ${item}`;
|
|
375
|
+
}
|
|
376
|
+
cache = null;
|
|
377
|
+
|
|
378
|
+
return returnItem;
|
|
379
|
+
}
|
|
354
380
|
|
|
355
381
|
return item;
|
|
356
382
|
});
|
|
@@ -377,7 +403,7 @@ function makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer =
|
|
|
377
403
|
stringified.unshift('| '.repeat(this.groupLevel));
|
|
378
404
|
buffer.push(stringified);
|
|
379
405
|
if (buffer.length > historyLength) {
|
|
380
|
-
buffer.
|
|
406
|
+
buffer.splice(0, buffer.length - historyLength);
|
|
381
407
|
}
|
|
382
408
|
if (level === 'group') this.groupLevel += 1;
|
|
383
409
|
if (level === 'groupEnd' && this.groupLevel > 0) this.groupLevel -= 1;
|
package/test/unit/spec/logger.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import {assert} from '@webex/test-helper-chai';
|
|
7
7
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
8
8
|
import sinon from 'sinon';
|
|
9
|
-
import {browserOnly, nodeOnly} from '@webex/test-helper-mocha';
|
|
9
|
+
import {browserOnly, nodeOnly, inBrowser} from '@webex/test-helper-mocha';
|
|
10
10
|
import Logger, {levels} from '@webex/plugin-logger';
|
|
11
11
|
import {WebexHttpError} from '@webex/webex-core';
|
|
12
12
|
|
|
@@ -48,6 +48,7 @@ describe('plugin-logger', () => {
|
|
|
48
48
|
logger: Logger,
|
|
49
49
|
},
|
|
50
50
|
});
|
|
51
|
+
webex.logger.config.historyLength = 10000;
|
|
51
52
|
});
|
|
52
53
|
|
|
53
54
|
const fallbacks = {
|
|
@@ -184,6 +185,52 @@ describe('plugin-logger', () => {
|
|
|
184
185
|
assert.lengthOf(webex.logger.buffer, 1);
|
|
185
186
|
assert.match(webex.logger.buffer[0][3], /WebexHttpError/g);
|
|
186
187
|
});
|
|
188
|
+
|
|
189
|
+
it('formats objects as strings passed to the logger for readability not [Object object]', async () => {
|
|
190
|
+
webex.config.logger.level = 'trace';
|
|
191
|
+
const obj = {
|
|
192
|
+
headers: {
|
|
193
|
+
authorization: 'Bearer',
|
|
194
|
+
trackingid: '123',
|
|
195
|
+
},
|
|
196
|
+
test: 'object',
|
|
197
|
+
nested: {
|
|
198
|
+
test2: 'object2',
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
webex.logger.log('foo', 'bar', obj);
|
|
203
|
+
assert.lengthOf(webex.logger.buffer, 1);
|
|
204
|
+
assert.lengthOf(webex.logger.buffer[0], 6);
|
|
205
|
+
assert.deepEqual(webex.logger.buffer[0][2], 'wx-js-sdk');
|
|
206
|
+
assert.deepEqual(webex.logger.buffer[0][3], 'foo');
|
|
207
|
+
assert.deepEqual(webex.logger.buffer[0][4], 'bar');
|
|
208
|
+
assert.deepEqual(webex.logger.buffer[0][5], '{"headers":{"trackingid":"123"},"test":"object","nested":{"test2":"object2"}}');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('formats objects as strings passed to the logger for readability not [Object object] w/ circular reference', async () => {
|
|
212
|
+
webex.config.logger.level = 'trace';
|
|
213
|
+
const obj = {
|
|
214
|
+
headers: {
|
|
215
|
+
authorization: 'Bearer',
|
|
216
|
+
trackingid: '123',
|
|
217
|
+
},
|
|
218
|
+
test: 'object',
|
|
219
|
+
nested: {
|
|
220
|
+
test2: 'object2',
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
obj.selfReference = obj;
|
|
225
|
+
|
|
226
|
+
webex.logger.log('foo', 'bar', obj);
|
|
227
|
+
assert.lengthOf(webex.logger.buffer, 1);
|
|
228
|
+
assert.lengthOf(webex.logger.buffer[0], 6);
|
|
229
|
+
assert.deepEqual(webex.logger.buffer[0][2], 'wx-js-sdk');
|
|
230
|
+
assert.deepEqual(webex.logger.buffer[0][3], 'foo');
|
|
231
|
+
assert.deepEqual(webex.logger.buffer[0][4], 'bar');
|
|
232
|
+
assert.deepEqual(webex.logger.buffer[0][5], '{"headers":{"trackingid":"123"},"test":"object","nested":{"test2":"object2"}}');
|
|
233
|
+
});
|
|
187
234
|
});
|
|
188
235
|
|
|
189
236
|
// We can't manipulate NODE_ENV in karma, tests, so run this chunk only in
|
|
@@ -589,11 +636,20 @@ describe('plugin-logger', () => {
|
|
|
589
636
|
trackingid: '123',
|
|
590
637
|
},
|
|
591
638
|
});
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
639
|
+
|
|
640
|
+
if(inBrowser()) {
|
|
641
|
+
assert.calledWith(console[impl(level)], 'wx-js-sdk', JSON.stringify({
|
|
642
|
+
headers: {
|
|
643
|
+
trackingid: '123',
|
|
644
|
+
},
|
|
645
|
+
}));
|
|
646
|
+
} else {
|
|
647
|
+
assert.calledWith(console[impl(level)], 'wx-js-sdk', {
|
|
648
|
+
headers: {
|
|
649
|
+
trackingid: '123',
|
|
650
|
+
},
|
|
651
|
+
});
|
|
652
|
+
}
|
|
597
653
|
});
|
|
598
654
|
});
|
|
599
655
|
});
|
|
@@ -607,15 +663,25 @@ describe('plugin-logger', () => {
|
|
|
607
663
|
});
|
|
608
664
|
|
|
609
665
|
// Assert auth was filtered
|
|
610
|
-
assert.calledWith(console.log, 'wx-js-sdk', {Key: 'myKey'});
|
|
611
666
|
|
|
612
|
-
|
|
667
|
+
if(inBrowser()) {
|
|
668
|
+
assert.calledWith(console.log, "wx-js-sdk", JSON.stringify({Key: 'myKey'}));
|
|
669
|
+
} else {
|
|
670
|
+
assert.calledWith(console.log, "wx-js-sdk", {Key: 'myKey'});
|
|
671
|
+
}
|
|
672
|
+
webex.logger.log({
|
|
613
673
|
authorization: 'XXXXXXX',
|
|
614
674
|
Key: 'myKey',
|
|
615
675
|
});
|
|
676
|
+
9
|
|
677
|
+
|
|
678
|
+
if(inBrowser()) {
|
|
679
|
+
assert.calledWith(console.log, "wx-js-sdk", JSON.stringify({Key: 'myKey'}));
|
|
616
680
|
|
|
617
|
-
|
|
618
|
-
|
|
681
|
+
} else {
|
|
682
|
+
assert.calledWith(console.log, "wx-js-sdk", {Key: 'myKey'});
|
|
683
|
+
|
|
684
|
+
} });
|
|
619
685
|
|
|
620
686
|
it('redact emails', () => {
|
|
621
687
|
webex.config.logger.level = 'trace';
|
|
@@ -627,7 +693,27 @@ describe('plugin-logger', () => {
|
|
|
627
693
|
assert.calledWith(console.log, 'wx-js-sdk', '[REDACTED]');
|
|
628
694
|
});
|
|
629
695
|
|
|
630
|
-
it('
|
|
696
|
+
it('redact MTID', () => {
|
|
697
|
+
webex.config.logger.level = 'trace';
|
|
698
|
+
|
|
699
|
+
const destination = 'https://example.com/example/j.php?MTID=m678957bc1eff989c2176b43ead9d46b5';
|
|
700
|
+
|
|
701
|
+
webex.logger.log(
|
|
702
|
+
`Info Unable to fetch meeting info for ${destination}.`
|
|
703
|
+
);
|
|
704
|
+
assert.calledWith(console.log, 'wx-js-sdk', 'Info Unable to fetch meeting info for https://example.com/example/j.php?MTID=[REDACTED]');
|
|
705
|
+
|
|
706
|
+
webex.logger.log('https://example.com/example/j.php?MTID=m678957bc1eff989c2176b43ead9d46b5&abcdefg');
|
|
707
|
+
assert.calledWith(console.log, 'wx-js-sdk', 'https://example.com/example/j.php?MTID=[REDACTED]&abcdefg');
|
|
708
|
+
|
|
709
|
+
webex.logger.log('https://example.com/example/j.php?MTID=m678957bc1eff989c2176b43ead9d46b5$abcdefg');
|
|
710
|
+
assert.calledWith(console.log, 'wx-js-sdk', 'https://example.com/example/j.php?MTID=[REDACTED]$abcdefg');
|
|
711
|
+
|
|
712
|
+
webex.logger.log('https://example.com/example/j.php?MTID=m678957bc1eff989c2176b43ead9d46b5#abcdefg');
|
|
713
|
+
assert.calledWith(console.log, 'wx-js-sdk', 'https://example.com/example/j.php?MTID=[REDACTED]#abcdefg');
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
nodeOnly(it)('handle circular references', () => {
|
|
631
717
|
webex.config.logger.level = 'trace';
|
|
632
718
|
|
|
633
719
|
const object = {
|
|
@@ -646,12 +732,19 @@ describe('plugin-logger', () => {
|
|
|
646
732
|
Key: 'myKey',
|
|
647
733
|
};
|
|
648
734
|
|
|
735
|
+
// Has self reference which is bad
|
|
649
736
|
expected.selfReference = expected;
|
|
650
737
|
|
|
651
|
-
|
|
652
|
-
|
|
738
|
+
if(inBrowser()) {
|
|
739
|
+
assert.calledWith(console.log, "wx-js-sdk", JSON.stringify(expected));
|
|
740
|
+
|
|
741
|
+
} else {
|
|
742
|
+
assert.calledWith(console.log, "wx-js-sdk", expected);
|
|
743
|
+
|
|
744
|
+
}
|
|
745
|
+
});
|
|
653
746
|
|
|
654
|
-
it('handle circular references in complex objects', () => {
|
|
747
|
+
nodeOnly(it)('handle circular references in complex objects', () => {
|
|
655
748
|
webex.config.logger.level = 'trace';
|
|
656
749
|
|
|
657
750
|
const func = () => true;
|
|
@@ -680,7 +773,7 @@ describe('plugin-logger', () => {
|
|
|
680
773
|
|
|
681
774
|
webex.logger.log(object);
|
|
682
775
|
|
|
683
|
-
|
|
776
|
+
const res = {
|
|
684
777
|
primativeString: 'justastring',
|
|
685
778
|
primativeNum: 5,
|
|
686
779
|
primativeBool: true,
|
|
@@ -697,9 +790,18 @@ describe('plugin-logger', () => {
|
|
|
697
790
|
circularObjectRef: object,
|
|
698
791
|
circularFunctionRef: func,
|
|
699
792
|
},
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
|
|
796
|
+
if(inBrowser()) {
|
|
797
|
+
assert.calledWith(console.log, "wx-js-sdk", JSON.stringify(res));
|
|
798
|
+
|
|
799
|
+
} else {
|
|
800
|
+
assert.calledWith(console.log, "wx-js-sdk", res);
|
|
801
|
+
|
|
802
|
+
}
|
|
700
803
|
});
|
|
701
804
|
});
|
|
702
|
-
});
|
|
703
805
|
|
|
704
806
|
describe('#formatLogs()', () => {
|
|
705
807
|
function sendRandomLog(log) {
|
|
@@ -802,4 +904,42 @@ describe('plugin-logger', () => {
|
|
|
802
904
|
});
|
|
803
905
|
});
|
|
804
906
|
});
|
|
907
|
+
describe('limit', () => {
|
|
908
|
+
function logMessages() {
|
|
909
|
+
return webex.logger.buffer.map((item) => item[3]);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
it('can be increased in runtime', () => {
|
|
913
|
+
webex.logger.config.historyLength = 5;
|
|
914
|
+
for (let i = 0; i < 10; i += 1) {
|
|
915
|
+
webex.logger.log(i);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
assert.deepEqual(logMessages(), [5, 6, 7, 8, 9]);
|
|
919
|
+
assert.lengthOf(webex.logger.buffer, 5);
|
|
920
|
+
|
|
921
|
+
webex.logger.config.historyLength = 10;
|
|
922
|
+
webex.logger.log(10);
|
|
923
|
+
assert.deepEqual(logMessages(), [5, 6, 7, 8, 9, 10]);
|
|
924
|
+
assert.lengthOf(webex.logger.buffer, 6);
|
|
925
|
+
});
|
|
926
|
+
|
|
927
|
+
it('can be decreased in runtime', () => {
|
|
928
|
+
for (let i = 0; i < 10; i += 1) {
|
|
929
|
+
webex.logger.log(i);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
assert.deepEqual(logMessages(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
933
|
+
assert.lengthOf(webex.logger.buffer, 10);
|
|
934
|
+
|
|
935
|
+
webex.logger.config.historyLength = 5;
|
|
936
|
+
|
|
937
|
+
// Log buffer truncated when the next log added
|
|
938
|
+
assert.lengthOf(webex.logger.buffer, 10);
|
|
939
|
+
|
|
940
|
+
webex.logger.log(10);
|
|
941
|
+
assert.deepEqual(logMessages(), [6, 7, 8, 9, 10]);
|
|
942
|
+
assert.lengthOf(webex.logger.buffer, 5);
|
|
943
|
+
});
|
|
944
|
+
});
|
|
805
945
|
});
|
package/dist/plugin-logger.d.ts
DELETED
package/dist/tsdoc-metadata.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
-
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
-
{
|
|
4
|
-
"tsdocVersion": "0.12",
|
|
5
|
-
"toolPackages": [
|
|
6
|
-
{
|
|
7
|
-
"packageName": "@microsoft/api-extractor",
|
|
8
|
-
"packageVersion": "7.34.4"
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
}
|
package/dist/types/config.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
declare namespace _default {
|
|
2
|
-
namespace logger {
|
|
3
|
-
const level: string;
|
|
4
|
-
const historyLength: number;
|
|
5
|
-
}
|
|
6
|
-
}
|
|
7
|
-
export default _default;
|
|
8
|
-
export type LoggerConfig = {
|
|
9
|
-
/**
|
|
10
|
-
* - Maximum log level that
|
|
11
|
-
* should be printed to the console. One of
|
|
12
|
-
* silent|error|warn|log|info|debug|trace
|
|
13
|
-
*/
|
|
14
|
-
level?: string;
|
|
15
|
-
/**
|
|
16
|
-
* - Maximum number of entries to store in the log buffer.
|
|
17
|
-
*/
|
|
18
|
-
historyLength?: number;
|
|
19
|
-
};
|
package/dist/types/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default, levels } from "./logger";
|