@mparticle/web-sdk 2.60.1 → 2.62.0

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 (77) hide show
  1. package/dist/mparticle.common.js +22 -22
  2. package/dist/mparticle.esm.js +22 -22
  3. package/dist/mparticle.js +118 -173
  4. package/dist/types/src/apiClient.d.ts +34 -0
  5. package/dist/types/src/audience.d.ts +4 -0
  6. package/dist/types/src/audienceManager.d.ts +19 -0
  7. package/dist/types/src/batchUploader.d.ts +72 -0
  8. package/dist/types/src/configAPIClient.d.ts +68 -0
  9. package/dist/types/src/consent.d.ts +71 -0
  10. package/dist/types/src/constants.d.ts +201 -0
  11. package/dist/types/src/cookieConsentManager.d.ts +50 -0
  12. package/dist/types/src/cookieSyncManager.d.ts +34 -0
  13. package/dist/types/src/ecommerce.d.ts +52 -0
  14. package/dist/types/src/ecommerce.interfaces.d.ts +78 -0
  15. package/dist/types/src/events.d.ts +17 -0
  16. package/dist/types/src/events.interfaces.d.ts +21 -0
  17. package/dist/types/src/filteredMparticleUser.d.ts +8 -0
  18. package/dist/types/src/foregroundTimeTracker.d.ts +21 -0
  19. package/dist/types/src/forwarders.d.ts +26 -0
  20. package/dist/types/src/forwarders.interfaces.d.ts +59 -0
  21. package/dist/types/src/forwardingStatsUploader.d.ts +5 -0
  22. package/dist/types/src/helpers.d.ts +54 -0
  23. package/dist/types/src/identity-user-interfaces.d.ts +106 -0
  24. package/dist/types/src/identity-utils.d.ts +36 -0
  25. package/dist/types/src/identity.interfaces.d.ts +117 -0
  26. package/dist/types/src/identityApiClient.d.ts +14 -0
  27. package/dist/types/src/integrationCapture.d.ts +83 -0
  28. package/dist/types/src/internal-types.d.ts +20 -0
  29. package/dist/types/src/kitBlocking.d.ts +116 -0
  30. package/dist/types/src/kitFilterHelper.d.ts +15 -0
  31. package/dist/types/src/logger.d.ts +18 -0
  32. package/dist/types/src/mockBatchCreator.d.ts +7 -0
  33. package/dist/types/src/mp-instance.d.ts +76 -0
  34. package/dist/types/src/mparticle-instance-manager.d.ts +2 -0
  35. package/dist/types/src/nativeSdkHelpers.d.ts +12 -0
  36. package/dist/types/src/nativeSdkHelpers.interfaces.d.ts +10 -0
  37. package/dist/types/src/persistence.d.ts +44 -0
  38. package/dist/types/src/persistence.interfaces.d.ts +73 -0
  39. package/dist/types/src/polyfill.d.ts +15 -0
  40. package/dist/types/src/pre-init-utils.d.ts +11 -0
  41. package/dist/types/src/public-types.d.ts +23 -0
  42. package/dist/types/src/reporting/errorReportingDispatcher.d.ts +8 -0
  43. package/dist/types/src/reporting/loggingDispatcher.d.ts +8 -0
  44. package/dist/types/src/reporting/types.d.ts +37 -0
  45. package/dist/types/src/roktManager.d.ts +176 -0
  46. package/dist/types/src/sdkRuntimeModels.d.ts +319 -0
  47. package/dist/types/src/sdkToEventsApiConverter.d.ts +43 -0
  48. package/dist/types/src/serverModel.d.ts +105 -0
  49. package/dist/types/src/sessionManager.d.ts +16 -0
  50. package/dist/types/src/sideloadedKit.d.ts +30 -0
  51. package/dist/types/src/store.d.ts +157 -0
  52. package/dist/types/src/stub/mparticle.stub.d.ts +182 -0
  53. package/dist/types/src/types.d.ts +154 -0
  54. package/dist/types/src/uploaders.d.ts +21 -0
  55. package/dist/types/src/user-utils.d.ts +5 -0
  56. package/dist/types/src/utils.d.ts +82 -0
  57. package/dist/types/src/validators.d.ts +18 -0
  58. package/dist/types/src/vault.d.ts +41 -0
  59. package/package.json +16 -3
  60. package/src/apiClient.ts +1 -1
  61. package/src/constants.ts +0 -4
  62. package/src/forwarders.interfaces.ts +42 -0
  63. package/src/identityApiClient.ts +9 -6
  64. package/src/internal-types.ts +66 -0
  65. package/src/logger.ts +3 -12
  66. package/src/mp-instance.ts +28 -15
  67. package/src/mparticle-instance-manager.ts +6 -0
  68. package/src/public-types.ts +84 -0
  69. package/src/reporting/errorReportingDispatcher.ts +21 -0
  70. package/src/reporting/loggingDispatcher.ts +21 -0
  71. package/src/reporting/types.ts +45 -0
  72. package/src/roktManager.ts +32 -6
  73. package/src/sdkRuntimeModels.ts +3 -1
  74. package/src/serverModel.ts +1 -1
  75. package/src/store.ts +1 -3
  76. package/src/logging/reportingLogger.ts +0 -192
  77. package/src/logging/types.ts +0 -32
package/dist/mparticle.js CHANGED
@@ -203,7 +203,7 @@ var mParticle = (function () {
203
203
  Base64: Base64$1
204
204
  };
205
205
 
206
- var version = "2.60.1";
206
+ var version = "2.62.0";
207
207
 
208
208
  var Constants = {
209
209
  sdkVersion: version,
@@ -328,9 +328,7 @@ var mParticle = (function () {
328
328
  configUrl: 'jssdkcdns.mparticle.com/JS/v2/',
329
329
  identityUrl: 'identity.mparticle.com/v1/',
330
330
  aliasUrl: 'jssdks.mparticle.com/v1/identity/',
331
- userAudienceUrl: 'nativesdks.mparticle.com/v1/',
332
- loggingUrl: 'apps.rokt-api.com/v1/log',
333
- errorUrl: 'apps.rokt-api.com/v1/errors'
331
+ userAudienceUrl: 'nativesdks.mparticle.com/v1/'
334
332
  },
335
333
  // These are the paths that are used to construct the CNAME urls
336
334
  CNAMEUrlPaths: {
@@ -339,9 +337,7 @@ var mParticle = (function () {
339
337
  v3SecureServiceUrl: '/webevents/v3/JS/',
340
338
  configUrl: '/tags/JS/v2/',
341
339
  identityUrl: '/identity/v1/',
342
- aliasUrl: '/webevents/v1/identity/',
343
- loggingUrl: '/v1/log',
344
- errorUrl: '/v1/errors'
340
+ aliasUrl: '/webevents/v1/identity/'
345
341
  },
346
342
  Base64CookieKeys: {
347
343
  csm: 1,
@@ -3101,7 +3097,7 @@ var mParticle = (function () {
3101
3097
  // https://go.mparticle.com/work/SQDSDKS-6935
3102
3098
  // While Event Name is 'usually' a string, there are some cases where it is a number
3103
3099
  // in that it could be a type of MessageType Enum
3104
- if (event.EventName !== Types.MessageType.AppStateTransition) {
3100
+ if (event.EventName !== String(Types.MessageType.AppStateTransition)) {
3105
3101
  if (kitBlocker && kitBlocker.kitBlockingEnabled) {
3106
3102
  event = kitBlocker.createBlockedEvent(event);
3107
3103
  }
@@ -5010,7 +5006,7 @@ var mParticle = (function () {
5010
5006
  for (var baseUrlKey in defaultBaseUrls) {
5011
5007
  // Any custom endpoints passed to mpConfig will take priority over direct
5012
5008
  // mapping to the silo. The most common use case is a customer provided CNAME.
5013
- if (baseUrlKey === 'configUrl' || baseUrlKey === 'loggingUrl' || baseUrlKey === 'errorUrl') {
5009
+ if (baseUrlKey === 'configUrl') {
5014
5010
  directBaseUrls[baseUrlKey] = config[baseUrlKey] || defaultBaseUrls[baseUrlKey];
5015
5011
  continue;
5016
5012
  }
@@ -5025,11 +5021,10 @@ var mParticle = (function () {
5025
5021
  }
5026
5022
 
5027
5023
  var Logger = /** @class */function () {
5028
- function Logger(config, reportingLogger) {
5024
+ function Logger(config) {
5029
5025
  var _a, _b;
5030
5026
  this.logLevel = (_a = config.logLevel) !== null && _a !== void 0 ? _a : LogLevelType.Warning;
5031
5027
  this.logger = (_b = config.logger) !== null && _b !== void 0 ? _b : new ConsoleLogger();
5032
- this.reportingLogger = reportingLogger;
5033
5028
  }
5034
5029
  Logger.prototype.verbose = function (msg) {
5035
5030
  if (this.logLevel === LogLevelType.None) return;
@@ -5043,14 +5038,10 @@ var mParticle = (function () {
5043
5038
  this.logger.warning(msg);
5044
5039
  }
5045
5040
  };
5046
- Logger.prototype.error = function (msg, codeForReporting) {
5047
- var _a;
5041
+ Logger.prototype.error = function (msg) {
5048
5042
  if (this.logLevel === LogLevelType.None) return;
5049
5043
  if (this.logger.error) {
5050
5044
  this.logger.error(msg);
5051
- if (codeForReporting) {
5052
- (_a = this.reportingLogger) === null || _a === void 0 ? void 0 : _a.error(msg, codeForReporting);
5053
- }
5054
5045
  }
5055
5046
  };
5056
5047
  Logger.prototype.isVerbose = function () {
@@ -7154,7 +7145,7 @@ var mParticle = (function () {
7154
7145
  // This is an artifact from v2 events where SessionStart/End and AST event
7155
7146
  // names are numbers (1, 2, or 10), but going forward with v3, these lifecycle
7156
7147
  // events do not have names, but are denoted by their `event_type`
7157
- EventName: event.name || event.messageType,
7148
+ EventName: event.name || String(event.messageType),
7158
7149
  EventCategory: event.eventType,
7159
7150
  EventAttributes: mpInstance._Helpers.sanitizeAttributes(event.data, event.name),
7160
7151
  ActiveTimeOnSite: (_a = mpInstance._timeOnSiteTimer) === null || _a === void 0 ? void 0 : _a.getTimeInForeground(),
@@ -9332,7 +9323,9 @@ var mParticle = (function () {
9332
9323
  var ErrorCodes = {
9333
9324
  UNKNOWN_ERROR: 'UNKNOWN_ERROR',
9334
9325
  UNHANDLED_EXCEPTION: 'UNHANDLED_EXCEPTION',
9335
- IDENTITY_REQUEST: 'IDENTITY_REQUEST'
9326
+ IDENTITY_REQUEST: 'IDENTITY_REQUEST',
9327
+ IDENTITY_MISMATCH: 'IDENTITY_MISMATCH',
9328
+ ROKT_KIT_ATTACHED: 'ROKT_KIT_ATTACHED'
9336
9329
  };
9337
9330
  var WSDKErrorSeverity = {
9338
9331
  ERROR: 'ERROR',
@@ -9442,7 +9435,7 @@ var mParticle = (function () {
9442
9435
  this.sendIdentityRequest = function (identityApiRequest, method, callback, originalIdentityApiData, parseIdentityResponse, mpid, knownIdentities) {
9443
9436
  var _a, _b, _c, _d;
9444
9437
  return __awaiter(this, void 0, void 0, function () {
9445
- var requestCount, invokeCallback, Logger, previousMPID, uploadUrl, uploader, fetchPayload, response, identityResponse, message, _e, responseBody, errorResponse, errorMessage, responseText, isDevelopmentMode, responseToLog, errorMessage, requestCount, err_1, requestCount, errorMessage;
9438
+ var requestCount, invokeCallback, Logger, errorReporter, previousMPID, uploadUrl, uploader, fetchPayload, response, identityResponse, message, _e, responseBody, errorResponse, errorMessage, responseText, isDevelopmentMode, responseToLog, errorMessage, requestCount, err_1, requestCount, errorMessage, msg;
9446
9439
  return __generator(this, function (_f) {
9447
9440
  switch (_f.label) {
9448
9441
  case 0:
@@ -9452,7 +9445,7 @@ var mParticle = (function () {
9452
9445
  mpInstance.captureTiming("".concat(requestCount, "-identityRequestStart"));
9453
9446
  }
9454
9447
  invokeCallback = mpInstance._Helpers.invokeCallback;
9455
- Logger = mpInstance.Logger;
9448
+ Logger = mpInstance.Logger, errorReporter = mpInstance._ErrorReportingDispatcher;
9456
9449
  Logger.verbose(Messages$1.InformationMessages.SendIdentityBegin);
9457
9450
  if (!identityApiRequest) {
9458
9451
  Logger.error(Messages$1.ErrorMessages.APIRequestEmpty);
@@ -9561,7 +9554,13 @@ var mParticle = (function () {
9561
9554
  mpInstance.captureTiming("".concat(requestCount, "-identityRequestEnd"));
9562
9555
  }
9563
9556
  errorMessage = err_1.message || err_1.toString();
9564
- Logger.error('Error sending identity request to servers' + ' - ' + errorMessage, ErrorCodes.IDENTITY_REQUEST);
9557
+ msg = 'Error sending identity request to servers' + ' - ' + errorMessage;
9558
+ Logger.error(msg);
9559
+ errorReporter === null || errorReporter === void 0 ? void 0 : errorReporter.report({
9560
+ message: msg,
9561
+ code: ErrorCodes.IDENTITY_REQUEST,
9562
+ severity: WSDKErrorSeverity.ERROR
9563
+ });
9565
9564
  (_d = mpInstance.processQueueOnIdentityFailure) === null || _d === void 0 ? void 0 : _d.call(mpInstance);
9566
9565
  invokeCallback(callback, HTTPCodes$1.noHttpCoverage, errorMessage);
9567
9566
  return [3 /*break*/, 10];
@@ -9928,10 +9927,12 @@ var mParticle = (function () {
9928
9927
  * @param {SDKLoggerApi} logger - The mParticle Logger instance
9929
9928
  * @param {IRoktOptions} options - Options for the RoktManager
9930
9929
  * @param {Function} captureTiming - Function to capture performance timing marks
9930
+ * @param {IErrorReportingService} errorReporter - Dispatcher for error/warning reporting
9931
+ * @param {ILoggingService} loggingService - Dispatcher for informational logging
9931
9932
  *
9932
9933
  * @throws Logs error to console if placementAttributesMapping parsing fails
9933
9934
  */
9934
- RoktManager.prototype.init = function (roktConfig, filteredUser, identityService, store, logger, options, captureTiming) {
9935
+ RoktManager.prototype.init = function (roktConfig, filteredUser, identityService, store, logger, options, captureTiming, errorReporter, loggingService) {
9935
9936
  var _a, _b;
9936
9937
  var _c = roktConfig || {},
9937
9938
  userAttributeFilters = _c.userAttributeFilters,
@@ -9943,6 +9944,8 @@ var mParticle = (function () {
9943
9944
  this.identityService = identityService;
9944
9945
  this.store = store;
9945
9946
  this.logger = logger;
9947
+ this.errorReporter = errorReporter;
9948
+ this.loggingService = loggingService;
9946
9949
  this.captureTiming = captureTiming;
9947
9950
  (_b = this.captureTiming) === null || _b === void 0 ? void 0 : _b.call(this, PerformanceMarkType.JointSdkRoktKitInit);
9948
9951
  this.filters = {
@@ -9981,7 +9984,7 @@ var mParticle = (function () {
9981
9984
  configurable: true
9982
9985
  });
9983
9986
  RoktManager.prototype.attachKit = function (kit) {
9984
- var _a, _b, _c, _d;
9987
+ var _a, _b, _c, _d, _e;
9985
9988
  this.kit = kit;
9986
9989
  if ((_a = kit.settings) === null || _a === void 0 ? void 0 : _a.accountId) {
9987
9990
  this.store.setRoktAccountId(kit.settings.accountId);
@@ -9989,11 +9992,15 @@ var mParticle = (function () {
9989
9992
  if (kit.integrationName) {
9990
9993
  (_b = this.store) === null || _b === void 0 ? void 0 : _b.setIntegrationName(kit.integrationName);
9991
9994
  }
9995
+ (_c = this.loggingService) === null || _c === void 0 ? void 0 : _c.log({
9996
+ message: 'RoktManager: Kit attached, Rokt is ready',
9997
+ code: ErrorCodes.ROKT_KIT_ATTACHED
9998
+ });
9992
9999
  this.processMessageQueue();
9993
10000
  try {
9994
- (_c = this.onReadyCallback) === null || _c === void 0 ? void 0 : _c.call(this);
10001
+ (_d = this.onReadyCallback) === null || _d === void 0 ? void 0 : _d.call(this);
9995
10002
  } catch (e) {
9996
- (_d = this.logger) === null || _d === void 0 ? void 0 : _d.error('RoktManager: Error in onReadyCallback: ' + e);
10003
+ (_e = this.logger) === null || _e === void 0 ? void 0 : _e.error('RoktManager: Error in onReadyCallback: ' + e);
9997
10004
  }
9998
10005
  };
9999
10006
  /**
@@ -10012,21 +10019,21 @@ var mParticle = (function () {
10012
10019
  * });
10013
10020
  */
10014
10021
  RoktManager.prototype.selectPlacements = function (options) {
10015
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
10022
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
10016
10023
  return __awaiter(this, void 0, void 0, function () {
10017
- var attributes, sandboxValue, mappedAttributes, attributesToLog, currentUserIdentities_1, currentEmail, newEmail, currentHashedEmail, newHashedEmail, isValidHashedEmailIdentityType, emailChanged, hashedEmailChanged, newIdentities_1, error_1, errorMessage, finalUserIdentities, enrichedAttributes, hashedEmail, enrichedOptions, error_2;
10024
+ var attributes, sandboxValue, mappedAttributes, attributesToLog, currentUserIdentities_1, currentEmail, newEmail, currentHashedEmail, newHashedEmail, isValidHashedEmailIdentityType, emailChanged, hashedEmailChanged, newIdentities_1, msg, msg, error_1, errorMessage, finalUserIdentities, enrichedAttributes, hashedEmail, enrichedOptions, error_2;
10018
10025
  var _this = this;
10019
- return __generator(this, function (_k) {
10020
- switch (_k.label) {
10026
+ return __generator(this, function (_m) {
10027
+ switch (_m.label) {
10021
10028
  case 0:
10022
10029
  (_a = this.captureTiming) === null || _a === void 0 ? void 0 : _a.call(this, PerformanceMarkType.JointSdkSelectPlacements);
10023
10030
  // Queue if kit isn't ready OR if identity is in flight
10024
10031
  if (!this.isReady() || ((_b = this.store) === null || _b === void 0 ? void 0 : _b.identityCallInFlight)) {
10025
10032
  return [2 /*return*/, this.deferredCall('selectPlacements', options)];
10026
10033
  }
10027
- _k.label = 1;
10034
+ _m.label = 1;
10028
10035
  case 1:
10029
- _k.trys.push([1, 6,, 7]);
10036
+ _m.trys.push([1, 6,, 7]);
10030
10037
  attributes = options.attributes;
10031
10038
  sandboxValue = (attributes === null || attributes === void 0 ? void 0 : attributes.sandbox) || null;
10032
10039
  mappedAttributes = this.mapPlacementAttributes(attributes, this.placementAttributesMapping);
@@ -10051,17 +10058,29 @@ var mParticle = (function () {
10051
10058
  if (emailChanged) {
10052
10059
  newIdentities_1.email = newEmail;
10053
10060
  if (newEmail) {
10054
- this.logger.warning("Email mismatch detected. Current email differs from email passed to selectPlacements call. Proceeding to call identify with email from selectPlacements call. Please verify your implementation.");
10061
+ msg = 'Email mismatch detected. Current email differs from email passed to selectPlacements call. Proceeding to call identify with email from selectPlacements call. Please verify your implementation.';
10062
+ this.logger.warning(msg);
10063
+ (_h = this.errorReporter) === null || _h === void 0 ? void 0 : _h.report({
10064
+ message: msg,
10065
+ code: ErrorCodes.IDENTITY_MISMATCH,
10066
+ severity: WSDKErrorSeverity.WARNING
10067
+ });
10055
10068
  }
10056
10069
  }
10057
10070
  if (hashedEmailChanged) {
10058
10071
  newIdentities_1[this.mappedEmailShaIdentityType] = newHashedEmail;
10059
- this.logger.warning("emailsha256 mismatch detected. Current mParticle hashedEmail differs from hashedEmail passed to selectPlacements call. Proceeding to call identify with hashedEmail from selectPlacements call. Please verify your implementation.");
10072
+ msg = 'emailsha256 mismatch detected. Current mParticle hashedEmail differs from hashedEmail passed to selectPlacements call. Proceeding to call identify with hashedEmail from selectPlacements call. Please verify your implementation.';
10073
+ this.logger.warning(msg);
10074
+ (_j = this.errorReporter) === null || _j === void 0 ? void 0 : _j.report({
10075
+ message: msg,
10076
+ code: ErrorCodes.IDENTITY_MISMATCH,
10077
+ severity: WSDKErrorSeverity.WARNING
10078
+ });
10060
10079
  }
10061
10080
  if (!!isEmpty(newIdentities_1)) return [3 /*break*/, 5];
10062
- _k.label = 2;
10081
+ _m.label = 2;
10063
10082
  case 2:
10064
- _k.trys.push([2, 4,, 5]);
10083
+ _m.trys.push([2, 4,, 5]);
10065
10084
  return [4 /*yield*/, new Promise(function (resolve, reject) {
10066
10085
  _this.identityService.identify({
10067
10086
  userIdentities: __assign(__assign({}, currentUserIdentities_1), newIdentities_1)
@@ -10070,17 +10089,17 @@ var mParticle = (function () {
10070
10089
  });
10071
10090
  })];
10072
10091
  case 3:
10073
- _k.sent();
10092
+ _m.sent();
10074
10093
  return [3 /*break*/, 5];
10075
10094
  case 4:
10076
- error_1 = _k.sent();
10095
+ error_1 = _m.sent();
10077
10096
  errorMessage = error_1 instanceof Error ? error_1.message : JSON.stringify(error_1);
10078
10097
  this.logger.error('Failed to identify user with updated identities: ' + errorMessage);
10079
10098
  return [3 /*break*/, 5];
10080
10099
  case 5:
10081
10100
  // Refresh current user identities to ensure we have the latest values before building enrichedAttributes
10082
10101
  this.currentUser = this.identityService.getCurrentUser();
10083
- finalUserIdentities = ((_j = (_h = this.currentUser) === null || _h === void 0 ? void 0 : _h.getUserIdentities()) === null || _j === void 0 ? void 0 : _j.userIdentities) || {};
10102
+ finalUserIdentities = ((_l = (_k = this.currentUser) === null || _k === void 0 ? void 0 : _k.getUserIdentities()) === null || _l === void 0 ? void 0 : _l.userIdentities) || {};
10084
10103
  this.setUserAttributes(mappedAttributes);
10085
10104
  enrichedAttributes = __assign(__assign({}, mappedAttributes), sandboxValue !== null ? {
10086
10105
  sandbox: sandboxValue
@@ -10102,7 +10121,7 @@ var mParticle = (function () {
10102
10121
  });
10103
10122
  return [2 /*return*/, this.kit.selectPlacements(enrichedOptions)];
10104
10123
  case 6:
10105
- error_2 = _k.sent();
10124
+ error_2 = _m.sent();
10106
10125
  return [2 /*return*/, Promise.reject(error_2 instanceof Error ? error_2 : new Error('Unknown error occurred'))];
10107
10126
  case 7:
10108
10127
  return [2 /*return*/];
@@ -10440,136 +10459,46 @@ var mParticle = (function () {
10440
10459
  return CookieConsentManager;
10441
10460
  }();
10442
10461
 
10443
- // Header key constants
10444
- var HEADER_ACCEPT = 'Accept';
10445
- var HEADER_CONTENT_TYPE = 'Content-Type';
10446
- var HEADER_ROKT_LAUNCHER_VERSION = 'rokt-launcher-version';
10447
- var HEADER_ROKT_LAUNCHER_INSTANCE_GUID = 'rokt-launcher-instance-guid';
10448
- var HEADER_ROKT_WSDK_VERSION = 'rokt-wsdk-version';
10449
- var ReportingLogger = /** @class */function () {
10450
- function ReportingLogger(config, sdkVersion, store, launcherInstanceGuid, rateLimiter) {
10451
- var _this = this;
10452
- this.sdkVersion = sdkVersion;
10453
- this.launcherInstanceGuid = launcherInstanceGuid;
10454
- this.reporter = 'mp-wsdk';
10455
- this.isFeatureFlagEnabled = function () {
10456
- return _this.isLoggingEnabled;
10457
- };
10458
- this.loggingUrl = "https://".concat(config.loggingUrl || Constants.DefaultBaseUrls.loggingUrl);
10459
- this.errorUrl = "https://".concat(config.errorUrl || Constants.DefaultBaseUrls.errorUrl);
10460
- this.isLoggingEnabled = config.isLoggingEnabled || false;
10461
- this.store = store !== null && store !== void 0 ? store : null;
10462
- this.isEnabled = this.isReportingEnabled();
10463
- this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new RateLimiter();
10464
- }
10465
- ReportingLogger.prototype.setStore = function (store) {
10466
- this.store = store;
10467
- };
10468
- ReportingLogger.prototype.info = function (msg, code) {
10469
- this.sendLog(WSDKErrorSeverity.INFO, msg, code);
10470
- };
10471
- ReportingLogger.prototype.error = function (msg, code, stackTrace) {
10472
- this.sendError(WSDKErrorSeverity.ERROR, msg, code, stackTrace);
10473
- };
10474
- ReportingLogger.prototype.warning = function (msg, code) {
10475
- this.sendError(WSDKErrorSeverity.WARNING, msg, code);
10476
- };
10477
- ReportingLogger.prototype.sendToServer = function (url, severity, msg, code, stackTrace) {
10478
- if (!this.canSendLog(severity)) return;
10479
- try {
10480
- var logRequest = this.buildLogRequest(severity, msg, code, stackTrace);
10481
- var uploader = new FetchUploader(url);
10482
- var payload = {
10483
- method: 'POST',
10484
- headers: this.getHeaders(),
10485
- body: JSON.stringify(logRequest)
10486
- };
10487
- uploader.upload(payload)["catch"](function (error) {
10488
- console.error('ReportingLogger: Failed to send log', error);
10489
- });
10490
- } catch (error) {
10491
- console.error('ReportingLogger: Failed to send log', error);
10492
- }
10493
- };
10494
- ReportingLogger.prototype.sendLog = function (severity, msg, code, stackTrace) {
10495
- this.sendToServer(this.loggingUrl, severity, msg, code, stackTrace);
10496
- };
10497
- ReportingLogger.prototype.sendError = function (severity, msg, code, stackTrace) {
10498
- this.sendToServer(this.errorUrl, severity, msg, code, stackTrace);
10499
- };
10500
- ReportingLogger.prototype.buildLogRequest = function (severity, msg, code, stackTrace) {
10501
- var _a, _b;
10502
- return {
10503
- additionalInformation: {
10504
- message: msg,
10505
- version: this.getVersion()
10506
- },
10507
- severity: severity,
10508
- code: code !== null && code !== void 0 ? code : ErrorCodes.UNKNOWN_ERROR,
10509
- url: this.getUrl(),
10510
- deviceInfo: this.getUserAgent(),
10511
- stackTrace: stackTrace,
10512
- reporter: this.reporter,
10513
- // Integration will be set to integrationName once the kit connects via RoktManager.attachKit()
10514
- integration: (_b = (_a = this.store) === null || _a === void 0 ? void 0 : _a.getIntegrationName()) !== null && _b !== void 0 ? _b : 'mp-wsdk'
10515
- };
10516
- };
10517
- ReportingLogger.prototype.getVersion = function () {
10518
- var _a, _b, _c;
10519
- return (_c = (_b = (_a = this.store) === null || _a === void 0 ? void 0 : _a.getIntegrationName) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : "mParticle_wsdkv_".concat(this.sdkVersion);
10520
- };
10521
- ReportingLogger.prototype.isReportingEnabled = function () {
10522
- return this.isDebugModeEnabled() || this.isRoktDomainPresent() && this.isFeatureFlagEnabled();
10523
- };
10524
- ReportingLogger.prototype.isRoktDomainPresent = function () {
10525
- return typeof window !== 'undefined' && Boolean(window['ROKT_DOMAIN']);
10526
- };
10527
- ReportingLogger.prototype.isDebugModeEnabled = function () {
10528
- var _a, _b, _c, _d;
10529
- return typeof window !== 'undefined' && ((_d = (_c = (_b = (_a = window.location) === null || _a === void 0 ? void 0 : _a.search) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === null || _c === void 0 ? void 0 : _c.includes('mp_enable_logging=true')) !== null && _d !== void 0 ? _d : false);
10530
- };
10531
- ReportingLogger.prototype.canSendLog = function (severity) {
10532
- return this.isEnabled && !this.isRateLimited(severity);
10533
- };
10534
- ReportingLogger.prototype.isRateLimited = function (severity) {
10535
- return this.rateLimiter.incrementAndCheck(severity);
10462
+ var ErrorReportingDispatcher = /** @class */function () {
10463
+ function ErrorReportingDispatcher() {
10464
+ this.services = [];
10465
+ }
10466
+ ErrorReportingDispatcher.prototype.register = function (service) {
10467
+ this.services.push(service);
10536
10468
  };
10537
- ReportingLogger.prototype.getUrl = function () {
10538
- var _a;
10539
- return typeof window !== 'undefined' ? (_a = window.location) === null || _a === void 0 ? void 0 : _a.href : undefined;
10469
+ ErrorReportingDispatcher.prototype.report = function (error) {
10470
+ var _this = this;
10471
+ this.services.forEach(function (s) {
10472
+ var _a;
10473
+ try {
10474
+ s.report(error);
10475
+ } catch (e) {
10476
+ (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.error('Error in ErrorReportingService: ' + e);
10477
+ }
10478
+ });
10540
10479
  };
10541
- ReportingLogger.prototype.getUserAgent = function () {
10542
- var _a;
10543
- return typeof window !== 'undefined' ? (_a = window.navigator) === null || _a === void 0 ? void 0 : _a.userAgent : undefined;
10480
+ return ErrorReportingDispatcher;
10481
+ }();
10482
+
10483
+ var LoggingDispatcher = /** @class */function () {
10484
+ function LoggingDispatcher() {
10485
+ this.services = [];
10486
+ }
10487
+ LoggingDispatcher.prototype.register = function (service) {
10488
+ this.services.push(service);
10544
10489
  };
10545
- ReportingLogger.prototype.getHeaders = function () {
10546
- var _a;
10547
- var _b, _c;
10548
- var headers = (_a = {}, _a[HEADER_ACCEPT] = 'text/plain;charset=UTF-8', _a[HEADER_CONTENT_TYPE] = 'application/json', _a[HEADER_ROKT_LAUNCHER_VERSION] = this.getVersion(), _a[HEADER_ROKT_WSDK_VERSION] = 'joint', _a);
10549
- if (this.launcherInstanceGuid) {
10550
- headers[HEADER_ROKT_LAUNCHER_INSTANCE_GUID] = this.launcherInstanceGuid;
10551
- }
10552
- var accountId = (_c = (_b = this.store) === null || _b === void 0 ? void 0 : _b.getRoktAccountId) === null || _c === void 0 ? void 0 : _c.call(_b);
10553
- if (accountId) {
10554
- headers['rokt-account-id'] = accountId;
10555
- }
10556
- return headers;
10490
+ LoggingDispatcher.prototype.log = function (entry) {
10491
+ var _this = this;
10492
+ this.services.forEach(function (s) {
10493
+ var _a;
10494
+ try {
10495
+ s.log(entry);
10496
+ } catch (e) {
10497
+ (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.error('Error in LoggingService: ' + e);
10498
+ }
10499
+ });
10557
10500
  };
10558
- return ReportingLogger;
10559
- }();
10560
- var RateLimiter = /** @class */function () {
10561
- function RateLimiter() {
10562
- this.rateLimits = new Map([[WSDKErrorSeverity.ERROR, 10], [WSDKErrorSeverity.WARNING, 10], [WSDKErrorSeverity.INFO, 10]]);
10563
- this.logCount = new Map();
10564
- }
10565
- RateLimiter.prototype.incrementAndCheck = function (severity) {
10566
- var count = this.logCount.get(severity) || 0;
10567
- var limit = this.rateLimits.get(severity) || 10;
10568
- var newCount = count + 1;
10569
- this.logCount.set(severity, newCount);
10570
- return newCount > limit;
10571
- };
10572
- return RateLimiter;
10501
+ return LoggingDispatcher;
10573
10502
  }();
10574
10503
 
10575
10504
  var Messages = Constants.Messages,
@@ -10612,6 +10541,8 @@ var mParticle = (function () {
10612
10541
  integrationDelays: {},
10613
10542
  forwarderConstructors: []
10614
10543
  };
10544
+ this._ErrorReportingDispatcher = new ErrorReportingDispatcher();
10545
+ this._LoggingDispatcher = new LoggingDispatcher();
10615
10546
  this._RoktManager = new RoktManager();
10616
10547
  this._RoktManager.setOnReadyCallback(function () {
10617
10548
  self.processQueueOnIdentityFailure();
@@ -10709,14 +10640,16 @@ var mParticle = (function () {
10709
10640
  console.error('Cannot reset mParticle', error);
10710
10641
  }
10711
10642
  };
10712
- this._resetForTests = function (config, keepPersistence, instance, reportingLogger) {
10643
+ this._resetForTests = function (config, keepPersistence, instance) {
10713
10644
  if (instance._Store) {
10714
10645
  delete instance._Store;
10715
10646
  }
10716
- instance.Logger = new Logger(config, reportingLogger);
10647
+ instance._ErrorReportingDispatcher = new ErrorReportingDispatcher();
10648
+ instance._LoggingDispatcher = new LoggingDispatcher();
10649
+ instance.Logger = new Logger(config);
10650
+ instance._ErrorReportingDispatcher.logger = instance.Logger;
10651
+ instance._LoggingDispatcher.logger = instance.Logger;
10717
10652
  instance._Store = new Store(config, instance);
10718
- // Update ReportingLogger with the new Store reference to avoid stale data
10719
- reportingLogger === null || reportingLogger === void 0 ? void 0 : reportingLogger.setStore(instance._Store);
10720
10653
  instance._Store.isLocalStorageAvailable = instance._Persistence.determineLocalStorageAvailability(window.localStorage);
10721
10654
  instance._Events.stopTracking();
10722
10655
  if (!keepPersistence) {
@@ -11532,6 +11465,12 @@ var mParticle = (function () {
11532
11465
  };
11533
11466
  }
11534
11467
  };
11468
+ this._registerErrorReportingService = function (service) {
11469
+ self._ErrorReportingDispatcher.register(service);
11470
+ };
11471
+ this._registerLoggingService = function (service) {
11472
+ self._LoggingDispatcher.register(service);
11473
+ };
11535
11474
  var launcherInstanceGuidKey = Constants.Rokt.LauncherInstanceGuidKey;
11536
11475
  this.setLauncherInstanceGuid = function () {
11537
11476
  if (!window[launcherInstanceGuidKey] || typeof window[launcherInstanceGuidKey] !== 'string') {
@@ -11608,7 +11547,7 @@ var mParticle = (function () {
11608
11547
  domain: config === null || config === void 0 ? void 0 : config.domain
11609
11548
  };
11610
11549
  // https://go.mparticle.com/work/SQDSDKS-7339
11611
- mpInstance._RoktManager.init(roktConfig, roktFilteredUser, mpInstance.Identity, mpInstance._Store, mpInstance.Logger, roktOptions, mpInstance.captureTiming);
11550
+ mpInstance._RoktManager.init(roktConfig, roktFilteredUser, mpInstance.Identity, mpInstance._Store, mpInstance.Logger, roktOptions, mpInstance.captureTiming, mpInstance._ErrorReportingDispatcher, mpInstance._LoggingDispatcher);
11612
11551
  }
11613
11552
  mpInstance._Forwarders.processForwarders(config, mpInstance._APIClient.prepareForwardingStats);
11614
11553
  mpInstance._Forwarders.processPixelConfigs(config);
@@ -11702,11 +11641,11 @@ var mParticle = (function () {
11702
11641
  }
11703
11642
  function runPreConfigFetchInitialization(mpInstance, apiKey, config) {
11704
11643
  var _a;
11705
- mpInstance._ReportingLogger = new ReportingLogger(config, Constants.sdkVersion, undefined, mpInstance.getLauncherInstanceGuid());
11706
- mpInstance.Logger = new Logger(config, mpInstance._ReportingLogger);
11644
+ mpInstance.Logger = new Logger(config);
11645
+ mpInstance._ErrorReportingDispatcher.logger = mpInstance.Logger;
11646
+ mpInstance._LoggingDispatcher.logger = mpInstance.Logger;
11707
11647
  mpInstance._Store = new Store(config, mpInstance, apiKey);
11708
11648
  window.mParticle.Store = mpInstance._Store;
11709
- mpInstance._ReportingLogger.setStore(mpInstance._Store);
11710
11649
  mpInstance.Logger.verbose(StartingInitialization);
11711
11650
  // Initialize CookieConsentManager with privacy flags from launcherOptions
11712
11651
  var _b = (_a = config === null || config === void 0 ? void 0 : config.launcherOptions) !== null && _a !== void 0 ? _a : {},
@@ -12243,6 +12182,12 @@ var mParticle = (function () {
12243
12182
  this._setWrapperSDKInfo = function (name, version) {
12244
12183
  self.getInstance()._setWrapperSDKInfo(name, version);
12245
12184
  };
12185
+ this._registerErrorReportingService = function (service) {
12186
+ self.getInstance()._registerErrorReportingService(service);
12187
+ };
12188
+ this._registerLoggingService = function (service) {
12189
+ self.getInstance()._registerLoggingService(service);
12190
+ };
12246
12191
  }
12247
12192
  var mParticleManager = new mParticleInstanceManager();
12248
12193
  if (typeof window !== 'undefined') {
@@ -0,0 +1,34 @@
1
+ import { BatchUploader } from './batchUploader';
2
+ import { SDKEvent, SDKDataPlan } from './sdkRuntimeModels';
3
+ import KitBlocker from './kitBlocking';
4
+ import { Dictionary } from './utils';
5
+ import { IUploadObject } from './serverModel';
6
+ import { MPForwarder } from './forwarders.interfaces';
7
+ import { IMParticleUser, ISDKUserAttributes } from './identity-user-interfaces';
8
+ import { AsyncUploader } from './uploaders';
9
+ import { IMParticleWebSDKInstance } from './mp-instance';
10
+ export interface IAPIClient {
11
+ uploader: BatchUploader | null;
12
+ queueEventForBatchUpload: (event: SDKEvent) => void;
13
+ processQueuedEvents: () => void;
14
+ appendUserInfoToEvents: (user: IMParticleUser, events: SDKEvent[]) => void;
15
+ sendEventToServer: (event: SDKEvent, _options?: Dictionary<any>) => void;
16
+ sendSingleEventToServer: (event: SDKEvent) => void;
17
+ sendBatchForwardingStatsToServer: (forwardingStatsData: IForwardingStatsData, xhr: XMLHttpRequest) => void;
18
+ initializeForwarderStatsUploader: () => AsyncUploader;
19
+ prepareForwardingStats: (forwarder: MPForwarder, event: IUploadObject) => void;
20
+ }
21
+ export interface IForwardingStatsData {
22
+ mid: number;
23
+ esid: number;
24
+ n: string;
25
+ attrs: ISDKUserAttributes;
26
+ sdk: string;
27
+ dt: number;
28
+ et: number;
29
+ dbg: boolean;
30
+ ct: number;
31
+ eec: number;
32
+ dp: SDKDataPlan;
33
+ }
34
+ export default function APIClient(this: IAPIClient, mpInstance: IMParticleWebSDKInstance, kitBlocker: KitBlocker): void;
@@ -0,0 +1,4 @@
1
+ export default class Audience {
2
+ audience_id: number;
3
+ constructor(audience_id: number);
4
+ }
@@ -0,0 +1,19 @@
1
+ import { SDKLoggerApi } from './sdkRuntimeModels';
2
+ import { AsyncUploader } from './uploaders';
3
+ import Audience from './audience';
4
+ export interface IAudienceMembershipsServerResponse {
5
+ dt: 'cam';
6
+ ct: number;
7
+ id: string;
8
+ audience_memberships: Audience[];
9
+ }
10
+ export interface IAudienceMemberships {
11
+ currentAudienceMemberships: Audience[];
12
+ }
13
+ export default class AudienceManager {
14
+ url: string;
15
+ userAudienceAPI: AsyncUploader;
16
+ logger: SDKLoggerApi;
17
+ constructor(userAudienceUrl: string, apiKey: string, logger: SDKLoggerApi);
18
+ sendGetUserAudienceRequest(mpid: string, callback: (userAudiences: IAudienceMemberships) => void): Promise<void>;
19
+ }
@@ -0,0 +1,72 @@
1
+ import { Batch } from '@mparticle/event-models';
2
+ import { SDKEvent } from './sdkRuntimeModels';
3
+ import { IMParticleWebSDKInstance } from './mp-instance';
4
+ /**
5
+ * BatchUploader contains all the logic to store/retrieve events and batches
6
+ * to/from persistence, and upload batches to mParticle.
7
+ * It queues events as they come in, storing them in persistence, then at set
8
+ * intervals turns them into batches and transfers between event and batch
9
+ * persistence.
10
+ * It then attempts to upload them to mParticle, purging batch persistence if
11
+ * the upload is successful
12
+ *
13
+ * These uploads happen on an interval basis using window.fetch or XHR
14
+ * requests, depending on what is available in the browser.
15
+ *
16
+ * Uploads can also be triggered on browser visibility/focus changes via an
17
+ * event listener, which then uploads to mPartice via the browser's Beacon API.
18
+ */
19
+ export declare class BatchUploader {
20
+ static readonly CONTENT_TYPE: string;
21
+ static readonly MINIMUM_INTERVAL_MILLIS: number;
22
+ uploadIntervalMillis: number;
23
+ eventsQueuedForProcessing: SDKEvent[];
24
+ batchesQueuedForProcessing: Batch[];
25
+ mpInstance: IMParticleWebSDKInstance;
26
+ uploadUrl: string;
27
+ batchingEnabled: boolean;
28
+ private eventVault;
29
+ private batchVault;
30
+ private offlineStorageEnabled;
31
+ private uploader;
32
+ private lastASTEventTime;
33
+ private readonly AST_DEBOUNCE_MS;
34
+ /**
35
+ * Creates an instance of a BatchUploader
36
+ * @param {IMParticleWebSDKInstance} mpInstance - the mParticle SDK instance
37
+ * @param {number} uploadInterval - the desired upload interval in milliseconds
38
+ */
39
+ constructor(mpInstance: IMParticleWebSDKInstance, uploadInterval: number);
40
+ private isOfflineStorageAvailable;
41
+ private shouldDebounceAndUpdateLastASTTime;
42
+ private createBackgroundASTEvent;
43
+ private addEventListeners;
44
+ private isBeaconAvailable;
45
+ private triggerUploadInterval;
46
+ /**
47
+ * This method will queue a single Event which will eventually be processed into a Batch
48
+ * @param event event that should be queued
49
+ */
50
+ queueEvent(event: SDKEvent): void;
51
+ private shouldTriggerImmediateUpload;
52
+ /**
53
+ * This implements crucial logic to:
54
+ * - bucket pending events by MPID, and then by Session, and upload individual batches for each bucket.
55
+ *
56
+ * In the future this should enforce other requirements such as maximum batch size.
57
+ *
58
+ * @param sdkEvents current pending events
59
+ * @param defaultUser the user to reference for events that are missing data
60
+ */
61
+ private static createNewBatches;
62
+ /**
63
+ * This is the main loop function:
64
+ * - take all pending events and turn them into batches
65
+ * - attempt to upload each batch
66
+ *
67
+ * @param triggerFuture whether to trigger the loop again - for manual/forced uploads this should be false
68
+ * @param useBeacon whether to use the beacon API - used when the page is being unloaded
69
+ */
70
+ prepareAndUpload(triggerFuture?: boolean, useBeacon?: boolean): Promise<void>;
71
+ private uploadBatches;
72
+ }