From b87e6abc11283ae3bf08037041662003eb6c5cb7 Mon Sep 17 00:00:00 2001 From: damencho Date: Wed, 7 Feb 2024 12:32:35 -0600 Subject: [PATCH] feat: Sends event on not allowed error. Updates amplitude to include the update about sending events on exiting the page. --- package-lock.json | 204 +++++++++++------- package.json | 4 +- react/features/analytics/AnalyticsEvents.ts | 16 ++ .../analytics/handlers/AmplitudeHandler.ts | 9 +- .../base/conference/middleware.any.ts | 7 + 5 files changed, 158 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f5d473ea9..6dbd7cf93d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@vladmandic/human-models": "2.5.9", "@xmldom/xmldom": "0.8.7", "abab": "2.0.6", - "amplitude-js": "8.2.1", + "amplitude-js": "8.21.9", "base64-js": "1.5.1", "bc-css-flags": "3.0.0", "clipboard-copy": "4.0.1", @@ -127,7 +127,7 @@ "@babel/preset-env": "7.21.5", "@babel/preset-react": "7.16.0", "@jitsi/eslint-config": "4.1.5", - "@types/amplitude-js": "8.16.2", + "@types/amplitude-js": "8.16.5", "@types/audioworklet": "0.0.29", "@types/dom-screen-wake-lock": "1.0.1", "@types/js-md5": "0.4.3", @@ -238,6 +238,11 @@ "extraneous": true, "devDependencies": {} }, + "node_modules/@amplitude/analytics-connector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.5.0.tgz", + "integrity": "sha512-T8mOYzB9RRxckzhL0NTHwdge9xuFxXEOplC8B1Y3UX3NHa3BLh7DlBUZlCOwQgMc2nxDfnSweDL5S3bhC+W90g==" + }, "node_modules/@amplitude/react-native": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@amplitude/react-native/-/react-native-2.7.0.tgz", @@ -248,38 +253,43 @@ } }, "node_modules/@amplitude/types": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.9.2.tgz", - "integrity": "sha512-s+Q/O8kNfocZiyGvVdtM5T4JGPwLRZ4Q26wtEF5xJhyCtJglGMe0ixe6u/6iW9s4JHIq+LlPlUu5095pVsdtNA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.2.tgz", + "integrity": "sha512-I8qenRI7uU6wKNb9LiZrAosSHVoNHziXouKY81CrqxH9xhVTEIJFXeuCV0hbtBr0Al/8ejnGjQRx+S2SvU/pPg==", "engines": { "node": ">=10" } }, "node_modules/@amplitude/ua-parser-js": { - "version": "0.7.24", - "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.24.tgz", - "integrity": "sha512-VbQuJymJ20WEw0HtI2np7EdC3NJGUWi8+Xdbc7uk8WfMIF308T0howpzkQ3JFMN7ejnrcSM/OyNGveeE3TP3TA==", + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], "engines": { "node": "*" } }, "node_modules/@amplitude/utils": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.9.2.tgz", - "integrity": "sha512-hGOIoIjmZ0pq/3b2gBrr17TaEarlR+qzFGu5npm76+scd/51F0eNvjd0vgV6WbJT1cxhyH/5Z8kihGWOU3vS3Q==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.2.tgz", + "integrity": "sha512-tVsHXu61jITEtRjB7NugQ5cVDd4QDzne8T3ifmZye7TiJeUfVRvqe44gDtf55A+7VqhDhyEIIXTA1iVcDGqlEw==", "dependencies": { - "@amplitude/types": "^1.9.2", - "tslib": "^1.9.3" + "@amplitude/types": "^1.10.2", + "tslib": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@amplitude/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -6499,9 +6509,9 @@ } }, "node_modules/@types/amplitude-js": { - "version": "8.16.2", - "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.2.tgz", - "integrity": "sha512-a+tb/CEQOlrHRvEvAuYNOcoUy1POERANnAhfKgiTmsy0eACj3eukGP0ucA9t115QOPzVUhbnUfZqtyHp99IZyA==", + "version": "8.16.5", + "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.5.tgz", + "integrity": "sha512-W73JfDpwDH4VijOGo+nVuQOqUCiqyEGGVdajU4ziWTLn27cn+QtFuFuBdlhCraIIrO52fDRO4NSOGkawtn77Jw==", "dev": true }, "node_modules/@types/audioworklet": { @@ -7658,36 +7668,62 @@ } }, "node_modules/amplitude-js": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.2.1.tgz", - "integrity": "sha512-jp8lm/koTNRceO16RCTlQg9+gUbxip1esod+d0oApBCJYpxuABec2bLHXv/OkVYICvnUWoiz17AZLxiaX/aK4Q==", - "deprecated": "Excessive logging into console at default levels", + "version": "8.21.9", + "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.21.9.tgz", + "integrity": "sha512-d0jJH00wbXu7sxKtVwkdSXtVffjqdUrxuACKlnzP7jU5qt9wriXXMgHifdH5Oq+buKmyF8wKL9S02gAykysURA==", "dependencies": { - "@amplitude/ua-parser-js": "0.7.24", - "@amplitude/utils": "^1.0.5", - "blueimp-md5": "^2.10.0", - "query-string": "5" + "@amplitude/analytics-connector": "^1.4.6", + "@amplitude/ua-parser-js": "0.7.33", + "@amplitude/utils": "^1.10.2", + "@babel/runtime": "^7.21.0", + "blueimp-md5": "^2.19.0", + "query-string": "8.1.0" + } + }, + "node_modules/amplitude-js/node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/amplitude-js/node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/amplitude-js/node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz", + "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==", "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/amplitude-js/node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "node_modules/amplitude-js/node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/anser": { @@ -20142,35 +20178,33 @@ } }, "dependencies": { + "@amplitude/analytics-connector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.5.0.tgz", + "integrity": "sha512-T8mOYzB9RRxckzhL0NTHwdge9xuFxXEOplC8B1Y3UX3NHa3BLh7DlBUZlCOwQgMc2nxDfnSweDL5S3bhC+W90g==" + }, "@amplitude/react-native": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@amplitude/react-native/-/react-native-2.7.0.tgz", "integrity": "sha512-2dMxCVgRPwReHRDm9JKbL+sZGyozJlcdr5Jokv8TQR7idNxxGmm4YSYkjhGjSWkoEyGEyy+lh9kRJQL/DcUWJQ==" }, "@amplitude/types": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.9.2.tgz", - "integrity": "sha512-s+Q/O8kNfocZiyGvVdtM5T4JGPwLRZ4Q26wtEF5xJhyCtJglGMe0ixe6u/6iW9s4JHIq+LlPlUu5095pVsdtNA==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.2.tgz", + "integrity": "sha512-I8qenRI7uU6wKNb9LiZrAosSHVoNHziXouKY81CrqxH9xhVTEIJFXeuCV0hbtBr0Al/8ejnGjQRx+S2SvU/pPg==" }, "@amplitude/ua-parser-js": { - "version": "0.7.24", - "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.24.tgz", - "integrity": "sha512-VbQuJymJ20WEw0HtI2np7EdC3NJGUWi8+Xdbc7uk8WfMIF308T0howpzkQ3JFMN7ejnrcSM/OyNGveeE3TP3TA==" + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==" }, "@amplitude/utils": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.9.2.tgz", - "integrity": "sha512-hGOIoIjmZ0pq/3b2gBrr17TaEarlR+qzFGu5npm76+scd/51F0eNvjd0vgV6WbJT1cxhyH/5Z8kihGWOU3vS3Q==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.2.tgz", + "integrity": "sha512-tVsHXu61jITEtRjB7NugQ5cVDd4QDzne8T3ifmZye7TiJeUfVRvqe44gDtf55A+7VqhDhyEIIXTA1iVcDGqlEw==", "requires": { - "@amplitude/types": "^1.9.2", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@amplitude/types": "^1.10.2", + "tslib": "^2.0.0" } }, "@ampproject/remapping": { @@ -24611,9 +24645,9 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@types/amplitude-js": { - "version": "8.16.2", - "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.2.tgz", - "integrity": "sha512-a+tb/CEQOlrHRvEvAuYNOcoUy1POERANnAhfKgiTmsy0eACj3eukGP0ucA9t115QOPzVUhbnUfZqtyHp99IZyA==", + "version": "8.16.5", + "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.5.tgz", + "integrity": "sha512-W73JfDpwDH4VijOGo+nVuQOqUCiqyEGGVdajU4ziWTLn27cn+QtFuFuBdlhCraIIrO52fDRO4NSOGkawtn77Jw==", "dev": true }, "@types/audioworklet": { @@ -25560,30 +25594,42 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "amplitude-js": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.2.1.tgz", - "integrity": "sha512-jp8lm/koTNRceO16RCTlQg9+gUbxip1esod+d0oApBCJYpxuABec2bLHXv/OkVYICvnUWoiz17AZLxiaX/aK4Q==", + "version": "8.21.9", + "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.21.9.tgz", + "integrity": "sha512-d0jJH00wbXu7sxKtVwkdSXtVffjqdUrxuACKlnzP7jU5qt9wriXXMgHifdH5Oq+buKmyF8wKL9S02gAykysURA==", "requires": { - "@amplitude/ua-parser-js": "0.7.24", - "@amplitude/utils": "^1.0.5", - "blueimp-md5": "^2.10.0", - "query-string": "5" + "@amplitude/analytics-connector": "^1.4.6", + "@amplitude/ua-parser-js": "0.7.33", + "@amplitude/utils": "^1.10.2", + "@babel/runtime": "^7.21.0", + "blueimp-md5": "^2.19.0", + "query-string": "8.1.0" }, "dependencies": { + "decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==" + }, + "filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==" + }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz", + "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==", "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==" } } }, diff --git a/package.json b/package.json index b72582f150..cedf5ad040 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@vladmandic/human-models": "2.5.9", "@xmldom/xmldom": "0.8.7", "abab": "2.0.6", - "amplitude-js": "8.2.1", + "amplitude-js": "8.21.9", "base64-js": "1.5.1", "bc-css-flags": "3.0.0", "clipboard-copy": "4.0.1", @@ -133,7 +133,7 @@ "@babel/preset-env": "7.21.5", "@babel/preset-react": "7.16.0", "@jitsi/eslint-config": "4.1.5", - "@types/amplitude-js": "8.16.2", + "@types/amplitude-js": "8.16.5", "@types/audioworklet": "0.0.29", "@types/dom-screen-wake-lock": "1.0.1", "@types/js-md5": "0.4.3", diff --git a/react/features/analytics/AnalyticsEvents.ts b/react/features/analytics/AnalyticsEvents.ts index 588bc5a050..61f5ebdffb 100644 --- a/react/features/analytics/AnalyticsEvents.ts +++ b/react/features/analytics/AnalyticsEvents.ts @@ -328,6 +328,22 @@ export function createNetworkInfoEvent({ isOnline, networkType, details }: }; } +/** + * Creates a "not allowed error" event. + * + * @param {string} reason - The reason for the error. + * @returns {Object} The event in a format suitable for sending via + * sendAnalytics. + */ +export function createNotAllowedErrorEvent(reason: string) { + return { + action: 'not.allowed.error', + attributes: { + reason + } + }; +} + /** * Creates an "offer/answer failure" event. * diff --git a/react/features/analytics/handlers/AmplitudeHandler.ts b/react/features/analytics/handlers/AmplitudeHandler.ts index 45bf677b82..ebcfbf3e83 100644 --- a/react/features/analytics/handlers/AmplitudeHandler.ts +++ b/react/features/analytics/handlers/AmplitudeHandler.ts @@ -35,6 +35,12 @@ export default class AmplitudeHandler extends AbstractHandler { this._enabled = false; }; + // Forces sending all events on exit (flushing) via sendBeacon + const onExitPage = () => { + // @ts-ignore + amplitude.getInstance().sendEvents(); + }; + if (navigator.product === 'ReactNative') { amplitude.getInstance().init(amplitudeAPPKey); fixDeviceID(amplitude.getInstance()).then(() => { @@ -50,7 +56,8 @@ export default class AmplitudeHandler extends AbstractHandler { includeReferrer: true, includeUtm, saveParamsReferrerOncePerSession: false, - onError + onError, + onExitPage }; // @ts-ignore diff --git a/react/features/base/conference/middleware.any.ts b/react/features/base/conference/middleware.any.ts index 7610039ad6..10ee3b8604 100644 --- a/react/features/base/conference/middleware.any.ts +++ b/react/features/base/conference/middleware.any.ts @@ -6,6 +6,7 @@ import { MIN_ASSUMED_BANDWIDTH_BPS } from '../../../../modules/API/constants'; import { ACTION_PINNED, ACTION_UNPINNED, + createNotAllowedErrorEvent, createOfferAnswerFailedEvent, createPinnedEvent } from '../../analytics/AnalyticsEvents'; @@ -197,6 +198,12 @@ function _conferenceFailed({ dispatch, getState }: IStore, next: Function, actio break; } + case JitsiConferenceErrors.NOT_ALLOWED_ERROR: { + const [ msg ] = error.params; + + sendAnalytics(createNotAllowedErrorEvent(msg)); + break; + } case JitsiConferenceErrors.OFFER_ANSWER_FAILED: sendAnalytics(createOfferAnswerFailedEvent()); break;