Skip to content

Commit efb8905

Browse files
feat: implement Rokt reporting service in kit (#70)
1 parent 33e5433 commit efb8905

File tree

2 files changed

+976
-1
lines changed

2 files changed

+976
-1
lines changed

src/Rokt-Kit.js

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
9861248
if (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

9941256
module.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

Comments
 (0)