> r => activeFilters.some(filter => filter(r)) ); const getSortFn = createSelector( state => state.requests.requests, state => state.sort, (requests, sort) => { const sorter = Sorters[sort.type || "waterfall"]; const ascending = sort.ascending ? +1 : -1; return (a, b) => ascending * sortWithClones(requests, sorter, a, b); } ); const getSortedRequests = createSelector( state => state.requests.requests, getSortFn, (requests, sortFn) => [...requests].sort(sortFn) ); const getDisplayedRequests = createSelector( state => state.requests.requests, getFilterWithCloneFn, getSortFn, (requests, filterFn, sortFn) => requests.filter(filterFn).sort(sortFn) ); const getTypeFilteredRequests = createSelector( state => state.requests.requests, getTypeFilterFn, (requests, filterFn) => requests.filter(filterFn) ); const getDisplayedRequestsSummary = createSelector( getDisplayedRequests, state => state.requests.lastEndedMs - state.requests.firstStartedMs, (requests, totalMs) => { if (requests.length === 0) { return { count: 0, bytes: 0, ms: 0 }; } const totalBytes = requests.reduce( (totals, item) => { if (typeof item.contentSize == "number") { totals.contentSize += item.contentSize; } if ( typeof item.transferredSize == "number" && !(item.fromCache || item.fromServiceWorker || item.status === "304") ) { totals.transferredSize += item.transferredSize; } return totals; }, { contentSize: 0, transferredSize: 0 } ); return { count: requests.length, contentSize: totalBytes.contentSize, ms: totalMs, transferredSize: totalBytes.transferredSize, }; } ); const getSelectedRequest = createSelector( state => state.requests.requests, state => state.requests.selectedId, (requests, selectedId) => selectedId ? requests.find(item => item.id === selectedId) : undefined ); const isSelectedRequestVisible = createSelector( state => state.requests.selectedId, getDisplayedRequests, (selectedId, displayedRequests) => displayedRequests.some(r => r.id === selectedId) ); function getRequestById(state, id) { return state.requests.requests.find(item => item.id === id); } function getRequestByChannelId(state, channelId) { return [...state.requests.requests.values()].find( r => r.resourceId == channelId ); } function getDisplayedRequestById(state, id) { return getDisplayedRequests(state).find(r => r.id === id); } /** * Returns the current recording boolean state (HTTP traffic is * monitored or not monitored) */ function getRecordingState(state) { return state.requests.recording; } const getClickedRequest = createSelector( state => state.requests.requests, state => state.requests.clickedRequestId, (requests, clickedRequestId) => requests.find(request => request.id == clickedRequestId) ); /** * If a network override is set for the provided url, returns the override path. * Otherwise returns null. */ function getOverriddenUrl(toolboxState, url) { return toolboxState.networkOverrides.mutableOverrides[url] || null; } function hasOverride(toolboxState) { return !!Object.keys(toolboxState.networkOverrides.mutableOverrides).length; } module.exports = { getClickedRequest, getDisplayedRequestById, getDisplayedRequests, getDisplayedRequestsSummary, getOverriddenUrl, getRecordingState, getRequestById, getRequestByChannelId, getSelectedRequest, getSortedRequests, getTypeFilteredRequests, hasOverride, isSelectedRequestVisible, }; PK