@webex/internal-plugin-metrics 3.12.0-llmrefactor.1 → 3.12.0-llmrefactor.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.
Files changed (30) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/metrics.js +1 -1
  3. package/dist/metrics.types.js.map +1 -1
  4. package/dist/new-metrics.js +44 -11
  5. package/dist/new-metrics.js.map +1 -1
  6. package/dist/privacy-and-security-permission-enricher/constants.js +18 -0
  7. package/dist/privacy-and-security-permission-enricher/constants.js.map +1 -0
  8. package/dist/privacy-and-security-permission-enricher/index.js +143 -0
  9. package/dist/privacy-and-security-permission-enricher/index.js.map +1 -0
  10. package/dist/privacy-and-security-permission-enricher/types.js +7 -0
  11. package/dist/privacy-and-security-permission-enricher/types.js.map +1 -0
  12. package/dist/privacy-and-security-permission-enricher/utils.js +71 -0
  13. package/dist/privacy-and-security-permission-enricher/utils.js.map +1 -0
  14. package/dist/types/index.d.ts +2 -2
  15. package/dist/types/metrics.types.d.ts +3 -0
  16. package/dist/types/new-metrics.d.ts +13 -1
  17. package/dist/types/privacy-and-security-permission-enricher/constants.d.ts +6 -0
  18. package/dist/types/privacy-and-security-permission-enricher/index.d.ts +40 -0
  19. package/dist/types/privacy-and-security-permission-enricher/types.d.ts +14 -0
  20. package/dist/types/privacy-and-security-permission-enricher/utils.d.ts +5 -0
  21. package/package.json +7 -7
  22. package/src/index.ts +2 -0
  23. package/src/metrics.types.ts +9 -0
  24. package/src/new-metrics.ts +41 -2
  25. package/src/privacy-and-security-permission-enricher/constants.ts +33 -0
  26. package/src/privacy-and-security-permission-enricher/index.ts +142 -0
  27. package/src/privacy-and-security-permission-enricher/types.ts +21 -0
  28. package/src/privacy-and-security-permission-enricher/utils.ts +82 -0
  29. package/test/unit/spec/new-metrics.ts +144 -48
  30. package/test/unit/spec/privacy-and-security-permission-enricher.ts +318 -0
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
4
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
5
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
6
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
7
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
8
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
9
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
10
+ _Object$defineProperty(exports, "__esModule", {
11
+ value: true
12
+ });
13
+ exports.resolveMediaResources = exports.resolveContentShareResources = exports.projectPrivacyAndSecurityPermission = exports.getChangedPermission = void 0;
14
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
16
+ var _lodash = require("lodash");
17
+ function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
19
+ var resolveMediaResources = exports.resolveMediaResources = function resolveMediaResources(payload) {
20
+ switch (payload === null || payload === void 0 ? void 0 : payload.mediaType) {
21
+ case 'audio':
22
+ return ['microphone'];
23
+ case 'video':
24
+ return ['camera'];
25
+ case 'share':
26
+ return ['contentShare'];
27
+ default:
28
+ return [];
29
+ }
30
+ };
31
+ var resolveContentShareResources = exports.resolveContentShareResources = function resolveContentShareResources(payload) {
32
+ if ((payload === null || payload === void 0 ? void 0 : payload.mediaType) !== 'share') {
33
+ return [];
34
+ }
35
+ return ['contentShare'];
36
+ };
37
+ var copyPermissionState = function copyPermissionState(source, target, resource) {
38
+ switch (resource) {
39
+ case 'camera':
40
+ if (source.camera) {
41
+ target.camera = _objectSpread({}, source.camera);
42
+ }
43
+ break;
44
+ case 'microphone':
45
+ if (source.microphone) {
46
+ target.microphone = _objectSpread({}, source.microphone);
47
+ }
48
+ break;
49
+ case 'contentShare':
50
+ if (source.contentShare) {
51
+ target.contentShare = _objectSpread({}, source.contentShare);
52
+ }
53
+ break;
54
+ default:
55
+ break;
56
+ }
57
+ };
58
+ var projectPrivacyAndSecurityPermission = exports.projectPrivacyAndSecurityPermission = function projectPrivacyAndSecurityPermission(permission, resources) {
59
+ var projectedPermission = {};
60
+ resources.forEach(function (resource) {
61
+ copyPermissionState(permission, projectedPermission, resource);
62
+ });
63
+ return (0, _keys.default)(projectedPermission).length > 0 ? projectedPermission : undefined;
64
+ };
65
+ var getChangedPermission = exports.getChangedPermission = function getChangedPermission(current, previous) {
66
+ var changedResources = (0, _keys.default)(current).filter(function (resource) {
67
+ return !(0, _lodash.isEqual)(current[resource], previous[resource]);
68
+ });
69
+ return projectPrivacyAndSecurityPermission(current, changedResources);
70
+ };
71
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_lodash","require","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","resolveMediaResources","exports","payload","mediaType","resolveContentShareResources","copyPermissionState","source","target","resource","camera","microphone","contentShare","projectPrivacyAndSecurityPermission","permission","resources","projectedPermission","_keys","undefined","getChangedPermission","current","previous","changedResources","isEqual"],"sources":["utils.ts"],"sourcesContent":["import {isEqual} from 'lodash';\n\nimport type {\n ClientEventPayload,\n PrivacyAndSecurityPermission,\n PrivacyAndSecurityPermissionResource,\n} from '../metrics.types';\n\nexport const resolveMediaResources = (\n payload?: ClientEventPayload\n): PrivacyAndSecurityPermissionResource[] => {\n switch (payload?.mediaType) {\n case 'audio':\n return ['microphone'];\n case 'video':\n return ['camera'];\n case 'share':\n return ['contentShare'];\n default:\n return [];\n }\n};\n\nexport const resolveContentShareResources = (\n payload?: ClientEventPayload\n): PrivacyAndSecurityPermissionResource[] => {\n if (payload?.mediaType !== 'share') {\n return [];\n }\n\n return ['contentShare'];\n};\n\nconst copyPermissionState = (\n source: PrivacyAndSecurityPermission,\n target: PrivacyAndSecurityPermission,\n resource: PrivacyAndSecurityPermissionResource\n): void => {\n switch (resource) {\n case 'camera':\n if (source.camera) {\n target.camera = {...source.camera};\n }\n break;\n case 'microphone':\n if (source.microphone) {\n target.microphone = {...source.microphone};\n }\n break;\n case 'contentShare':\n if (source.contentShare) {\n target.contentShare = {...source.contentShare};\n }\n break;\n default:\n break;\n }\n};\n\nexport const projectPrivacyAndSecurityPermission = (\n permission: PrivacyAndSecurityPermission,\n resources: readonly PrivacyAndSecurityPermissionResource[]\n): PrivacyAndSecurityPermission | undefined => {\n const projectedPermission: PrivacyAndSecurityPermission = {};\n\n resources.forEach((resource) => {\n copyPermissionState(permission, projectedPermission, resource);\n });\n\n return Object.keys(projectedPermission).length > 0 ? projectedPermission : undefined;\n};\n\nexport const getChangedPermission = (\n current: PrivacyAndSecurityPermission,\n previous: PrivacyAndSecurityPermission\n): PrivacyAndSecurityPermission | undefined => {\n const changedResources = (Object.keys(current) as PrivacyAndSecurityPermissionResource[]).filter(\n (resource) => !isEqual(current[resource], previous[resource])\n );\n\n return projectPrivacyAndSecurityPermission(current, changedResources);\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAA+B,SAAAC,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAQxB,IAAMqB,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG,SAAxBA,qBAAqBA,CAChCE,OAA4B,EACe;EAC3C,QAAQA,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,SAAS;IACxB,KAAK,OAAO;MACV,OAAO,CAAC,YAAY,CAAC;IACvB,KAAK,OAAO;MACV,OAAO,CAAC,QAAQ,CAAC;IACnB,KAAK,OAAO;MACV,OAAO,CAAC,cAAc,CAAC;IACzB;MACE,OAAO,EAAE;EACb;AACF,CAAC;AAEM,IAAMC,4BAA4B,GAAAH,OAAA,CAAAG,4BAAA,GAAG,SAA/BA,4BAA4BA,CACvCF,OAA4B,EACe;EAC3C,IAAI,CAAAA,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,SAAS,MAAK,OAAO,EAAE;IAClC,OAAO,EAAE;EACX;EAEA,OAAO,CAAC,cAAc,CAAC;AACzB,CAAC;AAED,IAAME,mBAAmB,GAAG,SAAtBA,mBAAmBA,CACvBC,MAAoC,EACpCC,MAAoC,EACpCC,QAA8C,EACrC;EACT,QAAQA,QAAQ;IACd,KAAK,QAAQ;MACX,IAAIF,MAAM,CAACG,MAAM,EAAE;QACjBF,MAAM,CAACE,MAAM,GAAAnB,aAAA,KAAOgB,MAAM,CAACG,MAAM,CAAC;MACpC;MACA;IACF,KAAK,YAAY;MACf,IAAIH,MAAM,CAACI,UAAU,EAAE;QACrBH,MAAM,CAACG,UAAU,GAAApB,aAAA,KAAOgB,MAAM,CAACI,UAAU,CAAC;MAC5C;MACA;IACF,KAAK,cAAc;MACjB,IAAIJ,MAAM,CAACK,YAAY,EAAE;QACvBJ,MAAM,CAACI,YAAY,GAAArB,aAAA,KAAOgB,MAAM,CAACK,YAAY,CAAC;MAChD;MACA;IACF;MACE;EACJ;AACF,CAAC;AAEM,IAAMC,mCAAmC,GAAAX,OAAA,CAAAW,mCAAA,GAAG,SAAtCA,mCAAmCA,CAC9CC,UAAwC,EACxCC,SAA0D,EACb;EAC7C,IAAMC,mBAAiD,GAAG,CAAC,CAAC;EAE5DD,SAAS,CAACpB,OAAO,CAAC,UAACc,QAAQ,EAAK;IAC9BH,mBAAmB,CAACQ,UAAU,EAAEE,mBAAmB,EAAEP,QAAQ,CAAC;EAChE,CAAC,CAAC;EAEF,OAAO,IAAAQ,KAAA,CAAApB,OAAA,EAAYmB,mBAAmB,CAAC,CAACvB,MAAM,GAAG,CAAC,GAAGuB,mBAAmB,GAAGE,SAAS;AACtF,CAAC;AAEM,IAAMC,oBAAoB,GAAAjB,OAAA,CAAAiB,oBAAA,GAAG,SAAvBA,oBAAoBA,CAC/BC,OAAqC,EACrCC,QAAsC,EACO;EAC7C,IAAMC,gBAAgB,GAAI,IAAAL,KAAA,CAAApB,OAAA,EAAYuB,OAAO,CAAC,CAA4ClC,MAAM,CAC9F,UAACuB,QAAQ;IAAA,OAAK,CAAC,IAAAc,eAAO,EAACH,OAAO,CAACX,QAAQ,CAAC,EAAEY,QAAQ,CAACZ,QAAQ,CAAC,CAAC;EAAA,CAC/D,CAAC;EAED,OAAOI,mCAAmC,CAACO,OAAO,EAAEE,gBAAgB,CAAC;AACvE,CAAC","ignoreList":[]}
@@ -5,7 +5,7 @@ import config from './config';
5
5
  import NewMetrics from './new-metrics';
6
6
  import * as Utils from './utils';
7
7
  import * as AutomatedUserUtils from './automated-user';
8
- import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitBusinessEvent, SubmitMQE, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName } from './metrics.types';
8
+ import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitBusinessEvent, SubmitMQE, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName, PrivacyAndSecurityPermission } from './metrics.types';
9
9
  import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
10
10
  import * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';
11
11
  import CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';
@@ -18,4 +18,4 @@ import PreLoginMetrics from './prelogin-metrics';
18
18
  export { default, getOSNameInternal } from './metrics';
19
19
  export { config, CALL_DIAGNOSTIC_CONFIG, AutomatedUserUtils, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, RtcMetrics, PreLoginMetrics, };
20
20
  export { isAutomatedUser, isAutomatedUserAgent } from './automated-user';
21
- export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, SubmitBusinessEvent, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName, };
21
+ export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, SubmitBusinessEvent, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName, PrivacyAndSecurityPermission, };
@@ -8,6 +8,9 @@ export type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment'
8
8
  export type ClientLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['clientLaunchMethod'];
9
9
  export type ClientUserNameInput = NonNullable<RawClientEvent['userNameInput']>;
10
10
  export type ClientEmailInput = NonNullable<RawClientEvent['emailInput']>;
11
+ export type PrivacyAndSecurityPermission = NonNullable<RawClientEvent['privacyAndSecurityPermission']>;
12
+ export type PrivacyAndSecurityPermissionResource = keyof PrivacyAndSecurityPermission;
13
+ export type PrivacyAndSecurityPermissionState = PrivacyAndSecurityPermission[PrivacyAndSecurityPermissionResource];
11
14
  export type BrowserLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['browserLaunchMethod'];
12
15
  export type MetricEventProduct = 'webex' | 'wxcc_desktop' | 'wxcc_crm' | 'wxcc_sdk';
13
16
  export type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service' | 'api';
@@ -4,7 +4,7 @@ import BehavioralMetrics from './behavioral-metrics';
4
4
  import OperationalMetrics from './operational-metrics';
5
5
  import BusinessMetrics from './business-metrics';
6
6
  import PreLoginMetrics from './prelogin-metrics';
7
- import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions, Table, DelayedClientEvent, DelayedClientFeatureEvent } from './metrics.types';
7
+ import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions, Table, DelayedClientEvent, DelayedClientFeatureEvent, PrivacyAndSecurityPermission } from './metrics.types';
8
8
  import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
9
9
  /**
10
10
  * Metrics plugin to centralize all types of metrics.
@@ -33,6 +33,7 @@ declare class Metrics extends WebexPlugin {
33
33
  */
34
34
  delayedClientEventsOverrides: Partial<DelayedClientEvent['options']>;
35
35
  delayedClientFeatureEventsOverrides: Partial<DelayedClientFeatureEvent['options']>;
36
+ private privacyAndSecurityPermissionEnricher;
36
37
  /**
37
38
  * Constructor
38
39
  * @param args
@@ -151,6 +152,17 @@ declare class Metrics extends WebexPlugin {
151
152
  payload?: RecursivePartial<ClientEvent['payload']>;
152
153
  options?: SubmitClientEventOptions;
153
154
  }): Promise<any>;
155
+ /**
156
+ * Stores the latest browser permission state supplied by the client.
157
+ * @param permission latest normalized permission snapshot
158
+ */
159
+ setPrivacyAndSecurityPermission(permission: PrivacyAndSecurityPermission): void;
160
+ /**
161
+ * Resolves event options to the call identity used by Call Diagnostic where possible.
162
+ * @param options client event options
163
+ * @returns the permission history scope
164
+ */
165
+ private getPermissionScope;
154
166
  /**
155
167
  * Issue request to alias a user's pre-login ID with their CI UUID
156
168
  * @param {string} preLoginId
@@ -0,0 +1,6 @@
1
+ import type { PermissionEnrichmentPolicy } from './types';
2
+ export declare const CAMERA_AND_MICROPHONE_PERMISSION_EVENTS: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
3
+ export declare const MEDIA_TX_PERMISSION_EVENTS: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
4
+ export declare const CONTENT_SHARE_PERMISSION_EVENTS: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
5
+ export declare const FINAL_PERMISSION_EVENTS: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
6
+ export declare const NO_PERMISSION_ENRICHMENT: PermissionEnrichmentPolicy;
@@ -0,0 +1,40 @@
1
+ import type { ClientEventPayload, PrivacyAndSecurityPermission } from '../metrics.types';
2
+ import type { PermissionEnrichmentContext } from './types';
3
+ export declare const PERMISSION_ENRICHMENT_RULES: ({
4
+ events: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
5
+ resolve: (payload: import("../metrics.types").RecursivePartial<import("@webex/event-dictionary-ts").ClientEvent>) => {
6
+ resources: ("additionalProperties" | "camera" | "microphone" | "contentShare")[];
7
+ terminal: false;
8
+ };
9
+ } | {
10
+ events: Set<"client.abort.join" | "client.alert.displayed" | "client.alert.removed" | "client.application.validate" | "client.audio.noise.removal" | "client.breakout-session.join.request" | "client.breakout-session.join.response" | "client.breakout-session.leave" | "client.breakout-session.move.request" | "client.breakout-session.move.response" | "client.call.aborted" | "client.call.declined" | "client.call.fallback" | "client.call.diagnostics" | "client.call.displayed" | "client.call.info" | "client.call.initiated" | "client.call.leave" | "client.call.move-media" | "client.call.remote-ended" | "client.call.remote-started" | "client.call.skip-locus-join" | "client.ci.exchange-token.request" | "client.ci.exchange-token.response" | "client.conversation.request" | "client.conversation.response" | "client.click.pre-join" | "client.crash" | "client.daemon.join.begin" | "client.daemon.job.done" | "client.daemon.launch-meeting-process" | "client.daemon.pending-on-existing-upgrade-job" | "client.daemon.query-site-info" | "client.daemon.upgrade-and-join" | "client.daemon.wakeup-meeting-client" | "client.duplicate.join" | "client.device.resource-room.joined" | "client.dialog-window.dismissed" | "client.dialog-window.selected" | "client.dialog-window.showed" | "client.e2ee.join.response" | "client.embedded-authorize-page.loaded" | "client.embedded-object-info" | "client.entering-background" | "client.entering-foreground" | "client.exit.app" | "client.gesture.recognition" | "client.hologram.initiated" | "client.hologram.stopped" | "client.hologram.remote.initiated" | "client.hologram.remote.stopped" | "client.hung" | "client.ice.end" | "client.ice.start" | "client.idbroker.authorize.request" | "client.idbroker.authorize.response" | "client.idbroker.client-credential.request" | "client.idbroker.client-credential.response" | "client.idbroker.cloud-reduced-scope.request" | "client.idbroker.direct-authorize.request" | "client.idbroker.direct-authorize.response" | "client.idbroker.cloud-reduced-scope.response" | "client.idbroker.exchange-token.request" | "client.idbroker.exchange-token.response" | "client.idbroker.kms-reduced-scope.request" | "client.idbroker.kms-reduced-scope.response" | "client.idbroker.scim.request" | "client.idbroker.scim.response" | "client.idbroker.user-invoke.request" | "client.idbroker.user-invoke.response" | "client.installer.start" | "client.installer.end" | "client.installer.download-app" | "client.installer.decompress-app" | "client.installer.fallback" | "client.installer.install-app" | "client.installer.launch-app" | "client.installer.switch.to.webapp" | "client.launcher.start" | "client.launcher.selfupgrade.start" | "client.launcher.selfupgrade.end" | "client.launcher.downloadapp.start" | "client.launcher.downloadapp.end" | "client.launcher.launchapp" | "client.launcher.end" | "client.launcher.restart.begin" | "client.launcher.restart.end" | "client.license.activations.request" | "client.license.activations.response" | "client.llm.connect.response" | "client.interstitial-window.launched" | "client.interstitial-window.start-launch" | "client.ivr.join.request" | "client.ivr.join.response" | "client.ivr.leave.request" | "client.ivr.leave.response" | "client.ivr.notify.request" | "client.ivr.notify.response" | "client.lobby.entered" | "client.lobby.exited" | "client.locus.decline.request" | "client.locus.join.request" | "client.locus.join.response" | "client.locus.leave.request" | "client.locus.leave.response" | "client.locus.media.request" | "client.locus.media.response" | "client.locus.sync.complete" | "client.media-engine.crash" | "client.media-engine.launched" | "client.media-engine.lost" | "client.media-engine.local-sdp-generated" | "client.media-engine.ready" | "client.media-engine.remote-sdp-received" | "client.media-engine.start-launch" | "client.media-device.ready" | "client.media-device.stop" | "client.media-device.error" | "client.media-status" | "client.media.capabilities" | "client.media.ready" | "client.media.reachability" | "client.media.reconnecting" | "client.media.recovered" | "client.media.render.start" | "client.media.render.stop" | "client.media.rx.start" | "client.media.rx.stop" | "client.media.share.csi.changed" | "client.media.tx.start" | "client.media.tx.stop" | "client.meetinginfo.request" | "client.meetinginfo.response" | "client.meetingmanagersdk.ipc.run" | "client.meeting.app-loaded" | "client.meeting.breakout-session.action" | "client.meeting.breakout-session.summary" | "client.meeting.browser-plugin.started" | "client.meeting.click.joinbutton" | "client.meeting.closed" | "client.meeting.disclaimer-window.accepted" | "client.meeting.disclaimer-window.closed" | "client.meeting.disclaimer-window.showed" | "client.meeting.docshow.request" | "client.meeting.docshow.response" | "client.meeting.e2e.u2c.response" | "client.meeting.e2e.wca.response" | "client.meeting.e2e.key.response" | "client.meeting.e2ee.u2c.response" | "client.meeting.e2ee.wca.response" | "client.meeting.e2ee.key.response" | "client.meeting.gpc.download" | "client.meeting.gpcparameter.request" | "client.meeting.gpcparameter.response" | "client.meeting.interstitial-window.closed" | "client.meeting.interstitial-window.showed" | "client.meeting.join.request" | "client.meeting.key-information" | "client.meeting.launched" | "client.meeting.login-window.clicked" | "client.meeting.login-window.closed" | "client.meeting.login-window.showed" | "client.meeting.login.response" | "client.meeting.people-insights.check.response" | "client.meeting.people-insights.query.response" | "client.meeting.ping.request" | "client.meeting.ping.response" | "client.meeting.plugin-extension.started" | "client.meeting.resume" | "client.meeting.report-log" | "client.meeting.session.connected" | "client.meeting.start-webexapp" | "client.meeting.start-launch" | "client.meeting.summary" | "client.meeting.user-action" | "client.meeting.validated" | "client.meeting.VDI.detect.plugin.response" | "client.meeting.VDI.connect.plugin.response" | "client.mercury.connection.lost" | "client.mercury.connection.restored" | "client.mercury.connection.start" | "client.mercury.connection.connected" | "client.multistream.sca.rx" | "client.multistream.sca.tx" | "client.multistream.scr.rx" | "client.multistream.scr.tx" | "client.muted" | "client.network.changed" | "client.notification.received" | "client.onboarding-window.start" | "client.onboarding-window.end" | "client.permission.closed" | "client.permission.prompted" | "client.pin.collected" | "client.pin.prompt" | "client.post.meeting.hook" | "client.pstnaudio.attempt.correlation" | "client.pstnaudio.attempt.finish" | "client.pstnaudio.attempt.skip" | "client.pstnaudio.attempt.start" | "client.roap-message.received" | "client.roap-message.sent" | "client.scheduling.initiate" | "client.scheduling.notification" | "client.share.floor-accept.notification" | "client.share.floor-grant.cancel-request" | "client.share.floor-grant.notification" | "client.share.floor-grant.request" | "client.share.floor-granted.local" | "client.share.initiated" | "client.share.layout.displayed" | "client.share.paused" | "client.share.selected-app" | "client.share.stopped" | "client.sign-in.start" | "client.sign-in.end" | "client.started-after-shutdown" | "client.started-from-crash" | "client.stuntrace.failed" | "client.switch.app" | "client.terminate.app" | "client.unmuted" | "client.webexapp.start-launch" | "client.webexapp.launched" | "client.login.start" | "client.login.end" | "client.startup.start" | "client.startup.end" | "client.switch.environment" | "client.u2c.limited-catalog.request" | "client.u2c.limited-catalog.response" | "client.u2c.signin-catalog.request" | "client.u2c.signin-catalog.response" | "client.upgrade-window.accepted" | "client.upgrade-window.closed" | "client.upgrade-window.showed" | "client.waiting.user-action" | "client.warhol.downloaded" | "client.wdm.device-registration.request" | "client.wdm.device-registration.response" | "client.webapp-download.start" | "client.webapp-download.in-progress" | "client.webapp-download.end" | "client.whiteboard.loaded" | "client.call.survey.trigger" | "meeting.initiated" | "meeting.converged.initiated" | "meeting.joined" | "page.click.pre-join" | "page.client.abort.join" | "page.client.interstitial-window.launched" | "page.meeting.browser-reset" | "page.meeting.close-browser" | "page.meeting.extension.started" | "page.meeting.extension.app.starting" | "page.meeting.extension.app.started" | "page.meeting.join-fallback.dismiss" | "page.meeting.join-fallback" | "page.meeting.launch-thinclient" | "page.meeting.launched-duplicate.context" | "page.meeting.loading" | "page.meeting.mobile.call" | "page.meeting.mobile.download" | "page.meeting.mobile.join-link" | "page.meeting.plugin.launch-meeting" | "page.meeting.run-plugin" | "page.meeting.switch.to.webapp" | "page.meeting.testing-plugin" | "page.meeting.testing-plugin.finished" | "page.meeting.tfs.start-download" | "page.meeting.urlprotocol.detect" | "page.meeting.waiting.user-action" | "page.meeting.webexapp.launched" | "page.meeting.webinstaller.started" | "page.meeting.webinstaller.ended" | "client.feature.ptplugin.distribution">;
11
+ resolve: () => {
12
+ resources: ("camera" | "microphone" | "contentShare")[];
13
+ terminal: true;
14
+ };
15
+ })[];
16
+ /**
17
+ * Enriches eligible client events with relevant browser permission changes.
18
+ */
19
+ export default class PrivacyAndSecurityPermissionEnricher {
20
+ private permission?;
21
+ private lastReported;
22
+ private readonly onEnrichmentError;
23
+ /**
24
+ * Creates a permission enricher.
25
+ * @param {Function} onEnrichmentError permission enrichment error handler
26
+ */
27
+ constructor(onEnrichmentError: (error: unknown) => void);
28
+ /**
29
+ * Stores the latest normalized browser permission state.
30
+ * @param {PrivacyAndSecurityPermission} permission permission snapshot
31
+ * @returns {void}
32
+ */
33
+ setPermission(permission: PrivacyAndSecurityPermission): void;
34
+ /**
35
+ * Returns the original payload or a copy enriched with relevant permission changes.
36
+ * @param {PermissionEnrichmentContext} context event context and permission history scope
37
+ * @returns {ClientEventPayload | undefined}
38
+ */
39
+ enrich({ name, payload, scope, }: PermissionEnrichmentContext): ClientEventPayload | undefined;
40
+ }
@@ -0,0 +1,14 @@
1
+ import type { ClientEvent, ClientEventPayload, PrivacyAndSecurityPermissionResource } from '../metrics.types';
2
+ export type PermissionEnrichmentPolicy = {
3
+ resources: readonly PrivacyAndSecurityPermissionResource[];
4
+ terminal: boolean;
5
+ };
6
+ export type PermissionEnrichmentRule = {
7
+ events: ReadonlySet<ClientEvent['name']>;
8
+ resolve: (payload?: ClientEventPayload) => PermissionEnrichmentPolicy;
9
+ };
10
+ export type PermissionEnrichmentContext = {
11
+ name: ClientEvent['name'];
12
+ payload?: ClientEventPayload;
13
+ scope: string;
14
+ };
@@ -0,0 +1,5 @@
1
+ import type { ClientEventPayload, PrivacyAndSecurityPermission, PrivacyAndSecurityPermissionResource } from '../metrics.types';
2
+ export declare const resolveMediaResources: (payload?: ClientEventPayload) => PrivacyAndSecurityPermissionResource[];
3
+ export declare const resolveContentShareResources: (payload?: ClientEventPayload) => PrivacyAndSecurityPermissionResource[];
4
+ export declare const projectPrivacyAndSecurityPermission: (permission: PrivacyAndSecurityPermission, resources: readonly PrivacyAndSecurityPermissionResource[]) => PrivacyAndSecurityPermission | undefined;
5
+ export declare const getChangedPermission: (current: PrivacyAndSecurityPermission, previous: PrivacyAndSecurityPermission) => PrivacyAndSecurityPermission | undefined;
package/package.json CHANGED
@@ -26,8 +26,8 @@
26
26
  "@webex/eslint-config-legacy": "0.0.0",
27
27
  "@webex/jest-config-legacy": "0.0.0",
28
28
  "@webex/legacy-tools": "0.0.0",
29
- "@webex/test-helper-chai": "3.12.0-llmrefactor.1",
30
- "@webex/test-helper-mocha": "3.12.0-llmrefactor.1",
29
+ "@webex/test-helper-chai": "3.12.0-llmrefactor.2",
30
+ "@webex/test-helper-mocha": "3.12.0-llmrefactor.2",
31
31
  "@webex/test-helper-mock-webex": "3.12.0-llmrefactor.1",
32
32
  "@webex/test-helper-test-users": "3.12.0-llmrefactor.1",
33
33
  "eslint": "^8.24.0",
@@ -35,12 +35,12 @@
35
35
  "sinon": "^9.2.4"
36
36
  },
37
37
  "dependencies": {
38
- "@webex/common": "3.12.0-llmrefactor.1",
39
- "@webex/common-timers": "3.12.0-llmrefactor.1",
38
+ "@webex/common": "3.12.0-llmrefactor.2",
39
+ "@webex/common-timers": "3.12.0-llmrefactor.2",
40
40
  "@webex/event-dictionary-ts": "^1.0.2220",
41
- "@webex/test-helper-chai": "3.12.0-llmrefactor.1",
41
+ "@webex/test-helper-chai": "3.12.0-llmrefactor.2",
42
42
  "@webex/test-helper-mock-webex": "3.12.0-llmrefactor.1",
43
- "@webex/webex-core": "3.12.0-llmrefactor.1",
43
+ "@webex/webex-core": "3.12.0-llmrefactor.2",
44
44
  "ip-anonymize": "^0.1.0",
45
45
  "isbot": "5.2.1",
46
46
  "lodash": "^4.17.21",
@@ -54,5 +54,5 @@
54
54
  "test:style": "eslint ./src/**/*.*",
55
55
  "test:unit": "webex-legacy-tools test --unit --runner mocha"
56
56
  },
57
- "version": "3.12.0-llmrefactor.1"
57
+ "version": "3.12.0-llmrefactor.2"
58
58
  }
package/src/index.ts CHANGED
@@ -21,6 +21,7 @@ import {
21
21
  PreComputedLatencies,
22
22
  SubmitFeatureEvent,
23
23
  LocusSyncLatencyEventName,
24
+ PrivacyAndSecurityPermission,
24
25
  } from './metrics.types';
25
26
  import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
26
27
  import * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';
@@ -70,4 +71,5 @@ export type {
70
71
  PreComputedLatencies,
71
72
  SubmitFeatureEvent,
72
73
  LocusSyncLatencyEventName,
74
+ PrivacyAndSecurityPermission,
73
75
  };
@@ -23,6 +23,15 @@ export type ClientUserNameInput = NonNullable<RawClientEvent['userNameInput']>;
23
23
 
24
24
  export type ClientEmailInput = NonNullable<RawClientEvent['emailInput']>;
25
25
 
26
+ export type PrivacyAndSecurityPermission = NonNullable<
27
+ RawClientEvent['privacyAndSecurityPermission']
28
+ >;
29
+
30
+ export type PrivacyAndSecurityPermissionResource = keyof PrivacyAndSecurityPermission;
31
+
32
+ export type PrivacyAndSecurityPermissionState =
33
+ PrivacyAndSecurityPermission[PrivacyAndSecurityPermissionResource];
34
+
26
35
  export type BrowserLaunchMethodType = NonNullable<
27
36
  RawEvent['origin']['clientInfo']
28
37
  >['browserLaunchMethod'];
@@ -19,18 +19,19 @@ import {
19
19
  ClientEvent,
20
20
  FeatureEvent,
21
21
  EventPayload,
22
- OperationalEvent,
23
22
  MediaQualityEvent,
24
23
  InternalEvent,
25
24
  SubmitClientEventOptions,
26
25
  Table,
27
26
  DelayedClientEvent,
28
27
  DelayedClientFeatureEvent,
28
+ PrivacyAndSecurityPermission,
29
29
  } from './metrics.types';
30
30
  import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
31
31
  import {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';
32
32
  import {generateCommonErrorMetadata} from './utils';
33
33
  import {isAutomatedUser as detectAutomatedUser} from './automated-user';
34
+ import PrivacyAndSecurityPermissionEnricher from './privacy-and-security-permission-enricher';
34
35
 
35
36
  /**
36
37
  * Metrics plugin to centralize all types of metrics.
@@ -68,6 +69,8 @@ class Metrics extends WebexPlugin {
68
69
 
69
70
  delayedClientFeatureEventsOverrides: Partial<DelayedClientFeatureEvent['options']> = {};
70
71
 
72
+ private privacyAndSecurityPermissionEnricher: PrivacyAndSecurityPermissionEnricher;
73
+
71
74
  /**
72
75
  * Constructor
73
76
  * @param args
@@ -78,6 +81,15 @@ class Metrics extends WebexPlugin {
78
81
  constructor(...args) {
79
82
  super(...args);
80
83
 
84
+ this.privacyAndSecurityPermissionEnricher = new PrivacyAndSecurityPermissionEnricher(
85
+ (error) => {
86
+ // @ts-ignore
87
+ this.webex.logger.error(
88
+ 'NewMetrics: @submitClientEvent. Privacy and security permission enrichment failed.',
89
+ error
90
+ );
91
+ }
92
+ );
81
93
  // @ts-ignore
82
94
  this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});
83
95
  // @ts-ignore
@@ -381,14 +393,41 @@ class Metrics extends WebexPlugin {
381
393
  options: {meetingId: options?.meetingId},
382
394
  });
383
395
 
384
- return this.callDiagnosticMetrics.submitClientEvent({
396
+ const enrichedPayload = this.privacyAndSecurityPermissionEnricher.enrich({
385
397
  name,
386
398
  payload,
399
+ scope: this.getPermissionScope(options),
400
+ });
401
+
402
+ return this.callDiagnosticMetrics.submitClientEvent({
403
+ name,
404
+ payload: enrichedPayload,
387
405
  options,
388
406
  delaySubmitEvent: this.delaySubmitClientEvents,
389
407
  });
390
408
  }
391
409
 
410
+ /**
411
+ * Stores the latest browser permission state supplied by the client.
412
+ * @param permission latest normalized permission snapshot
413
+ */
414
+ public setPrivacyAndSecurityPermission(permission: PrivacyAndSecurityPermission): void {
415
+ this.privacyAndSecurityPermissionEnricher.setPermission(permission);
416
+ }
417
+
418
+ /**
419
+ * Resolves event options to the call identity used by Call Diagnostic where possible.
420
+ * @param options client event options
421
+ * @returns the permission history scope
422
+ */
423
+ private getPermissionScope(options?: SubmitClientEventOptions): string {
424
+ const meeting = options?.meetingId
425
+ ? (this as any).webex.meetings?.getBasicMeetingInformation?.(options.meetingId)
426
+ : undefined;
427
+
428
+ return options?.correlationId ?? meeting?.correlationId ?? 'default';
429
+ }
430
+
392
431
  /**
393
432
  * Issue request to alias a user's pre-login ID with their CI UUID
394
433
  * @param {string} preLoginId
@@ -0,0 +1,33 @@
1
+ import type {ClientEvent} from '../metrics.types';
2
+ import type {PermissionEnrichmentPolicy} from './types';
3
+
4
+ export const CAMERA_AND_MICROPHONE_PERMISSION_EVENTS = new Set<ClientEvent['name']>([
5
+ 'client.call.initiated',
6
+ 'client.media.capabilities',
7
+ 'client.ice.end',
8
+ 'client.locus.join.request',
9
+ 'client.locus.join.response',
10
+ 'client.media-engine.ready',
11
+ ]);
12
+
13
+ export const MEDIA_TX_PERMISSION_EVENTS = new Set<ClientEvent['name']>([
14
+ 'client.media.tx.start',
15
+ 'client.media.tx.stop',
16
+ ]);
17
+
18
+ export const CONTENT_SHARE_PERMISSION_EVENTS = new Set<ClientEvent['name']>([
19
+ 'client.share.initiated',
20
+ 'client.share.floor-grant.request',
21
+ 'client.share.floor-granted.local',
22
+ ]);
23
+
24
+ export const FINAL_PERMISSION_EVENTS = new Set<ClientEvent['name']>([
25
+ 'client.call.leave',
26
+ 'client.call.remote-ended',
27
+ 'client.call.aborted',
28
+ ]);
29
+
30
+ export const NO_PERMISSION_ENRICHMENT: PermissionEnrichmentPolicy = {
31
+ resources: [],
32
+ terminal: false,
33
+ };