rudder-sdk-js 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/index.js +314 -178
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -4511,6 +4511,39 @@
4511
4511
  return isObject$1(val) || Array.isArray(val) || typeof val === 'function';
4512
4512
  }
4513
4513
 
4514
+ /* eslint-disable no-use-before-define */
4515
+ // import logger from "../utils/logUtil";
4516
+ var defaultAsyncState = true;
4517
+ var LOAD_ORIGIN = "RS_JS_SDK";
4518
+
4519
+ var ScriptLoader = function ScriptLoader(id, src) {
4520
+ var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultAsyncState;
4521
+ var exists = document.getElementById(id);
4522
+
4523
+ if (exists) {
4524
+ // logger.debug("script already loaded");
4525
+ return;
4526
+ }
4527
+
4528
+ var js = document.createElement("script");
4529
+ js.src = src;
4530
+ js.async = async === undefined ? defaultAsyncState : async;
4531
+ js.type = "text/javascript";
4532
+ js.id = id;
4533
+ js.dataset.loader = LOAD_ORIGIN;
4534
+ var headElmColl = document.getElementsByTagName("head");
4535
+
4536
+ if (headElmColl.length !== 0) {
4537
+ // logger.debug("==adding script==", js);
4538
+ headElmColl[0].insertBefore(js, headElmColl[0].firstChild);
4539
+ } else {
4540
+ var e = document.getElementsByTagName("script")[0]; // logger.debug("==parent script==", e);
4541
+ // logger.debug("==adding script==", js);
4542
+
4543
+ e.parentNode.insertBefore(js, e);
4544
+ }
4545
+ };
4546
+
4514
4547
  var LOG_LEVEL_INFO = 1;
4515
4548
  var LOG_LEVEL_DEBUG = 2;
4516
4549
  var LOG_LEVEL_WARN = 3;
@@ -4860,14 +4893,16 @@
4860
4893
  };
4861
4894
 
4862
4895
  // Reserved Keywords for properties/traits
4863
- var RESERVED_KEYS = ["anonymous_id", "id", "sent_at", "received_at", "timestamp", "original_timestamp", "event_text", "event"];
4864
- var CONFIG_URL = "https://api.rudderlabs.com/sourceConfig/?p=npm&v=2.7.0";
4865
- var CDN_INT_DIR = "js-integrations";
4896
+ var RESERVED_KEYS = ['anonymous_id', 'id', 'sent_at', 'received_at', 'timestamp', 'original_timestamp', 'event_text', 'event'];
4897
+ var CONFIG_URL = 'https://api.rudderlabs.com/sourceConfig/?p=npm&v=2.8.0';
4898
+ var CDN_INT_DIR = 'js-integrations';
4866
4899
  var DEST_SDK_BASE_URL = "https://cdn.rudderlabs.com/v1.1/".concat(CDN_INT_DIR);
4867
4900
  var MAX_WAIT_FOR_INTEGRATION_LOAD = 10000;
4868
4901
  var INTEGRATION_LOAD_CHECK_INTERVAL = 1000;
4869
- var INTG_SUFFIX = "_RS";
4870
- var POLYFILL_URL = "https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.find%2CArray.prototype.includes%2CPromise%2CString.prototype.endsWith%2CString.prototype.includes%2CString.prototype.startsWith%2CObject.entries";
4902
+ var INTG_SUFFIX = '_RS';
4903
+ var POLYFILL_URL = 'https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.find%2CArray.prototype.includes%2CPromise%2CString.prototype.endsWith%2CString.prototype.includes%2CString.prototype.startsWith%2CObject.entries%2CObject.values%2CElement.prototype.dataset';
4904
+ var DEFAULT_ERROR_REPORT_PROVIDER = 'bugsnag';
4905
+ var ERROR_REPORT_PROVIDERS = [DEFAULT_ERROR_REPORT_PROVIDER];
4871
4906
 
4872
4907
  var aes = {exports: {}};
4873
4908
 
@@ -10220,31 +10255,58 @@
10220
10255
 
10221
10256
  xhr.send();
10222
10257
  }
10258
+ /**
10259
+ * This function is to add breadcrumbs
10260
+ * @param {string} breadcrumb Message to add insight of an user's journey before the error occurred
10261
+ */
10262
+
10263
+
10264
+ function leaveBreadcrumb(breadcrumb) {
10265
+ if (window.rsBugsnagClient) {
10266
+ window.rsBugsnagClient.leaveBreadcrumb(breadcrumb);
10267
+ }
10268
+ }
10269
+ /**
10270
+ * This function is to send handled errors to Bugsnag if Bugsnag client is available
10271
+ * @param {Error} error Error instance from handled error
10272
+ */
10273
+
10274
+
10275
+ function notifyError(error) {
10276
+ if (window.rsBugsnagClient) {
10277
+ window.rsBugsnagClient.notify(error);
10278
+ }
10279
+ }
10223
10280
 
10224
10281
  function handleError(error, analyticsInstance) {
10225
- var errorMessage = error.message ? error.message : undefined;
10226
- var sampleAdBlockTest;
10282
+ var errorMessage = error.message;
10227
10283
 
10228
10284
  try {
10229
10285
  if (error instanceof Event) {
10230
- if (error.target && error.target.localName == "script") {
10231
- errorMessage = "error in script loading:: src:: ".concat(error.target.src, " id:: ").concat(error.target.id);
10232
-
10233
- if (analyticsInstance && error.target.src.includes("adsbygoogle")) {
10234
- sampleAdBlockTest = true;
10235
- analyticsInstance.page("RudderJS-Initiated", "ad-block page request", {
10236
- path: "/ad-blocked",
10237
- title: errorMessage
10238
- }, analyticsInstance.sendAdblockPageOptions);
10239
- }
10286
+ // Discard all the non-script loading errors
10287
+ if (error.target && error.target.localName !== "script") return; // Discard errors of scripts that are not loaded by the SDK
10288
+
10289
+ if (error.target.dataset && error.target.dataset.loader !== LOAD_ORIGIN) return;
10290
+ errorMessage = "error in script loading:: src:: ".concat(error.target.src, " id:: ").concat(error.target.id); // SDK triggered ad-blocker script
10291
+
10292
+ if (error.target.id === "ad-block") {
10293
+ analyticsInstance.page("RudderJS-Initiated", "ad-block page request", {
10294
+ path: "/ad-blocked",
10295
+ title: errorMessage
10296
+ }, analyticsInstance.sendAdblockPageOptions); // No need to proceed further for Ad-block errors
10297
+
10298
+ return;
10240
10299
  }
10241
10300
  }
10242
10301
 
10243
- if (errorMessage && !sampleAdBlockTest) {
10244
- logger.error("[Util] handleError:: ", errorMessage);
10245
- }
10246
- } catch (e) {
10247
- logger.error("[Util] handleError:: ", e);
10302
+ errorMessage = "[handleError]:: \"".concat(errorMessage, "\"");
10303
+ logger.error(errorMessage);
10304
+ var errorObj = error;
10305
+ if (!(error instanceof Error)) errorObj = new Error(errorMessage);
10306
+ notifyError(errorObj);
10307
+ } catch (err) {
10308
+ logger.error("[handleError] Exception:: ", err);
10309
+ notifyError(err);
10248
10310
  }
10249
10311
  }
10250
10312
 
@@ -10493,7 +10555,7 @@
10493
10555
  this.build = "1.0.0";
10494
10556
  this.name = "RudderLabs JavaScript SDK";
10495
10557
  this.namespace = "com.rudderlabs.javascript";
10496
- this.version = "2.7.0";
10558
+ this.version = "2.8.0";
10497
10559
  });
10498
10560
 
10499
10561
  /* eslint-disable max-classes-per-file */
@@ -10502,7 +10564,7 @@
10502
10564
  _classCallCheck(this, RudderLibraryInfo);
10503
10565
 
10504
10566
  this.name = "RudderLabs JavaScript SDK";
10505
- this.version = "2.7.0";
10567
+ this.version = "2.8.0";
10506
10568
  }); // Operating System information class
10507
10569
 
10508
10570
 
@@ -12528,23 +12590,6 @@
12528
12590
  value: function setQueue(value) {
12529
12591
  this.storage.set(this.queueName, value);
12530
12592
  }
12531
- /**
12532
- *
12533
- * Utility method for excluding null and empty values in JSON
12534
- * @param {*} _key
12535
- * @param {*} value
12536
- * @returns
12537
- */
12538
-
12539
- }, {
12540
- key: "replacer",
12541
- value: function replacer(_key, value) {
12542
- if (value === null || value === undefined) {
12543
- return undefined;
12544
- }
12545
-
12546
- return value;
12547
- }
12548
12593
  }, {
12549
12594
  key: "enqueue",
12550
12595
  value: function enqueue(message) {
@@ -12555,7 +12600,7 @@
12555
12600
  var data = {
12556
12601
  batch: batch
12557
12602
  };
12558
- var dataToSend = JSON.stringify(data, this.replacer);
12603
+ var dataToSend = JSON.stringify(data, replacer);
12559
12604
 
12560
12605
  if (dataToSend.length > defaults.maxPayloadSize) {
12561
12606
  batch = queue.slice(0, queue.length - 1);
@@ -12596,7 +12641,7 @@
12596
12641
  var data = {
12597
12642
  batch: batch
12598
12643
  };
12599
- var payload = JSON.stringify(data, this.replacer);
12644
+ var payload = JSON.stringify(data, replacer);
12600
12645
  var blob = new Blob([payload], {
12601
12646
  type: "text/plain"
12602
12647
  });
@@ -12690,7 +12735,7 @@
12690
12735
  message.sentAt = getCurrentTimeFormatted(); // add this, will get modified when actually being sent
12691
12736
  // check message size, if greater log an error
12692
12737
 
12693
- if (JSON.stringify(message).length > MESSAGE_LENGTH) {
12738
+ if (JSON.stringify(message, replacer).length > MESSAGE_LENGTH) {
12694
12739
  logger.error("[EventRepository] enqueue:: message length greater 32 Kb ", message);
12695
12740
  }
12696
12741
 
@@ -12703,37 +12748,6 @@
12703
12748
 
12704
12749
  var eventRepository = new EventRepository();
12705
12750
 
12706
- /* eslint-disable no-use-before-define */
12707
- // import logger from "../utils/logUtil";
12708
- var defaultAsyncState = true;
12709
-
12710
- var ScriptLoader = function ScriptLoader(id, src) {
12711
- var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultAsyncState;
12712
- var exists = document.getElementById(id);
12713
-
12714
- if (exists) {
12715
- // logger.debug("script already loaded");
12716
- return;
12717
- }
12718
-
12719
- var js = document.createElement("script");
12720
- js.src = src;
12721
- js.async = async === undefined ? defaultAsyncState : async;
12722
- js.type = "text/javascript";
12723
- js.id = id;
12724
- var headElmColl = document.getElementsByTagName("head");
12725
-
12726
- if (headElmColl.length !== 0) {
12727
- // logger.debug("==adding script==", js);
12728
- headElmColl[0].insertBefore(js, headElmColl[0].firstChild);
12729
- } else {
12730
- var e = document.getElementsByTagName("script")[0]; // logger.debug("==parent script==", e);
12731
- // logger.debug("==adding script==", js);
12732
-
12733
- e.parentNode.insertBefore(js, e);
12734
- }
12735
- };
12736
-
12737
12751
  /**
12738
12752
  * @description This is utility function for crc32 algorithm
12739
12753
  * @version v1.0.0
@@ -13151,6 +13165,106 @@
13151
13165
  return CookieConsentFactory;
13152
13166
  }();
13153
13167
 
13168
+ var META_DATA = {
13169
+ SDK: {
13170
+ name: "JS",
13171
+ installType: "npm"
13172
+ }
13173
+ }; // This API key token is parsed in the CI pipeline
13174
+
13175
+ var API_KEY = "{{RS_BUGSNAG_API_KEY}}"; // Errors only from Below SDKs are allowed to reach Bugsnag
13176
+
13177
+ var SDK_FILE_NAMES = ["browser.js", "rudder-analytics.min.js", "rudder-analytics-staging.min.js", "rudder-analytics.js"].concat(_toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13178
+ return "".concat(intgName, ".js");
13179
+ })), _toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13180
+ return "".concat(intgName, ".min.js");
13181
+ })), _toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13182
+ return "".concat(intgName, "-staging.min.js");
13183
+ })));
13184
+ /**
13185
+ * This function will load the Bugsnag native SDK through CDN
13186
+ * Once loaded it will be available in window.Bugsnag
13187
+ */
13188
+
13189
+ var load$1 = function load() {
13190
+ var pluginName = "bugsnag";
13191
+
13192
+ if (!window.hasOwnProperty(pluginName)) {
13193
+ ScriptLoader(pluginName, "https://d2wy8f7a9ursnm.cloudfront.net/v7/bugsnag.min.js");
13194
+ }
13195
+ };
13196
+ /**
13197
+ * This function is to initialize the bugsnag with apiKey, SDK meta data
13198
+ * and custom configuration for onError method.
13199
+ * After initialization Bugsnag instance will be available in window.rsBugsnagClient
13200
+ * @param {string} sourceId
13201
+ */
13202
+
13203
+
13204
+ function initClient(sourceId) {
13205
+ if (window.Bugsnag === undefined) return; // If the API key token is not parsed yet, don't proceed to initialize the client
13206
+ // This also prevents unnecessary errors sent to Bugsnag during development phase.
13207
+
13208
+ var apiKeyRegex = /{{.+}}/;
13209
+ if (API_KEY.match(apiKeyRegex) !== null) return;
13210
+ window.rsBugsnagClient = window.Bugsnag.start({
13211
+ apiKey: API_KEY,
13212
+ appVersion: "2.8.0",
13213
+ // Set SDK version as the app version
13214
+ metadata: META_DATA,
13215
+ onError: function onError(event) {
13216
+ var errorOrigin = getValue(event.errors[0], "stacktrace.0.file"); // Skip errors that do not have a valid stack trace
13217
+
13218
+ if (!errorOrigin || typeof errorOrigin !== "string") return false;
13219
+ var srcFileName = errorOrigin.substring(errorOrigin.lastIndexOf("/") + 1);
13220
+ if (!SDK_FILE_NAMES.includes(srcFileName)) // Discard the event if it's not originated at the SDK
13221
+ return false;
13222
+ event.addMetadata("source", {
13223
+ sourceId: sourceId
13224
+ });
13225
+ var errMsg = event.errors[0].errorMessage;
13226
+ event.context = errMsg; // Hack for easily grouping the script load errors
13227
+ // on the dashboard
13228
+
13229
+ if (errMsg.includes("error in script loading")) event.context = "Script load failures";
13230
+ event.severity = "error";
13231
+ return true;
13232
+ },
13233
+ autoTrackSessions: false,
13234
+ // auto tracking sessions is disabled
13235
+ collectUserIp: false,
13236
+ // collecting user's IP is disabled
13237
+ enabledBreadcrumbTypes: ["error", "log", "user"]
13238
+ });
13239
+ window.rsBugsnagClient.releaseStage = "production"; // set the release stage
13240
+ }
13241
+ /**
13242
+ * The responsibility of this function is to check Bugsnag native SDK
13243
+ * has been loaded or not in a certain interval.
13244
+ * If already loaded initialize the SDK.
13245
+ * @param {*} sourceId
13246
+ */
13247
+
13248
+
13249
+ var init = function init(sourceId) {
13250
+ if (window.hasOwnProperty("rsBugsnagClient")) return; // return if already initialized
13251
+
13252
+ if (window.Bugsnag !== undefined) {
13253
+ initClient(sourceId);
13254
+ } else {
13255
+ // Check if Bugsnag is loaded every '100'ms
13256
+ var interval = setInterval(function () {
13257
+ if (window.Bugsnag !== undefined) {
13258
+ clearInterval(interval);
13259
+ initClient(sourceId);
13260
+ }
13261
+ }, 100);
13262
+ setTimeout(function () {
13263
+ clearInterval(interval);
13264
+ }, MAX_WAIT_FOR_INTEGRATION_LOAD);
13265
+ }
13266
+ };
13267
+
13154
13268
  /**
13155
13269
  * class responsible for handling core
13156
13270
  * event tracking functionalities
@@ -13180,7 +13294,7 @@
13180
13294
 
13181
13295
  this.readyCallbacks = [];
13182
13296
  this.methodToCallbackMapping = {
13183
- syncPixel: "syncPixelCallback"
13297
+ syncPixel: 'syncPixelCallback'
13184
13298
  };
13185
13299
  this.loaded = false;
13186
13300
  this.loadIntegration = true;
@@ -13200,11 +13314,11 @@
13200
13314
  key: "initializeUser",
13201
13315
  value: function initializeUser(anonymousIdOptions) {
13202
13316
  // save once for storing older values to encrypted
13203
- this.userId = this.storage.getUserId() || "";
13317
+ this.userId = this.storage.getUserId() || '';
13204
13318
  this.storage.setUserId(this.userId);
13205
13319
  this.userTraits = this.storage.getUserTraits() || {};
13206
13320
  this.storage.setUserTraits(this.userTraits);
13207
- this.groupId = this.storage.getGroupId() || "";
13321
+ this.groupId = this.storage.getGroupId() || '';
13208
13322
  this.storage.setGroupId(this.groupId);
13209
13323
  this.groupTraits = this.storage.getGroupTraits() || {};
13210
13324
  this.storage.setGroupTraits(this.groupTraits);
@@ -13276,8 +13390,26 @@
13276
13390
 
13277
13391
  try {
13278
13392
  // logger.debug(`===in process response=== ${status}`)
13279
- if (typeof response === "string") {
13393
+ if (typeof response === 'string') {
13280
13394
  response = JSON.parse(response);
13395
+ } // Fetch Error reporting enable option from sourceConfig
13396
+
13397
+
13398
+ var isErrorReportEnabled = getValue(response.source.config, 'statsCollection.errorReports.enabled'); // Load Bugsnag only if it is enabled in the source config
13399
+
13400
+ if (isErrorReportEnabled === true) {
13401
+ // Fetch the name of the Error reporter from sourceConfig
13402
+ var provider = getValue(response.source.config, 'statsCollection.errorReports.provider') || DEFAULT_ERROR_REPORT_PROVIDER;
13403
+
13404
+ if (!ERROR_REPORT_PROVIDERS.includes(provider)) {
13405
+ logger.error('Invalid error reporting provider value');
13406
+ }
13407
+
13408
+ if (provider === 'bugsnag') {
13409
+ // Load Bugsnag client SDK
13410
+ load$1();
13411
+ init(response.source.id);
13412
+ }
13281
13413
  }
13282
13414
 
13283
13415
  response.source.destinations.forEach(function (destination, index) {
@@ -13306,11 +13438,11 @@
13306
13438
  cookieConsent && cookieConsent.isEnabled(intg.config);
13307
13439
  });
13308
13440
  } catch (e) {
13309
- logger.error(e);
13441
+ handleError(e);
13310
13442
  }
13311
13443
  }
13312
13444
 
13313
- var suffix = ""; // default suffix
13445
+ var suffix = ''; // default suffix
13314
13446
  // Get the CDN base URL is rudder staging url
13315
13447
 
13316
13448
  var _checkSDKUrl = checkSDKUrl(),
@@ -13318,10 +13450,11 @@
13318
13450
  staging = _checkSDKUrl.staging;
13319
13451
 
13320
13452
  if (rudderSDK && staging) {
13321
- suffix = "-staging"; // stagging suffix
13322
- } // logger.debug("this.clientIntegrations: ", this.clientIntegrations)
13323
- // Load all the client integrations dynamically
13453
+ suffix = '-staging'; // stagging suffix
13454
+ }
13324
13455
 
13456
+ leaveBreadcrumb('Starting device-mode initialization'); // logger.debug("this.clientIntegrations: ", this.clientIntegrations)
13457
+ // Load all the client integrations dynamically
13325
13458
 
13326
13459
  this.clientIntegrations.forEach(function (intg) {
13327
13460
  var modName = configToIntNames[intg.name]; // script URL can be constructed from this
@@ -13343,10 +13476,9 @@
13343
13476
  var intgInstance;
13344
13477
 
13345
13478
  try {
13346
- // logger.debug(
13347
- // pluginName,
13348
- // " [Analytics] processResponse :: trying to initialize integration ::"
13349
- // );
13479
+ var msg = "[Analytics] processResponse :: trying to initialize integration name:: ".concat(pluginName); // logger.debug(msg);
13480
+
13481
+ leaveBreadcrumb(msg);
13350
13482
  intgInstance = new intMod[modName](intg.config, self);
13351
13483
  intgInstance.init(); // logger.debug(pluginName, " initializing destination");
13352
13484
 
@@ -13355,7 +13487,8 @@
13355
13487
  self.dynamicallyLoadedIntegrations[pluginName] = intMod[modName];
13356
13488
  });
13357
13489
  } catch (e) {
13358
- logger.error(pluginName, " [Analytics] initialize integration (integration.init()) failed", e);
13490
+ e.message = "[Analytics] 'integration.init()' failed :: ".concat(pluginName, " :: ").concat(e.message);
13491
+ handleError(e);
13359
13492
  self.failedToBeLoadedIntegration.push(intgInstance);
13360
13493
  }
13361
13494
  }
@@ -13394,7 +13527,8 @@
13394
13527
  // " failed loaded count: ",
13395
13528
  // object.failedToBeLoadedIntegration.length
13396
13529
  // );
13397
- // eslint-disable-next-line no-param-reassign
13530
+ leaveBreadcrumb("Started replaying buffered events"); // eslint-disable-next-line no-param-reassign
13531
+
13398
13532
  object.clientIntegrationObjects = []; // eslint-disable-next-line no-param-reassign
13399
13533
 
13400
13534
  object.clientIntegrationObjects = object.successfullyLoadedIntegration; // logger.debug(
@@ -13498,19 +13632,20 @@
13498
13632
  }, {
13499
13633
  key: "page",
13500
13634
  value: function page(category, name, properties, options, callback) {
13635
+ leaveBreadcrumb("Page event");
13501
13636
  if (!this.loaded) return;
13502
- if (typeof options === "function") callback = options, options = null;
13503
- if (typeof properties === "function") callback = properties, options = properties = null;
13504
- if (typeof name === "function") callback = name, options = properties = name = null;
13505
- if (_typeof(category) === "object" && category != null && category != undefined) options = name, properties = category, name = category = null;
13506
- if (_typeof(name) === "object" && name != null && name != undefined) options = properties, properties = name, name = null;
13507
- if (typeof category === "string" && typeof name !== "string") name = category, category = null;
13508
-
13509
- if (this.sendAdblockPage && category != "RudderJS-Initiated") {
13637
+ if (typeof options === 'function') callback = options, options = null;
13638
+ if (typeof properties === 'function') callback = properties, options = properties = null;
13639
+ if (typeof name === 'function') callback = name, options = properties = name = null;
13640
+ if (_typeof(category) === 'object' && category != null && category != undefined) options = name, properties = category, name = category = null;
13641
+ if (_typeof(name) === 'object' && name != null && name != undefined) options = properties, properties = name, name = null;
13642
+ if (typeof category === 'string' && typeof name !== 'string') name = category, category = null;
13643
+
13644
+ if (this.sendAdblockPage && category != 'RudderJS-Initiated') {
13510
13645
  this.sendSampleRequest();
13511
13646
  }
13512
13647
 
13513
- var rudderElement = new RudderElementBuilder().setType("page").build();
13648
+ var rudderElement = new RudderElementBuilder().setType('page').build();
13514
13649
 
13515
13650
  if (!properties) {
13516
13651
  properties = {};
@@ -13525,7 +13660,7 @@
13525
13660
  }
13526
13661
 
13527
13662
  rudderElement.message.properties = this.getPageProperties(properties);
13528
- this.processAndSendDataToDestinations("page", rudderElement, options, callback);
13663
+ this.processAndSendDataToDestinations('page', rudderElement, options, callback);
13529
13664
  }
13530
13665
  /**
13531
13666
  * Process track params and forward to track call
@@ -13540,17 +13675,18 @@
13540
13675
  }, {
13541
13676
  key: "track",
13542
13677
  value: function track(event, properties, options, callback) {
13678
+ leaveBreadcrumb("Track event");
13543
13679
  if (!this.loaded) return;
13544
- if (typeof options === "function") callback = options, options = null;
13545
- if (typeof properties === "function") callback = properties, options = null, properties = null;
13546
- var rudderElement = new RudderElementBuilder().setType("track").build();
13680
+ if (typeof options === 'function') callback = options, options = null;
13681
+ if (typeof properties === 'function') callback = properties, options = null, properties = null;
13682
+ var rudderElement = new RudderElementBuilder().setType('track').build();
13547
13683
 
13548
13684
  if (event) {
13549
13685
  rudderElement.setEventName(event);
13550
13686
  }
13551
13687
 
13552
13688
  rudderElement.setProperty(properties || {});
13553
- this.processAndSendDataToDestinations("track", rudderElement, options, callback);
13689
+ this.processAndSendDataToDestinations('track', rudderElement, options, callback);
13554
13690
  }
13555
13691
  /**
13556
13692
  * Process identify params and forward to identify call
@@ -13565,10 +13701,11 @@
13565
13701
  }, {
13566
13702
  key: "identify",
13567
13703
  value: function identify(userId, traits, options, callback) {
13704
+ leaveBreadcrumb("Identify event");
13568
13705
  if (!this.loaded) return;
13569
- if (typeof options === "function") callback = options, options = null;
13570
- if (typeof traits === "function") callback = traits, options = null, traits = null;
13571
- if (_typeof(userId) === "object") options = traits, traits = userId, userId = this.userId;
13706
+ if (typeof options === 'function') callback = options, options = null;
13707
+ if (typeof traits === 'function') callback = traits, options = null, traits = null;
13708
+ if (_typeof(userId) === 'object') options = traits, traits = userId, userId = this.userId;
13572
13709
 
13573
13710
  if (userId && this.userId && userId !== this.userId) {
13574
13711
  this.reset();
@@ -13585,8 +13722,8 @@
13585
13722
  this.storage.setUserTraits(this.userTraits);
13586
13723
  }
13587
13724
 
13588
- var rudderElement = new RudderElementBuilder().setType("identify").build();
13589
- this.processAndSendDataToDestinations("identify", rudderElement, options, callback);
13725
+ var rudderElement = new RudderElementBuilder().setType('identify').build();
13726
+ this.processAndSendDataToDestinations('identify', rudderElement, options, callback);
13590
13727
  }
13591
13728
  /**
13592
13729
  *
@@ -13599,14 +13736,15 @@
13599
13736
  }, {
13600
13737
  key: "alias",
13601
13738
  value: function alias(to, from, options, callback) {
13739
+ leaveBreadcrumb("Alias event");
13602
13740
  if (!this.loaded) return;
13603
- if (typeof options === "function") callback = options, options = null;
13604
- if (typeof from === "function") callback = from, options = null, from = null;
13605
- if (_typeof(from) === "object") options = from, from = null;
13606
- var rudderElement = new RudderElementBuilder().setType("alias").build();
13741
+ if (typeof options === 'function') callback = options, options = null;
13742
+ if (typeof from === 'function') callback = from, options = null, from = null;
13743
+ if (_typeof(from) === 'object') options = from, from = null;
13744
+ var rudderElement = new RudderElementBuilder().setType('alias').build();
13607
13745
  rudderElement.message.previousId = from || (this.userId ? this.userId : this.getAnonymousId());
13608
13746
  rudderElement.message.userId = to;
13609
- this.processAndSendDataToDestinations("alias", rudderElement, options, callback);
13747
+ this.processAndSendDataToDestinations('alias', rudderElement, options, callback);
13610
13748
  }
13611
13749
  /**
13612
13750
  *
@@ -13619,14 +13757,15 @@
13619
13757
  }, {
13620
13758
  key: "group",
13621
13759
  value: function group(groupId, traits, options, callback) {
13760
+ leaveBreadcrumb("Group event");
13622
13761
  if (!this.loaded) return;
13623
13762
  if (!arguments.length) return;
13624
- if (typeof options === "function") callback = options, options = null;
13625
- if (typeof traits === "function") callback = traits, options = null, traits = null;
13626
- if (_typeof(groupId) === "object") options = traits, traits = groupId, groupId = this.groupId;
13763
+ if (typeof options === 'function') callback = options, options = null;
13764
+ if (typeof traits === 'function') callback = traits, options = null, traits = null;
13765
+ if (_typeof(groupId) === 'object') options = traits, traits = groupId, groupId = this.groupId;
13627
13766
  this.groupId = groupId;
13628
13767
  this.storage.setGroupId(this.groupId);
13629
- var rudderElement = new RudderElementBuilder().setType("group").build();
13768
+ var rudderElement = new RudderElementBuilder().setType('group').build();
13630
13769
 
13631
13770
  if (traits) {
13632
13771
  for (var key in traits) {
@@ -13637,12 +13776,12 @@
13637
13776
  }
13638
13777
 
13639
13778
  this.storage.setGroupTraits(this.groupTraits);
13640
- this.processAndSendDataToDestinations("group", rudderElement, options, callback);
13779
+ this.processAndSendDataToDestinations('group', rudderElement, options, callback);
13641
13780
  }
13642
13781
  }, {
13643
13782
  key: "IsEventBlackListed",
13644
13783
  value: function IsEventBlackListed(eventName, intgName) {
13645
- if (!eventName || !(typeof eventName === "string")) {
13784
+ if (!eventName || !(typeof eventName === 'string')) {
13646
13785
  return false;
13647
13786
  }
13648
13787
 
@@ -13663,30 +13802,29 @@
13663
13802
 
13664
13803
  switch (eventFilteringOption) {
13665
13804
  // disabled filtering
13666
- case "disable":
13805
+ case 'disable':
13667
13806
  return false;
13668
13807
  // Blacklist is choosen for filtering events
13669
13808
 
13670
- case "blacklistedEvents":
13809
+ case 'blacklistedEvents':
13671
13810
  if (Array.isArray(blacklistedEvents)) {
13672
13811
  return blacklistedEvents.find(function (eventObj) {
13673
13812
  return eventObj.eventName.trim().toUpperCase() === formattedEventName;
13674
- }) === undefined ? false : true;
13675
- } else {
13676
- return false;
13813
+ }) !== undefined;
13677
13814
  }
13678
13815
 
13816
+ return false;
13679
13817
  // Whitelist is choosen for filtering events
13680
13818
 
13681
- case "whitelistedEvents":
13819
+ case 'whitelistedEvents':
13682
13820
  if (Array.isArray(whitelistedEvents)) {
13683
13821
  return whitelistedEvents.find(function (eventObj) {
13684
13822
  return eventObj.eventName.trim().toUpperCase() === formattedEventName;
13685
- }) === undefined ? true : false;
13686
- } else {
13687
- return true;
13823
+ }) === undefined;
13688
13824
  }
13689
13825
 
13826
+ return true;
13827
+
13690
13828
  default:
13691
13829
  return false;
13692
13830
  }
@@ -13712,12 +13850,13 @@
13712
13850
  // rudderElement.message.context.page = getDefaultPageProperties();
13713
13851
 
13714
13852
 
13853
+ leaveBreadcrumb('Started sending data to destinations');
13715
13854
  rudderElement.message.context.traits = _objectSpread2({}, this.userTraits); // logger.debug("anonymousId: ", this.anonymousId)
13716
13855
 
13717
13856
  rudderElement.message.anonymousId = this.anonymousId;
13718
13857
  rudderElement.message.userId = rudderElement.message.userId ? rudderElement.message.userId : this.userId;
13719
13858
 
13720
- if (type == "group") {
13859
+ if (type == 'group') {
13721
13860
  if (this.groupId) {
13722
13861
  rudderElement.message.groupId = this.groupId;
13723
13862
  }
@@ -13746,8 +13885,8 @@
13746
13885
 
13747
13886
  var succesfulLoadedIntersectClientSuppliedIntegrations = findAllEnabledDestinations(clientSuppliedIntegrations, this.clientIntegrationObjects); // try to first send to all integrations, if list populated from BE
13748
13887
 
13749
- try {
13750
- succesfulLoadedIntersectClientSuppliedIntegrations.forEach(function (obj) {
13888
+ succesfulLoadedIntersectClientSuppliedIntegrations.forEach(function (obj) {
13889
+ try {
13751
13890
  if (!obj.isFailed || !obj.isFailed()) {
13752
13891
  if (obj[type]) {
13753
13892
  var sendEvent = !_this4.IsEventBlackListed(rudderElement.message.event, obj.name); // Block the event if it is blacklisted for the device-mode destination
@@ -13758,12 +13897,11 @@
13758
13897
  }
13759
13898
  }
13760
13899
  }
13761
- });
13762
- } catch (err) {
13763
- handleError({
13764
- message: "[sendToNative]:".concat(err)
13765
- });
13766
- }
13900
+ } catch (err) {
13901
+ err.message = "[sendToNative]::[Destination:".concat(obj.name, "]:: ").concat(err);
13902
+ handleError(err);
13903
+ }
13904
+ });
13767
13905
  } // convert integrations object to server identified names, kind of hack now!
13768
13906
 
13769
13907
 
@@ -13782,20 +13920,20 @@
13782
13920
  key: "utm",
13783
13921
  value: function utm(query) {
13784
13922
  // Remove leading ? if present
13785
- if (query.charAt(0) === "?") {
13923
+ if (query.charAt(0) === '?') {
13786
13924
  query = query.substring(1);
13787
13925
  }
13788
13926
 
13789
- query = query.replace(/\?/g, "&");
13927
+ query = query.replace(/\?/g, '&');
13790
13928
  var param;
13791
13929
  var params = parse$6(query);
13792
13930
  var results = {};
13793
13931
 
13794
13932
  for (var key in params) {
13795
13933
  if (Object.prototype.hasOwnProperty.call(params, key)) {
13796
- if (key.substr(0, 4) === "utm_") {
13934
+ if (key.substr(0, 4) === 'utm_') {
13797
13935
  param = key.substr(4);
13798
- if (param === "campaign") param = "name";
13936
+ if (param === 'campaign') param = 'name';
13799
13937
  results[param] = params[key];
13800
13938
  }
13801
13939
  }
@@ -13813,7 +13951,7 @@
13813
13951
  value: function addCampaignInfo(rudderElement) {
13814
13952
  var msgContext = rudderElement.message.context;
13815
13953
 
13816
- if (msgContext && _typeof(msgContext) === "object") {
13954
+ if (msgContext && _typeof(msgContext) === 'object') {
13817
13955
  var _getDefaultPageProper = getDefaultPageProperties(),
13818
13956
  search = _getDefaultPageProper.search;
13819
13957
 
@@ -13839,18 +13977,18 @@
13839
13977
  properties = _rudderElement$messag.properties;
13840
13978
  this.addCampaignInfo(rudderElement); // assign page properties to context.page
13841
13979
 
13842
- rudderElement.message.context.page = this.getContextPageProperties(type === "page" ? properties : undefined);
13843
- var topLevelElements = ["integrations", "anonymousId", "originalTimestamp"];
13980
+ rudderElement.message.context.page = this.getContextPageProperties(type === 'page' ? properties : undefined);
13981
+ var topLevelElements = ['integrations', 'anonymousId', 'originalTimestamp'];
13844
13982
 
13845
13983
  for (var key in options) {
13846
13984
  if (topLevelElements.includes(key)) {
13847
13985
  rudderElement.message[key] = options[key];
13848
- } else if (key !== "context") {
13986
+ } else if (key !== 'context') {
13849
13987
  rudderElement.message.context = merge(rudderElement.message.context, _defineProperty({}, key, options[key]));
13850
- } else if (_typeof(options[key]) === "object" && options[key] != null) {
13988
+ } else if (_typeof(options[key]) === 'object' && options[key] != null) {
13851
13989
  rudderElement.message.context = merge(rudderElement.message.context, _objectSpread2({}, options[key]));
13852
13990
  } else {
13853
- logger.error("[Analytics: processOptionsParam] context passed in options is not object");
13991
+ logger.error('[Analytics: processOptionsParam] context passed in options is not object');
13854
13992
  }
13855
13993
  }
13856
13994
  }
@@ -13890,15 +14028,16 @@
13890
14028
  }, {
13891
14029
  key: "reset",
13892
14030
  value: function reset(flag) {
14031
+ leaveBreadcrumb("reset API :: flag: ".concat(flag));
13893
14032
  if (!this.loaded) return;
13894
14033
 
13895
14034
  if (flag) {
13896
- this.anonymousId = "";
14035
+ this.anonymousId = '';
13897
14036
  }
13898
14037
 
13899
- this.userId = "";
14038
+ this.userId = '';
13900
14039
  this.userTraits = {};
13901
- this.groupId = "";
14040
+ this.groupId = '';
13902
14041
  this.groupTraits = {};
13903
14042
  this.storage.clear(flag);
13904
14043
  }
@@ -13957,7 +14096,7 @@
13957
14096
  }, {
13958
14097
  key: "isValidWriteKey",
13959
14098
  value: function isValidWriteKey(writeKey) {
13960
- if (!writeKey || typeof writeKey !== "string" || writeKey.trim().length == 0) {
14099
+ if (!writeKey || typeof writeKey !== 'string' || writeKey.trim().length == 0) {
13961
14100
  return false;
13962
14101
  }
13963
14102
 
@@ -13966,7 +14105,7 @@
13966
14105
  }, {
13967
14106
  key: "isValidServerUrl",
13968
14107
  value: function isValidServerUrl(serverUrl) {
13969
- if (!serverUrl || typeof serverUrl !== "string" || serverUrl.trim().length == 0) {
14108
+ if (!serverUrl || typeof serverUrl !== 'string' || serverUrl.trim().length == 0) {
13970
14109
  return false;
13971
14110
  }
13972
14111
 
@@ -13991,16 +14130,13 @@
13991
14130
  }
13992
14131
 
13993
14132
  if (!this.storage || Object.keys(this.storage).length === 0) {
13994
- throw Error("Cannot proceed as no storage is available");
14133
+ throw Error('Cannot proceed as no storage is available');
13995
14134
  }
13996
14135
 
13997
14136
  if (options && options.cookieConsentManager) this.cookieConsentOptions = cloneDeep(options.cookieConsentManager);
13998
14137
 
13999
14138
  if (!this.isValidWriteKey(writeKey) || !this.isValidServerUrl(serverUrl)) {
14000
- handleError({
14001
- message: "[Analytics] load:: Unable to load due to invalid writeKey or serverUrl"
14002
- });
14003
- throw Error("failed to initialize");
14139
+ throw Error('Unable to load the SDK due to invalid writeKey or serverUrl');
14004
14140
  }
14005
14141
 
14006
14142
  var storageOptions = {};
@@ -14029,7 +14165,7 @@
14029
14165
  this.sendAdblockPage = true;
14030
14166
  }
14031
14167
 
14032
- if (options && options.sendAdblockPageOptions && _typeof(options.sendAdblockPageOptions) === "object") {
14168
+ if (options && options.sendAdblockPageOptions && _typeof(options.sendAdblockPageOptions) === 'object') {
14033
14169
  this.sendAdblockPageOptions = options.sendAdblockPageOptions;
14034
14170
  }
14035
14171
 
@@ -14067,9 +14203,9 @@
14067
14203
 
14068
14204
  if (!this.destSDKBaseURL) {
14069
14205
  handleError({
14070
- message: "[Analytics] load:: CDN base URL is not valid"
14206
+ message: '[Analytics] load:: CDN base URL is not valid'
14071
14207
  });
14072
- throw Error("failed to load");
14208
+ throw Error('failed to load');
14073
14209
  }
14074
14210
  } else {
14075
14211
  // Get the CDN base URL from the included 'rudder-analytics.min.js' script tag
@@ -14077,13 +14213,13 @@
14077
14213
  rudderSDK = _checkSDKUrl2.rudderSDK;
14078
14214
 
14079
14215
  if (rudderSDK) {
14080
- this.destSDKBaseURL = rudderSDK.split("/").slice(0, -1).concat(CDN_INT_DIR).join("/");
14216
+ this.destSDKBaseURL = rudderSDK.split('/').slice(0, -1).concat(CDN_INT_DIR).join('/');
14081
14217
  }
14082
14218
  }
14083
14219
 
14084
14220
  if (options && options.getSourceConfig) {
14085
- if (typeof options.getSourceConfig !== "function") {
14086
- handleError('option "getSourceConfig" must be a function');
14221
+ if (typeof options.getSourceConfig !== 'function') {
14222
+ handleError(new Error('option "getSourceConfig" must be a function'));
14087
14223
  } else {
14088
14224
  var res = options.getSourceConfig();
14089
14225
 
@@ -14126,11 +14262,11 @@
14126
14262
  // If not present dynamically load from the polyfill cdn
14127
14263
 
14128
14264
  if (!String.prototype.endsWith || !String.prototype.startsWith || !String.prototype.includes || !Array.prototype.find || !Array.prototype.includes || !Promise || !Object.entries) {
14129
- ScriptLoader("polyfill", POLYFILL_URL);
14265
+ ScriptLoader('polyfill', POLYFILL_URL);
14130
14266
  var self = this;
14131
14267
  var interval = setInterval(function () {
14132
14268
  // check if the polyfill is loaded
14133
- if (window.hasOwnProperty("polyfill")) {
14269
+ if (window.hasOwnProperty('polyfill')) {
14134
14270
  clearInterval(interval);
14135
14271
  self.loadAfterPolyfill(writeKey, serverUrl, options);
14136
14272
  }
@@ -14147,7 +14283,7 @@
14147
14283
  value: function ready(callback) {
14148
14284
  if (!this.loaded) return;
14149
14285
 
14150
- if (typeof callback === "function") {
14286
+ if (typeof callback === 'function') {
14151
14287
  /**
14152
14288
  * If integrations are loaded or no integration is available for loading
14153
14289
  * execute the callback immediately
@@ -14162,7 +14298,7 @@
14162
14298
  return;
14163
14299
  }
14164
14300
 
14165
- logger.error("ready callback is not a function");
14301
+ logger.error('ready callback is not a function');
14166
14302
  }
14167
14303
  }, {
14168
14304
  key: "initializeCallbacks",
@@ -14184,7 +14320,7 @@
14184
14320
  Object.keys(this.methodToCallbackMapping).forEach(function (methodName) {
14185
14321
  if (_this7.methodToCallbackMapping.hasOwnProperty(methodName)) {
14186
14322
  if (window.rudderanalytics) {
14187
- if (typeof window.rudderanalytics[_this7.methodToCallbackMapping[methodName]] === "function") {
14323
+ if (typeof window.rudderanalytics[_this7.methodToCallbackMapping[methodName]] === 'function') {
14188
14324
  _this7.clientSuppliedCallbacks[methodName] = window.rudderanalytics[_this7.methodToCallbackMapping[methodName]];
14189
14325
  }
14190
14326
  } // let callback =
@@ -14215,7 +14351,7 @@
14215
14351
  }, {
14216
14352
  key: "sendSampleRequest",
14217
14353
  value: function sendSampleRequest() {
14218
- ScriptLoader("ad-block", "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js");
14354
+ ScriptLoader('ad-block', '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js');
14219
14355
  }
14220
14356
  }]);
14221
14357
 
@@ -14243,8 +14379,8 @@
14243
14379
 
14244
14380
  function parseQueryString(query) {
14245
14381
  var queryDefaults = {
14246
- trait: "ajs_trait_",
14247
- prop: "ajs_prop_"
14382
+ trait: 'ajs_trait_',
14383
+ prop: 'ajs_prop_'
14248
14384
  };
14249
14385
 
14250
14386
  function getDataFromQueryObj(qObj, dataType) {
@@ -14260,33 +14396,33 @@
14260
14396
  var queryObject = parse$6(query);
14261
14397
 
14262
14398
  if (queryObject.ajs_aid) {
14263
- instance.toBeProcessedArray.push(["setAnonymousId", queryObject.ajs_aid]);
14399
+ instance.toBeProcessedArray.push(['setAnonymousId', queryObject.ajs_aid]);
14264
14400
  }
14265
14401
 
14266
14402
  if (queryObject.ajs_uid) {
14267
- instance.toBeProcessedArray.push(["identify", queryObject.ajs_uid, getDataFromQueryObj(queryObject, queryDefaults.trait)]);
14403
+ instance.toBeProcessedArray.push(['identify', queryObject.ajs_uid, getDataFromQueryObj(queryObject, queryDefaults.trait)]);
14268
14404
  }
14269
14405
 
14270
14406
  if (queryObject.ajs_event) {
14271
- instance.toBeProcessedArray.push(["track", queryObject.ajs_event, getDataFromQueryObj(queryObject, queryDefaults.prop)]);
14407
+ instance.toBeProcessedArray.push(['track', queryObject.ajs_event, getDataFromQueryObj(queryObject, queryDefaults.prop)]);
14272
14408
  }
14273
14409
  }
14274
14410
 
14275
14411
  Emitter$1(instance);
14276
- window.addEventListener("error", function (e) {
14412
+ window.addEventListener('error', function (e) {
14277
14413
  handleError(e, instance);
14278
14414
  }, true); // initialize supported callbacks
14279
14415
 
14280
14416
  instance.initializeCallbacks(); // register supported callbacks
14281
14417
 
14282
14418
  instance.registerCallbacks(false);
14283
- var defaultMethod = "load";
14419
+ var defaultMethod = 'load';
14284
14420
  var argumentsArray = window.rudderanalytics;
14285
14421
  var isValidArgsArray = Array.isArray(argumentsArray);
14286
14422
 
14287
14423
  if (isValidArgsArray) {
14288
14424
  /**
14289
- * Iterate the buffered API calls until we find load call and
14425
+ * Iterate the buffered API calls until we find load call and
14290
14426
  * queue it first for processing
14291
14427
  */
14292
14428
  var i = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rudder-sdk-js",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "description": "RudderStack Javascript SDK",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",