@@ -258,6 +258,43 @@ var constructor = function () {
258258
259259 self . domain = domain ;
260260
261+ // Register reporting services with the core SDK
262+ var reportingConfig = {
263+ loggingUrl : settings . loggingUrl ,
264+ errorUrl : settings . errorUrl ,
265+ isLoggingEnabled :
266+ settings . isLoggingEnabled === 'true' ||
267+ settings . isLoggingEnabled === true ,
268+ } ;
269+ var errorReportingService = new ErrorReportingService (
270+ reportingConfig ,
271+ self . integrationName ,
272+ window . __rokt_li_guid__ ,
273+ settings . accountId
274+ ) ;
275+ var loggingService = new LoggingService (
276+ reportingConfig ,
277+ errorReportingService ,
278+ self . integrationName ,
279+ window . __rokt_li_guid__ ,
280+ settings . accountId
281+ ) ;
282+
283+ self . errorReportingService = errorReportingService ;
284+ self . loggingService = loggingService ;
285+
286+ if (
287+ window . mParticle &&
288+ window . mParticle . _registerErrorReportingService
289+ ) {
290+ window . mParticle . _registerErrorReportingService (
291+ errorReportingService
292+ ) ;
293+ }
294+ if ( window . mParticle && window . mParticle . _registerLoggingService ) {
295+ window . mParticle . _registerLoggingService ( loggingService ) ;
296+ }
297+
261298 if ( testMode ) {
262299 self . testHelpers = {
263300 generateLauncherScript : generateLauncherScript ,
@@ -273,6 +310,12 @@ var constructor = function () {
273310 setAllowedOriginHashes : function ( hashes ) {
274311 _allowedOriginHashes = hashes ;
275312 } ,
313+ ReportingTransport : ReportingTransport ,
314+ ErrorReportingService : ErrorReportingService ,
315+ LoggingService : LoggingService ,
316+ RateLimiter : RateLimiter ,
317+ ErrorCodes : ErrorCodes ,
318+ WSDKErrorSeverity : WSDKErrorSeverity ,
276319 } ;
277320 attachLauncher ( accountId , launcherOptions ) ;
278321 return ;
@@ -983,6 +1026,225 @@ function isString(value) {
9831026 return typeof value === 'string' ;
9841027}
9851028
1029+ // --- Reporting Services ---
1030+
1031+ var ErrorCodes = {
1032+ UNKNOWN_ERROR : 'UNKNOWN_ERROR' ,
1033+ UNHANDLED_EXCEPTION : 'UNHANDLED_EXCEPTION' ,
1034+ IDENTITY_REQUEST : 'IDENTITY_REQUEST' ,
1035+ } ;
1036+
1037+ var WSDKErrorSeverity = {
1038+ ERROR : 'ERROR' ,
1039+ INFO : 'INFO' ,
1040+ WARNING : 'WARNING' ,
1041+ } ;
1042+
1043+ var DEFAULT_LOGGING_URL = 'apps.rokt-api.com/v1/log' ;
1044+ var DEFAULT_ERROR_URL = 'apps.rokt-api.com/v1/errors' ;
1045+ var RATE_LIMIT_PER_SEVERITY = 10 ;
1046+
1047+ function RateLimiter ( ) {
1048+ this . _logCount = { } ;
1049+ }
1050+
1051+ RateLimiter . prototype . incrementAndCheck = function ( severity ) {
1052+ var count = this . _logCount [ severity ] || 0 ;
1053+ var newCount = count + 1 ;
1054+ this . _logCount [ severity ] = newCount ;
1055+ return newCount > RATE_LIMIT_PER_SEVERITY ;
1056+ } ;
1057+
1058+ // --- ReportingTransport: shared transport layer for reporting services ---
1059+
1060+ function ReportingTransport (
1061+ config ,
1062+ integrationName ,
1063+ launcherInstanceGuid ,
1064+ accountId ,
1065+ rateLimiter
1066+ ) {
1067+ var self = this ;
1068+ self . _isLoggingEnabled = ( config && config . isLoggingEnabled ) || false ;
1069+ self . _integrationName = integrationName || '' ;
1070+ self . _launcherInstanceGuid = launcherInstanceGuid ;
1071+ self . _accountId = accountId || null ;
1072+ self . _rateLimiter = rateLimiter || new RateLimiter ( ) ;
1073+ self . _reporter = 'mp-wsdk' ;
1074+ self . _isEnabled = _isReportingEnabled ( self ) ;
1075+ }
1076+
1077+ ReportingTransport . prototype . send = function (
1078+ url ,
1079+ severity ,
1080+ msg ,
1081+ code ,
1082+ stackTrace ,
1083+ onError
1084+ ) {
1085+ if ( ! this . _isEnabled || this . _rateLimiter . incrementAndCheck ( severity ) ) {
1086+ return ;
1087+ }
1088+
1089+ try {
1090+ var logRequest = {
1091+ additionalInformation : {
1092+ message : msg ,
1093+ version : this . _integrationName || '' ,
1094+ } ,
1095+ severity : severity ,
1096+ code : code || ErrorCodes . UNKNOWN_ERROR ,
1097+ url : _getUrl ( ) ,
1098+ deviceInfo : _getUserAgent ( ) ,
1099+ stackTrace : stackTrace ,
1100+ reporter : this . _reporter ,
1101+ integration : this . _integrationName || '' ,
1102+ } ;
1103+ var headers = {
1104+ Accept : 'text/plain;charset=UTF-8' ,
1105+ 'Content-Type' : 'application/json' ,
1106+ 'rokt-launcher-version' : this . _integrationName || '' ,
1107+ 'rokt-wsdk-version' : 'joint' ,
1108+ } ;
1109+ if ( this . _launcherInstanceGuid ) {
1110+ headers [ 'rokt-launcher-instance-guid' ] = this . _launcherInstanceGuid ;
1111+ }
1112+ if ( this . _accountId ) {
1113+ headers [ 'rokt-account-id' ] = this . _accountId ;
1114+ }
1115+ var payload = {
1116+ method : 'POST' ,
1117+ headers : headers ,
1118+ body : JSON . stringify ( logRequest ) ,
1119+ } ;
1120+ fetch ( url , payload ) . catch ( function ( error ) {
1121+ console . error ( 'ReportingTransport: Failed to send log' , error ) ;
1122+ if ( onError ) {
1123+ onError ( error ) ;
1124+ }
1125+ } ) ;
1126+ } catch ( error ) {
1127+ console . error ( 'ReportingTransport: Failed to send log' , error ) ;
1128+ if ( onError ) {
1129+ onError ( error ) ;
1130+ }
1131+ }
1132+ } ;
1133+
1134+ function _isReportingEnabled ( transport ) {
1135+ return (
1136+ _isDebugModeEnabled ( ) ||
1137+ ( _isRoktDomainPresent ( ) && transport . _isLoggingEnabled )
1138+ ) ;
1139+ }
1140+
1141+ function _isRoktDomainPresent ( ) {
1142+ return typeof window !== 'undefined' && Boolean ( window [ 'ROKT_DOMAIN' ] ) ;
1143+ }
1144+
1145+ function _isDebugModeEnabled ( ) {
1146+ return (
1147+ typeof window !== 'undefined' &&
1148+ window . location &&
1149+ window . location . search &&
1150+ window . location . search
1151+ . toLowerCase ( )
1152+ . indexOf ( 'mp_enable_logging=true' ) !== - 1
1153+ ) ;
1154+ }
1155+
1156+ function _getUrl ( ) {
1157+ return typeof window !== 'undefined' && window . location
1158+ ? window . location . href
1159+ : undefined ;
1160+ }
1161+
1162+ function _getUserAgent ( ) {
1163+ return typeof window !== 'undefined' && window . navigator
1164+ ? window . navigator . userAgent
1165+ : undefined ;
1166+ }
1167+
1168+ // --- ErrorReportingService: handles ERROR and WARNING severity ---
1169+
1170+ function ErrorReportingService (
1171+ config ,
1172+ integrationName ,
1173+ launcherInstanceGuid ,
1174+ accountId ,
1175+ rateLimiter
1176+ ) {
1177+ this . _transport = new ReportingTransport (
1178+ config ,
1179+ integrationName ,
1180+ launcherInstanceGuid ,
1181+ accountId ,
1182+ rateLimiter
1183+ ) ;
1184+ this . _errorUrl =
1185+ 'https://' + ( ( config && config . errorUrl ) || DEFAULT_ERROR_URL ) ;
1186+ }
1187+
1188+ ErrorReportingService . prototype . report = function ( error ) {
1189+ if ( ! error ) {
1190+ return ;
1191+ }
1192+ var severity = error . severity || WSDKErrorSeverity . ERROR ;
1193+ this . _transport . send (
1194+ this . _errorUrl ,
1195+ severity ,
1196+ error . message ,
1197+ error . code ,
1198+ error . stackTrace
1199+ ) ;
1200+ } ;
1201+
1202+ // --- LoggingService: handles INFO severity ---
1203+
1204+ function LoggingService (
1205+ config ,
1206+ errorReportingService ,
1207+ integrationName ,
1208+ launcherInstanceGuid ,
1209+ accountId ,
1210+ rateLimiter
1211+ ) {
1212+ this . _transport = new ReportingTransport (
1213+ config ,
1214+ integrationName ,
1215+ launcherInstanceGuid ,
1216+ accountId ,
1217+ rateLimiter
1218+ ) ;
1219+ this . _loggingUrl =
1220+ 'https://' + ( ( config && config . loggingUrl ) || DEFAULT_LOGGING_URL ) ;
1221+ this . _errorReportingService = errorReportingService ;
1222+ }
1223+
1224+ LoggingService . prototype . log = function ( entry ) {
1225+ if ( ! entry ) {
1226+ return ;
1227+ }
1228+ var self = this ;
1229+ self . _transport . send (
1230+ self . _loggingUrl ,
1231+ WSDKErrorSeverity . INFO ,
1232+ entry . message ,
1233+ entry . code ,
1234+ undefined ,
1235+ function ( error ) {
1236+ if ( self . _errorReportingService ) {
1237+ self . _errorReportingService . report ( {
1238+ message :
1239+ 'LoggingService: Failed to send log: ' + error . message ,
1240+ code : ErrorCodes . UNKNOWN_ERROR ,
1241+ severity : WSDKErrorSeverity . ERROR ,
1242+ } ) ;
1243+ }
1244+ }
1245+ ) ;
1246+ } ;
1247+
9861248if ( window && window . mParticle && window . mParticle . addForwarder ) {
9871249 window . mParticle . addForwarder ( {
9881250 name : name ,
@@ -993,4 +1255,10 @@ if (window && window.mParticle && window.mParticle.addForwarder) {
9931255
9941256module . exports = {
9951257 register : register ,
1258+ ReportingTransport : ReportingTransport ,
1259+ ErrorReportingService : ErrorReportingService ,
1260+ LoggingService : LoggingService ,
1261+ RateLimiter : RateLimiter ,
1262+ ErrorCodes : ErrorCodes ,
1263+ WSDKErrorSeverity : WSDKErrorSeverity ,
9961264} ;
0 commit comments