2018-05-09 12:01:36 +05:30
|
|
|
export default class PerformanceBarStore {
|
|
|
|
constructor() {
|
|
|
|
this.requests = [];
|
|
|
|
}
|
|
|
|
|
2019-12-21 20:55:43 +05:30
|
|
|
addRequest(requestId, requestUrl) {
|
2018-05-09 12:01:36 +05:30
|
|
|
if (!this.findRequest(requestId)) {
|
2020-01-01 13:55:28 +05:30
|
|
|
const shortUrl = PerformanceBarStore.truncateUrl(requestUrl);
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
this.requests.push({
|
|
|
|
id: requestId,
|
|
|
|
url: requestUrl,
|
2020-01-01 13:55:28 +05:30
|
|
|
truncatedUrl: shortUrl,
|
2019-12-21 20:55:43 +05:30
|
|
|
details: {},
|
|
|
|
hasWarnings: false,
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.requests;
|
|
|
|
}
|
|
|
|
|
|
|
|
findRequest(requestId) {
|
2021-03-08 18:12:59 +05:30
|
|
|
return this.requests.find((request) => request.id === requestId);
|
2018-05-09 12:01:36 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
addRequestDetails(requestId, requestDetails) {
|
|
|
|
const request = this.findRequest(requestId);
|
|
|
|
|
2019-12-21 20:55:43 +05:30
|
|
|
request.details = requestDetails.data;
|
|
|
|
request.hasWarnings = requestDetails.has_warnings;
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
return request;
|
|
|
|
}
|
|
|
|
|
2020-01-01 13:55:28 +05:30
|
|
|
setRequestDetailsData(requestId, metricKey, requestDetailsData) {
|
|
|
|
const selectedRequest = this.findRequest(requestId);
|
|
|
|
if (selectedRequest) {
|
|
|
|
selectedRequest.details = {
|
|
|
|
...selectedRequest.details,
|
|
|
|
[metricKey]: requestDetailsData,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
requestsWithDetails() {
|
2021-03-08 18:12:59 +05:30
|
|
|
return this.requests.filter((request) => request.details);
|
2018-05-09 12:01:36 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
canTrackRequest(requestUrl) {
|
2021-04-29 21:17:54 +05:30
|
|
|
// We want to store at most 2 unique requests per URL, as additional
|
|
|
|
// requests to the same URL probably aren't very interesting.
|
|
|
|
//
|
|
|
|
// GraphQL requests are the exception: because all GraphQL requests
|
|
|
|
// go to the same URL, we set a higher limit of 10 to allow
|
|
|
|
// capturing different queries a page may make.
|
|
|
|
const requestsLimit = requestUrl.endsWith('/api/graphql') ? 10 : 2;
|
|
|
|
|
|
|
|
return this.requests.filter((request) => request.url === requestUrl).length < requestsLimit;
|
2018-05-09 12:01:36 +05:30
|
|
|
}
|
2020-01-01 13:55:28 +05:30
|
|
|
|
|
|
|
static truncateUrl(requestUrl) {
|
|
|
|
const [rootAndQuery] = requestUrl.split('#');
|
|
|
|
const [root, query] = rootAndQuery.split('?');
|
|
|
|
const components = root.replace(/\/$/, '').split('/');
|
|
|
|
|
|
|
|
let truncated = components[components.length - 1];
|
|
|
|
if (truncated.match(/^\d+$/)) {
|
|
|
|
truncated = `${components[components.length - 2]}/${truncated}`;
|
|
|
|
}
|
|
|
|
if (query) {
|
|
|
|
truncated += `?${query}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
return truncated;
|
|
|
|
}
|
2018-05-09 12:01:36 +05:30
|
|
|
}
|