@webex/internal-plugin-support 3.7.0-next.2 → 3.7.0-next.20

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/support.js CHANGED
@@ -45,13 +45,30 @@ var Support = _webexCore.WebexPlugin.extend({
45
45
  return res.body.url;
46
46
  });
47
47
  },
48
+ /**
49
+ * Sends logs to the backend
50
+ *
51
+ * @param {Object} metadata metadata about the logs
52
+ * @param {Array} logs logs to send, if undefined, SDK's logs will be sent
53
+ * @param {Object} options additional options
54
+ * @param {string} options.type 'full' or 'diff', if not specified then the config.incrementalLogs value is used to determine the type,
55
+ * this option only applies if logs parameter is undefined
56
+ * 'diff' means that only the logs since the last log upload will be sent
57
+ * 'full' means that all the logs from internal buffers will be sent
58
+ * @returns {Promise}
59
+ */
48
60
  submitLogs: function submitLogs(metadata, logs) {
49
61
  var _this = this;
62
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
50
63
  var metadataArray = this._constructFileMetadata(metadata);
64
+ var type = options.type;
51
65
 
52
66
  // this is really testing that Ampersand is fully ready. once it's ready, these exist
53
67
  if (!logs && this.webex.logger.sdkBuffer && this.webex.logger.clientBuffer && this.webex.logger.buffer) {
54
- logs = this.webex.logger.formatLogs();
68
+ var diff = type !== undefined ? type === 'diff' : this.config.incrementalLogs;
69
+ logs = this.webex.logger.formatLogs({
70
+ diff: diff
71
+ });
55
72
  }
56
73
  var filename;
57
74
  if (metadata.locusId && metadata.callStart) {
@@ -64,7 +81,7 @@ var Support = _webexCore.WebexPlugin.extend({
64
81
  return _this.webex.credentials.getClientToken();
65
82
  }).then( /*#__PURE__*/function () {
66
83
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(token) {
67
- var headers, initalOpts, finalOpts, options;
84
+ var headers, initalOpts, finalOpts, uploadOptions;
68
85
  return _regenerator.default.wrap(function _callee$(_context) {
69
86
  while (1) switch (_context.prev = _context.next) {
70
87
  case 0:
@@ -79,7 +96,7 @@ var Support = _webexCore.WebexPlugin.extend({
79
96
  service: 'clientLogs',
80
97
  resource: 'logs/meta'
81
98
  };
82
- options = (0, _lodash.defaults)(initalOpts, {
99
+ uploadOptions = (0, _lodash.defaults)(initalOpts, {
83
100
  file: logs,
84
101
  shouldAttemptReauth: false,
85
102
  headers: headers,
@@ -106,7 +123,7 @@ var Support = _webexCore.WebexPlugin.extend({
106
123
  })
107
124
  }
108
125
  });
109
- return _context.abrupt("return", _this.webex.upload(options));
126
+ return _context.abrupt("return", _this.webex.upload(uploadOptions));
110
127
  case 5:
111
128
  case "end":
112
129
  return _context.stop();
@@ -117,9 +134,6 @@ var Support = _webexCore.WebexPlugin.extend({
117
134
  return _ref.apply(this, arguments);
118
135
  };
119
136
  }()).then(function (body) {
120
- if (_this.config.incrementalLogs) {
121
- _this.webex.logger.clearBuffers();
122
- }
123
137
  if (userId && !body.userId) {
124
138
  body.userId = userId;
125
139
  }
@@ -132,7 +146,7 @@ var Support = _webexCore.WebexPlugin.extend({
132
146
  * @returns {array}
133
147
  */
134
148
  _constructFileMetadata: function _constructFileMetadata(metadata) {
135
- var metadataArray = ['locusId', 'appVersion', 'callStart', 'feedbackId', 'correlationId', 'meetingId', 'surveySessionId', 'productAreaTag', 'issueTypeTag', 'locussessionid', 'autoupload'].map(function (key) {
149
+ var metadataArray = ['locusId', 'appVersion', 'callStart', 'feedbackId', 'correlationId', 'meetingId', 'surveySessionId', 'productAreaTag', 'issueTypeTag', 'issueDescTag', 'locussessionid', 'autoupload'].map(function (key) {
136
150
  if (metadata[key]) {
137
151
  return {
138
152
  key: key,
@@ -169,7 +183,7 @@ var Support = _webexCore.WebexPlugin.extend({
169
183
  }
170
184
  return metadataArray;
171
185
  },
172
- version: "3.7.0-next.2"
186
+ version: "3.7.0-next.20"
173
187
  });
174
188
  var _default = exports.default = Support;
175
189
  //# sourceMappingURL=support.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_lodash","_uuid","_interopRequireDefault","Support","WebexPlugin","extend","namespace","getFeedbackUrl","options","request","method","api","resource","body","defaults","appVersion","config","appType","feedbackId","uuid","v4","languageCode","then","res","url","getSupportUrl","webex","qs","submitLogs","metadata","logs","_this","metadataArray","_constructFileMetadata","logger","sdkBuffer","clientBuffer","buffer","formatLogs","filename","locusId","callStart","concat","sessionId","userId","credentials","getUserToken","catch","getClientToken","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","token","headers","initalOpts","finalOpts","wrap","_callee$","_context","prev","next","authorization","toString","service","file","shouldAttemptReauth","phases","initialize","upload","$uri","session","tempURL","finalize","$body","logFilename","data","internal","device","abrupt","stop","_x","apply","arguments","incrementalLogs","clearBuffers","map","key","value","filter","entry","Boolean","push","support","orgId","version","_default","exports"],"sources":["support.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {defaults} from 'lodash';\nimport uuid from 'uuid';\n\nconst Support = WebexPlugin.extend({\n namespace: 'Support',\n\n getFeedbackUrl(options) {\n options = options || {};\n\n return this.request({\n method: 'POST',\n api: 'conversation',\n resource: 'users/deskFeedbackUrl',\n body: defaults(options, {\n appVersion: this.config.appVersion,\n appType: this.config.appType,\n feedbackId: options.feedbackId || uuid.v4(),\n languageCode: this.config.languageCode,\n }),\n }).then((res) => res.body.url);\n },\n\n getSupportUrl() {\n return this.webex\n .request({\n method: 'GET',\n api: 'conversation',\n resource: 'users/deskSupportUrl',\n qs: {\n languageCode: this.config.languageCode,\n },\n })\n .then((res) => res.body.url);\n },\n\n submitLogs(metadata, logs) {\n const metadataArray = this._constructFileMetadata(metadata);\n\n // this is really testing that Ampersand is fully ready. once it's ready, these exist\n if (\n !logs &&\n this.webex.logger.sdkBuffer &&\n this.webex.logger.clientBuffer &&\n this.webex.logger.buffer\n ) {\n logs = this.webex.logger.formatLogs();\n }\n\n let filename;\n\n if (metadata.locusId && metadata.callStart) {\n filename = `${metadata.locusId}_${metadata.callStart}.txt`;\n } else {\n filename = `${this.webex.sessionId}.txt`;\n }\n\n let userId;\n\n return this.webex.credentials\n .getUserToken()\n .catch(() => this.webex.credentials.getClientToken())\n .then(async (token) => {\n const headers = {authorization: token.toString()};\n\n const initalOpts = {\n service: 'clientLogs',\n resource: 'logs/urls',\n };\n\n const finalOpts = {\n service: 'clientLogs',\n resource: 'logs/meta',\n };\n\n const options = defaults(initalOpts, {\n file: logs,\n shouldAttemptReauth: false,\n headers,\n phases: {\n initialize: {\n body: {\n file: filename,\n },\n },\n upload: {\n $uri: (session) => session.tempURL,\n },\n finalize: defaults(finalOpts, {\n $body: (session) => {\n userId = session.userId;\n\n return {\n filename: session.logFilename,\n data: metadataArray,\n userId: this.webex.internal.device.userId || session.userId,\n };\n },\n }),\n },\n });\n\n return this.webex.upload(options);\n })\n .then((body) => {\n if (this.config.incrementalLogs) {\n this.webex.logger.clearBuffers();\n }\n\n if (userId && !body.userId) {\n body.userId = userId;\n }\n\n return body;\n });\n },\n\n /**\n * Constructs an array of key-value pairs for log upload.\n * @param {*} metadata\n * @returns {array}\n */\n _constructFileMetadata(metadata) {\n const metadataArray = [\n 'locusId',\n 'appVersion',\n 'callStart',\n 'feedbackId',\n 'correlationId',\n 'meetingId',\n 'surveySessionId',\n 'productAreaTag',\n 'issueTypeTag',\n 'locussessionid',\n 'autoupload',\n ]\n .map((key) => {\n if (metadata[key]) {\n return {\n key,\n value: metadata[key],\n };\n }\n\n return null;\n })\n .filter((entry) => Boolean(entry));\n\n if (this.webex.sessionId) {\n metadataArray.push({\n key: 'trackingId',\n value: this.webex.sessionId,\n });\n }\n\n if (this.webex.internal.support.config.appVersion) {\n metadataArray.push({\n key: 'appVersion',\n value: this.webex.internal.support.config.appVersion,\n });\n }\n\n if (this.webex.internal.device.userId) {\n metadataArray.push({\n key: 'userId',\n value: this.webex.internal.device.userId,\n });\n }\n\n if (this.webex.internal.device.orgId) {\n metadataArray.push({\n key: 'orgId',\n value: this.webex.internal.device.orgId,\n });\n }\n\n return metadataArray;\n },\n});\n\nexport default Support;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_webexCore","require","_lodash","_uuid","_interopRequireDefault","Support","WebexPlugin","extend","namespace","getFeedbackUrl","options","request","method","api","resource","body","defaults","appVersion","config","appType","feedbackId","uuid","v4","languageCode","then","res","url","getSupportUrl","webex","qs","submitLogs","metadata","logs","_this","arguments","length","undefined","metadataArray","_constructFileMetadata","type","logger","sdkBuffer","clientBuffer","buffer","diff","incrementalLogs","formatLogs","filename","locusId","callStart","concat","sessionId","userId","credentials","getUserToken","catch","getClientToken","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","token","headers","initalOpts","finalOpts","uploadOptions","wrap","_callee$","_context","prev","next","authorization","toString","service","file","shouldAttemptReauth","phases","initialize","upload","$uri","session","tempURL","finalize","$body","logFilename","data","internal","device","abrupt","stop","_x","apply","map","key","value","filter","entry","Boolean","push","support","orgId","version","_default","exports"],"sources":["support.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {defaults} from 'lodash';\nimport uuid from 'uuid';\n\nconst Support = WebexPlugin.extend({\n namespace: 'Support',\n\n getFeedbackUrl(options) {\n options = options || {};\n\n return this.request({\n method: 'POST',\n api: 'conversation',\n resource: 'users/deskFeedbackUrl',\n body: defaults(options, {\n appVersion: this.config.appVersion,\n appType: this.config.appType,\n feedbackId: options.feedbackId || uuid.v4(),\n languageCode: this.config.languageCode,\n }),\n }).then((res) => res.body.url);\n },\n\n getSupportUrl() {\n return this.webex\n .request({\n method: 'GET',\n api: 'conversation',\n resource: 'users/deskSupportUrl',\n qs: {\n languageCode: this.config.languageCode,\n },\n })\n .then((res) => res.body.url);\n },\n\n /**\n * Sends logs to the backend\n *\n * @param {Object} metadata metadata about the logs\n * @param {Array} logs logs to send, if undefined, SDK's logs will be sent\n * @param {Object} options additional options\n * @param {string} options.type 'full' or 'diff', if not specified then the config.incrementalLogs value is used to determine the type,\n * this option only applies if logs parameter is undefined\n * 'diff' means that only the logs since the last log upload will be sent\n * 'full' means that all the logs from internal buffers will be sent\n * @returns {Promise}\n */\n submitLogs(metadata, logs, options = {}) {\n const metadataArray = this._constructFileMetadata(metadata);\n\n const {type} = options;\n\n // this is really testing that Ampersand is fully ready. once it's ready, these exist\n if (\n !logs &&\n this.webex.logger.sdkBuffer &&\n this.webex.logger.clientBuffer &&\n this.webex.logger.buffer\n ) {\n const diff = type !== undefined ? type === 'diff' : this.config.incrementalLogs;\n\n logs = this.webex.logger.formatLogs({diff});\n }\n\n let filename;\n\n if (metadata.locusId && metadata.callStart) {\n filename = `${metadata.locusId}_${metadata.callStart}.txt`;\n } else {\n filename = `${this.webex.sessionId}.txt`;\n }\n\n let userId;\n\n return this.webex.credentials\n .getUserToken()\n .catch(() => this.webex.credentials.getClientToken())\n .then(async (token) => {\n const headers = {authorization: token.toString()};\n\n const initalOpts = {\n service: 'clientLogs',\n resource: 'logs/urls',\n };\n\n const finalOpts = {\n service: 'clientLogs',\n resource: 'logs/meta',\n };\n\n const uploadOptions = defaults(initalOpts, {\n file: logs,\n shouldAttemptReauth: false,\n headers,\n phases: {\n initialize: {\n body: {\n file: filename,\n },\n },\n upload: {\n $uri: (session) => session.tempURL,\n },\n finalize: defaults(finalOpts, {\n $body: (session) => {\n userId = session.userId;\n\n return {\n filename: session.logFilename,\n data: metadataArray,\n userId: this.webex.internal.device.userId || session.userId,\n };\n },\n }),\n },\n });\n\n return this.webex.upload(uploadOptions);\n })\n .then((body) => {\n if (userId && !body.userId) {\n body.userId = userId;\n }\n\n return body;\n });\n },\n\n /**\n * Constructs an array of key-value pairs for log upload.\n * @param {*} metadata\n * @returns {array}\n */\n _constructFileMetadata(metadata) {\n const metadataArray = [\n 'locusId',\n 'appVersion',\n 'callStart',\n 'feedbackId',\n 'correlationId',\n 'meetingId',\n 'surveySessionId',\n 'productAreaTag',\n 'issueTypeTag',\n 'issueDescTag',\n 'locussessionid',\n 'autoupload',\n ]\n .map((key) => {\n if (metadata[key]) {\n return {\n key,\n value: metadata[key],\n };\n }\n\n return null;\n })\n .filter((entry) => Boolean(entry));\n\n if (this.webex.sessionId) {\n metadataArray.push({\n key: 'trackingId',\n value: this.webex.sessionId,\n });\n }\n\n if (this.webex.internal.support.config.appVersion) {\n metadataArray.push({\n key: 'appVersion',\n value: this.webex.internal.support.config.appVersion,\n });\n }\n\n if (this.webex.internal.device.userId) {\n metadataArray.push({\n key: 'userId',\n value: this.webex.internal.device.userId,\n });\n }\n\n if (this.webex.internal.device.orgId) {\n metadataArray.push({\n key: 'orgId',\n value: this.webex.internal.device.orgId,\n });\n }\n\n return metadataArray;\n },\n});\n\nexport default Support;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -20,13 +20,13 @@
20
20
  ]
21
21
  },
22
22
  "dependencies": {
23
- "@webex/internal-plugin-device": "3.7.0-next.2",
24
- "@webex/internal-plugin-search": "3.7.0-next.2",
25
- "@webex/test-helper-chai": "3.7.0-next.2",
26
- "@webex/test-helper-file": "3.7.0-next.2",
27
- "@webex/test-helper-mock-webex": "3.7.0-next.2",
28
- "@webex/test-helper-test-users": "3.7.0-next.2",
29
- "@webex/webex-core": "3.7.0-next.2",
23
+ "@webex/internal-plugin-device": "3.7.0-next.14",
24
+ "@webex/internal-plugin-search": "3.7.0-next.19",
25
+ "@webex/test-helper-chai": "3.7.0-next.14",
26
+ "@webex/test-helper-file": "3.7.0-next.14",
27
+ "@webex/test-helper-mock-webex": "3.7.0-next.14",
28
+ "@webex/test-helper-test-users": "3.7.0-next.14",
29
+ "@webex/webex-core": "3.7.0-next.14",
30
30
  "lodash": "^4.17.21",
31
31
  "uuid": "^3.3.2"
32
32
  },
@@ -46,12 +46,12 @@
46
46
  "@webex/eslint-config-legacy": "0.0.0",
47
47
  "@webex/jest-config-legacy": "0.0.0",
48
48
  "@webex/legacy-tools": "0.0.0",
49
- "@webex/test-helper-chai": "3.7.0-next.2",
50
- "@webex/test-helper-mocha": "3.7.0-next.2",
51
- "@webex/test-helper-mock-webex": "3.7.0-next.2",
52
- "@webex/test-helper-test-users": "3.7.0-next.2",
49
+ "@webex/test-helper-chai": "3.7.0-next.14",
50
+ "@webex/test-helper-mocha": "3.7.0-next.14",
51
+ "@webex/test-helper-mock-webex": "3.7.0-next.14",
52
+ "@webex/test-helper-test-users": "3.7.0-next.14",
53
53
  "eslint": "^8.24.0",
54
54
  "prettier": "^2.7.1"
55
55
  },
56
- "version": "3.7.0-next.2"
56
+ "version": "3.7.0-next.20"
57
57
  }
package/src/support.js CHANGED
@@ -38,9 +38,23 @@ const Support = WebexPlugin.extend({
38
38
  .then((res) => res.body.url);
39
39
  },
40
40
 
41
- submitLogs(metadata, logs) {
41
+ /**
42
+ * Sends logs to the backend
43
+ *
44
+ * @param {Object} metadata metadata about the logs
45
+ * @param {Array} logs logs to send, if undefined, SDK's logs will be sent
46
+ * @param {Object} options additional options
47
+ * @param {string} options.type 'full' or 'diff', if not specified then the config.incrementalLogs value is used to determine the type,
48
+ * this option only applies if logs parameter is undefined
49
+ * 'diff' means that only the logs since the last log upload will be sent
50
+ * 'full' means that all the logs from internal buffers will be sent
51
+ * @returns {Promise}
52
+ */
53
+ submitLogs(metadata, logs, options = {}) {
42
54
  const metadataArray = this._constructFileMetadata(metadata);
43
55
 
56
+ const {type} = options;
57
+
44
58
  // this is really testing that Ampersand is fully ready. once it's ready, these exist
45
59
  if (
46
60
  !logs &&
@@ -48,7 +62,9 @@ const Support = WebexPlugin.extend({
48
62
  this.webex.logger.clientBuffer &&
49
63
  this.webex.logger.buffer
50
64
  ) {
51
- logs = this.webex.logger.formatLogs();
65
+ const diff = type !== undefined ? type === 'diff' : this.config.incrementalLogs;
66
+
67
+ logs = this.webex.logger.formatLogs({diff});
52
68
  }
53
69
 
54
70
  let filename;
@@ -77,7 +93,7 @@ const Support = WebexPlugin.extend({
77
93
  resource: 'logs/meta',
78
94
  };
79
95
 
80
- const options = defaults(initalOpts, {
96
+ const uploadOptions = defaults(initalOpts, {
81
97
  file: logs,
82
98
  shouldAttemptReauth: false,
83
99
  headers,
@@ -104,13 +120,9 @@ const Support = WebexPlugin.extend({
104
120
  },
105
121
  });
106
122
 
107
- return this.webex.upload(options);
123
+ return this.webex.upload(uploadOptions);
108
124
  })
109
125
  .then((body) => {
110
- if (this.config.incrementalLogs) {
111
- this.webex.logger.clearBuffers();
112
- }
113
-
114
126
  if (userId && !body.userId) {
115
127
  body.userId = userId;
116
128
  }
@@ -135,6 +147,7 @@ const Support = WebexPlugin.extend({
135
147
  'surveySessionId',
136
148
  'productAreaTag',
137
149
  'issueTypeTag',
150
+ 'issueDescTag',
138
151
  'locussessionid',
139
152
  'autoupload',
140
153
  ]
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  /* eslint-disable no-underscore-dangle */
6
-
6
+ import sinon from 'sinon';
7
7
  import Support from '@webex/internal-plugin-support';
8
8
  import {assert} from '@webex/test-helper-chai';
9
9
  import MockWebex from '@webex/test-helper-mock-webex';
@@ -151,12 +151,73 @@ describe('plugin-support', () => {
151
151
 
152
152
  assert.equal(found?.value, autoupload);
153
153
  });
154
+
155
+ it('sends issuedesctag if specified in metadata', () => {
156
+ const issueDescTag = 'issueDescTag';
157
+ const result = webex.internal.support._constructFileMetadata({issueDescTag});
158
+ const found = result.find((attr) => attr.key === 'issueDescTag');
159
+
160
+ assert.equal(found?.value, issueDescTag);
161
+ });
154
162
  });
155
163
 
156
164
  describe('#submitLogs()', () => {
165
+ beforeEach(() => {
166
+ webex.logger = {
167
+ formatLogs: sinon.stub().returns(['fake logs']),
168
+ sdkBuffer: [],
169
+ clientBuffer: [],
170
+ buffer: [],
171
+ };
172
+ webex.upload = sinon.stub().returns(Promise.resolve({}));
173
+ });
174
+
157
175
  it('calls getUserToken', () => {
158
176
  webex.internal.support.submitLogs({});
159
177
  assert.calledOnce(webex.credentials.getUserToken);
160
178
  });
179
+
180
+ [
181
+ {type: undefined, incrementalLogsConfig: true, expectedDiff: true},
182
+ {type: undefined, incrementalLogsConfig: false, expectedDiff: false},
183
+
184
+ {type: 'full', incrementalLogsConfig: true, expectedDiff: false}, // the sendFullLog param overrides the config
185
+ {type: 'full', incrementalLogsConfig: false, expectedDiff: false},
186
+
187
+ {type: 'diff', incrementalLogsConfig: true, expectedDiff: true},
188
+ {type: 'diff', incrementalLogsConfig: false, expectedDiff: true}, // the sendFullLog param overrides the config
189
+ ].forEach(({type, incrementalLogsConfig, expectedDiff}) => {
190
+ it(`submits ${
191
+ expectedDiff ? 'incremental' : 'full'
192
+ } logs if called with options.type=${type} and config.incrementalLogs=${incrementalLogsConfig}`, async () => {
193
+ webex.internal.support.config.incrementalLogs = incrementalLogsConfig;
194
+ if (type !== undefined) {
195
+ await webex.internal.support.submitLogs({}, undefined, {type});
196
+ } else {
197
+ await webex.internal.support.submitLogs({});
198
+ }
199
+
200
+ assert.calledOnceWithExactly(webex.logger.formatLogs, {diff: expectedDiff});
201
+ assert.calledOnce(webex.upload);
202
+
203
+ const uploadArgs = webex.upload.args[0];
204
+
205
+ assert.deepEqual(uploadArgs[0].file, ['fake logs']);
206
+ });
207
+
208
+ it('submits provided logs', async () => {
209
+ webex.internal.support.config.incrementalLogs = incrementalLogsConfig;
210
+ const testLogs = ['test logs'];
211
+
212
+ await webex.internal.support.submitLogs({}, testLogs);
213
+
214
+ assert.notCalled(webex.logger.formatLogs);
215
+ assert.calledOnce(webex.upload);
216
+
217
+ const uploadArgs = webex.upload.args[0];
218
+
219
+ assert.deepEqual(uploadArgs[0].file, ['test logs']);
220
+ });
221
+ });
161
222
  });
162
223
  });