react-native-gleapsdk
Version:
Know exactly why and how a bug happened. Get reports with screenshots, live action replays and all of the important metadata every time.
298 lines (288 loc) • 9.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
/* eslint-disable @typescript-eslint/no-unused-vars */
class GleapNetworkIntercepter {
requestId = 0;
requests = {};
maxRequests = 25;
stopped = false;
updatedCallback = null;
setUpdatedCallback(updatedCallback) {
this.updatedCallback = updatedCallback;
}
getRequests() {
return Object.values(this.requests);
}
setMaxRequests(maxRequests) {
this.maxRequests = maxRequests;
}
setStopped(stopped) {
this.stopped = stopped;
}
cleanRequests() {
var keys = Object.keys(this.requests);
if (keys.length > this.maxRequests) {
var keysToRemove = keys.slice(0, keys.length - this.maxRequests);
for (var i = 0; i < keysToRemove.length; i++) {
delete this.requests[keysToRemove[i]];
}
}
if (this.updatedCallback) {
this.updatedCallback();
}
}
calcRequestTime(gleapRequestId) {
if (!this.requests[gleapRequestId]) {
return;
}
var startDate = this.requests[gleapRequestId].date;
if (startDate && typeof startDate.getTime === 'function' && !Object.isFrozen(this.requests[gleapRequestId])) {
this.requests[gleapRequestId].duration = new Date().getTime() - startDate.getTime();
this.requests[gleapRequestId].date = this.requests[gleapRequestId].date.toString();
}
}
getTextContentSizeOk(text) {
if (text && text.length) {
const size = text.length * 16;
const kiloBytes = size / 1024;
const megaBytes = kiloBytes / 1024;
if (megaBytes < 0.2) {
return true;
}
}
return false;
}
prepareContent(text) {
if (!this.getTextContentSizeOk(text)) {
return '<content_too_large>';
}
return text;
}
cleanupPayload(payload) {
if (payload === undefined || payload === null) {
return '{}';
}
try {
if (ArrayBuffer.isView(payload)) {
return `{ type: "binary", length: ${payload.byteLength} }`;
}
} catch (exp) {}
return payload;
}
preparePayload(payload) {
var payloadText = this.cleanupPayload(payload);
return this.prepareContent(payloadText);
}
start() {
this.setStopped(false);
this.interceptNetworkRequests({
onFetch: (params, gleapRequestId) => {
if (this.stopped || params.length === 0) {
return;
}
if (params.length >= 2 && params[1] !== undefined) {
var method = params[1].method ? params[1].method : 'GET';
this.requests[gleapRequestId] = {
request: {
payload: this.preparePayload(params[1].body),
headers: params[1].headers
},
type: method,
url: params[0],
date: new Date()
};
} else {
this.requests[gleapRequestId] = {
request: {},
url: params[0],
type: 'GET',
date: new Date()
};
}
this.cleanRequests();
},
onFetchLoad: (req, gleapRequestId) => {
if (this.stopped || !gleapRequestId || !this.requests || !this.requests[gleapRequestId]) {
return;
}
try {
this.requests[gleapRequestId].success = true;
this.requests[gleapRequestId].response = {
status: req.status,
statusText: '',
responseText: '<request_still_open>'
};
this.calcRequestTime(gleapRequestId);
} catch (exp) {}
req.text().then(responseText => {
if (this.requests && this.requests[gleapRequestId]) {
this.requests[gleapRequestId].success = true;
this.requests[gleapRequestId].response = {
status: req.status,
statusText: req.statusText,
responseText: this.prepareContent(responseText)
};
this.calcRequestTime(gleapRequestId);
this.cleanRequests();
}
}).catch(_err => {
if (this) {
this.cleanRequests();
}
});
},
onFetchFailed: (_err, gleapRequestId) => {
if (this.stopped || !gleapRequestId) {
return;
}
if (this.requests && this.requests[gleapRequestId]) {
this.requests[gleapRequestId].success = false;
this.calcRequestTime(gleapRequestId);
}
this.cleanRequests();
},
onOpen: (request, args) => {
if (this.stopped) {
return;
}
if (request && request.gleapRequestId && args.length >= 2 && this.requests) {
this.requests[request.gleapRequestId] = {
type: args[0],
url: args[1],
date: new Date()
};
}
this.cleanRequests();
},
onSend: (request, args) => {
if (this.stopped) {
return;
}
if (request && request.gleapRequestId && this.requests && this.requests[request.gleapRequestId]) {
this.requests[request.gleapRequestId].request = {
payload: this.preparePayload(args.length > 0 ? args[0] : ''),
headers: request.requestHeaders
};
}
this.cleanRequests();
},
onError: request => {
if (!this.stopped && this.requests && request && request.gleapRequestId && this.requests[request.gleapRequestId]) {
this.requests[request.gleapRequestId].success = false;
this.calcRequestTime(request.gleapRequestId);
}
this.cleanRequests();
},
onLoad: request => {
if (this.stopped) {
return;
}
if (request && request.gleapRequestId && this.requests && this.requests[request.gleapRequestId]) {
const contentType = request.getResponseHeader('content-type');
const isTextOrJSON = contentType && (contentType.includes('json') || contentType.includes('text'));
var responseText = '<' + contentType + '>';
if (request.responseType === '' || request.responseType === 'text') {
responseText = request.responseText;
}
if (request._response && isTextOrJSON) {
responseText = request._response;
}
this.requests[request.gleapRequestId].success = true;
this.requests[request.gleapRequestId].response = {
status: request.status,
responseText: this.prepareContent(responseText)
};
this.calcRequestTime(request.gleapRequestId);
}
this.cleanRequests();
}
});
}
interceptNetworkRequests(callback) {
// eslint-disable-next-line consistent-this
var self = this;
// @ts-ignore
if (XMLHttpRequest.prototype.gleapTouched) {
return;
}
// @ts-ignore
XMLHttpRequest.prototype.gleapTouched = true;
// XMLHttpRequest
const open = XMLHttpRequest.prototype.open;
const send = XMLHttpRequest.prototype.send;
// @ts-ignore
XMLHttpRequest.prototype.wrappedSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
// @ts-ignore
if (!this.requestHeaders) {
// @ts-ignore
this.requestHeaders = {};
}
// @ts-ignore
if (this.requestHeaders && this.requestHeaders.hasOwnProperty(header)) {
return;
}
// @ts-ignore
if (!this.requestHeaders[header]) {
// @ts-ignore
this.requestHeaders[header] = [];
}
// @ts-ignore
this.requestHeaders[header].push(value);
// @ts-ignore
this.wrappedSetRequestHeader(header, value);
};
XMLHttpRequest.prototype.open = function () {
this.gleapRequestId = ++self.requestId;
callback.onOpen && callback.onOpen(this, arguments);
if (callback.onLoad) {
this.addEventListener('load', function () {
// @ts-ignore
callback.onLoad(this);
});
}
if (callback.onError) {
this.addEventListener('error', function () {
// @ts-ignore
callback.onError(this);
});
}
// @ts-ignore
return open.apply(this, arguments);
};
XMLHttpRequest.prototype.send = function () {
callback.onSend && callback.onSend(this, arguments);
// @ts-ignore
return send.apply(this, arguments);
};
// Fetch
if (global) {
(function () {
var originalFetch = global.fetch;
global.fetch = function () {
var gleapRequestId = ++self.requestId;
callback.onFetch(arguments, gleapRequestId);
return originalFetch
// @ts-ignore
.apply(this, arguments).then(function (response) {
if (response && typeof response.clone === 'function') {
const data = response.clone();
callback.onFetchLoad(data, gleapRequestId);
}
return response;
}).catch(err => {
callback.onFetchFailed(err, gleapRequestId);
throw err;
});
};
})();
}
return callback;
}
}
var _default = GleapNetworkIntercepter;
exports.default = _default;
//# sourceMappingURL=networklogger.js.map