From 75575b759ddfea7fe43e3195780caa30dbd0927e Mon Sep 17 00:00:00 2001 From: Kevin Pagtakhan Date: Thu, 23 Jun 2022 16:52:40 -0700 Subject: [PATCH] fix: add guard for navigator for use in envs that do no support navigator --- package.json | 2 +- src/amplitude-client.js | 8 ++++---- src/get-host.js | 7 ++++--- src/metadata-storage.js | 4 ++-- src/utils.js | 2 +- yarn.lock | 8 ++++---- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 43888bda..e20f7d77 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@babel/runtime": "^7.3.4", "blueimp-md5": "^2.10.0", "query-string": "5", - "@amplitude/analytics-connector": "1.4.3" + "@amplitude/analytics-connector": "1.4.4" }, "devDependencies": { "@amplitude/eslint-plugin-amplitude": "^1.0.1", diff --git a/src/amplitude-client.js b/src/amplitude-client.js index 1d134f65..cafdc344 100644 --- a/src/amplitude-client.js +++ b/src/amplitude-client.js @@ -39,7 +39,6 @@ var AmplitudeClient = function AmplitudeClient(instanceName) { this._instanceName = utils.isEmptyString(instanceName) ? Constants.DEFAULT_INSTANCE : instanceName.toLowerCase(); this._unsentEvents = []; this._unsentIdentifys = []; - this._ua = new UAParser(navigator.userAgent).getResult(); this.options = { ...DEFAULT_OPTIONS, trackingOptions: { ...DEFAULT_OPTIONS.trackingOptions } }; this.cookieStorage = new cookieStorage().getStorage(); this._q = []; // queue for proxied functions before script load @@ -61,7 +60,8 @@ var AmplitudeClient = function AmplitudeClient(instanceName) { // used to integrate with experiment SDK (client-side exposure tracking & real-time user properties) this._connector = null; - this._userAgent = (navigator && navigator.userAgent) || null; + this._userAgent = (typeof navigator !== 'undefined' && navigator && navigator.userAgent) || null; + this._ua = new UAParser(this._userAgent).getResult(); }; AmplitudeClient.prototype.Identify = Identify; @@ -249,7 +249,7 @@ AmplitudeClient.prototype.init = function init(apiKey, opt_userId, opt_config, o } const onExitPage = this.options.onExitPage; - if (type(onExitPage) === 'function') { + if (type(onExitPage) === 'function' && GlobalScope.addEventListener) { if (!this.pageHandlersAdded) { this.pageHandlersAdded = true; @@ -1865,7 +1865,7 @@ AmplitudeClient.prototype.sendEvents = function sendEvents() { checksum: md5(Constants.API_VERSION + this.options.apiKey + events + uploadTime), }; - if (this.options.transport === Constants.TRANSPORT_BEACON) { + if (this.options.transport === Constants.TRANSPORT_BEACON && typeof navigator !== 'undefined') { const success = navigator.sendBeacon(url, new URLSearchParams(data)); if (success) { diff --git a/src/get-host.js b/src/get-host.js index 8c717448..b0affaac 100644 --- a/src/get-host.js +++ b/src/get-host.js @@ -1,18 +1,19 @@ import GlobalScope from './global-scope'; const getHost = (url) => { + const defaultHostname = GlobalScope.location ? GlobalScope.location.hostname : ''; if (url) { if (typeof document !== 'undefined') { const a = document.createElement('a'); a.href = url; - return a.hostname || GlobalScope.location.hostname; + return a.hostname || defaultHostname; } if (typeof URL === 'function') { const u = new URL(url); - return u.hostname || GlobalScope.location.hostname; + return u.hostname || defaultHostname; } } - return GlobalScope.location.hostname; + return defaultHostname; }; export default getHost; diff --git a/src/metadata-storage.js b/src/metadata-storage.js index c719a992..e5648660 100644 --- a/src/metadata-storage.js +++ b/src/metadata-storage.js @@ -35,8 +35,8 @@ class MetadataStorage { this.expirationDays = expirationDays; this.cookieDomain = ''; - - const writableTopDomain = topDomain(getLocation().href); + const loc = getLocation() ? getLocation().href : undefined; + const writableTopDomain = topDomain(loc); this.cookieDomain = domain || (writableTopDomain ? '.' + writableTopDomain : null); if (storageOptionExists[storage]) { diff --git a/src/utils.js b/src/utils.js index 7ec2db16..89ee99c8 100644 --- a/src/utils.js +++ b/src/utils.js @@ -119,7 +119,7 @@ const validateTransport = function validateTransport(transport) { return false; } - if (transport !== constants.TRANSPORT_HTTP && !navigator.sendBeacon) { + if (transport !== constants.TRANSPORT_HTTP && typeof navigator !== 'undefined' && !navigator.sendBeacon) { log.error(`browser does not support sendBeacon, so transport must be HTTP`); return false; } diff --git a/yarn.lock b/yarn.lock index d3879c9a..8dea6398 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@amplitude/analytics-connector@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@amplitude/analytics-connector/-/analytics-connector-1.4.3.tgz#cb9098cb8adfbd39b2c71ad71a7c758504a745a7" - integrity sha512-Ghu1UJn55Rn9eglF+ED7yOGXaeX3KY2qkQi9W9yqC02ItPvKfrybeVndweI1XtsiW0LvRpdA3uQEjuZEGunyLw== +"@amplitude/analytics-connector@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-connector/-/analytics-connector-1.4.4.tgz#3bed72b0b3190a4426a529473ced962892706116" + integrity sha512-6JcE1nxrprJt6pHqqDQb7FXRqJmFHG7KJPe0jNZaAvfll4mWKVqZu8W9IV3XiN1P+xgHIV1NN+i3PLOAZWEhXg== dependencies: "@amplitude/ua-parser-js" "0.7.31"