create-store.js (4816B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 applyMiddleware, 9 createStore, 10 } = require("resource://devtools/client/shared/vendor/redux.js"); 11 12 const { 13 MIN_COLUMN_WIDTH, 14 DEFAULT_COLUMN_WIDTH, 15 } = require("resource://devtools/client/netmonitor/src/constants.js"); 16 17 // Middleware 18 const { 19 ignore, 20 } = require("resource://devtools/client/shared/redux/middleware/ignore.js"); 21 const { 22 thunk, 23 } = require("resource://devtools/client/shared/redux/middleware/thunk.js"); 24 const { 25 waitUntilService, 26 } = require("resource://devtools/client/shared/redux/middleware/wait-service.js"); 27 28 const batching = require("resource://devtools/client/netmonitor/src/middleware/batching.js"); 29 const prefs = require("resource://devtools/client/netmonitor/src/middleware/prefs.js"); 30 const throttling = require("resource://devtools/client/netmonitor/src/middleware/throttling.js"); 31 const eventTelemetry = require("resource://devtools/client/netmonitor/src/middleware/event-telemetry.js"); 32 const requestBlocking = require("resource://devtools/client/netmonitor/src/middleware/request-blocking.js"); 33 34 // Reducers 35 const rootReducer = require("resource://devtools/client/netmonitor/src/reducers/index.js"); 36 const { 37 FilterTypes, 38 Filters, 39 } = require("resource://devtools/client/netmonitor/src/reducers/filters.js"); 40 const { 41 Requests, 42 } = require("resource://devtools/client/netmonitor/src/reducers/requests.js"); 43 const { 44 Sort, 45 } = require("resource://devtools/client/netmonitor/src/reducers/sort.js"); 46 const { 47 TimingMarkers, 48 } = require("resource://devtools/client/netmonitor/src/reducers/timing-markers.js"); 49 const { 50 UI, 51 Columns, 52 ColumnsData, 53 } = require("resource://devtools/client/netmonitor/src/reducers/ui.js"); 54 const { 55 Messages, 56 getMessageDefaultColumnsState, 57 } = require("resource://devtools/client/netmonitor/src/reducers/messages.js"); 58 const { 59 Search, 60 } = require("resource://devtools/client/netmonitor/src/reducers/search.js"); 61 62 /** 63 * Configure state and middleware for the Network monitor tool. 64 */ 65 function configureStore(connector, commands, telemetry) { 66 // Prepare initial state. 67 const initialState = { 68 filters: new Filters(getFiltersState()), 69 requests: new Requests(), 70 sort: new Sort(), 71 timingMarkers: new TimingMarkers(), 72 ui: UI({ 73 columns: getColumnState(), 74 columnsData: getColumnsData(), 75 }), 76 messages: Messages({ 77 columns: getMessageColumnState(), 78 }), 79 search: new Search(), 80 }; 81 82 // Prepare middleware. 83 const middleware = applyMiddleware( 84 // Register ignore first to prevent any subsequent middleware from running 85 ignore, 86 87 requestBlocking(commands), 88 thunk({ connector, commands }), 89 prefs, 90 batching, 91 throttling(connector), 92 eventTelemetry(connector, telemetry), 93 waitUntilService 94 ); 95 96 return createStore(rootReducer, initialState, middleware); 97 } 98 99 // Helpers 100 101 /** 102 * Get column state from preferences. 103 */ 104 function getColumnState() { 105 const columns = Columns(); 106 const visibleColumns = getJsonPref("devtools.netmonitor.visibleColumns"); 107 108 const state = {}; 109 for (const col in columns) { 110 state[col] = visibleColumns.includes(col); 111 } 112 113 return state; 114 } 115 116 /** 117 * Get column state of Messages from preferences. 118 */ 119 function getMessageColumnState() { 120 const columns = getMessageDefaultColumnsState(); 121 const visibleColumns = getJsonPref("devtools.netmonitor.msg.visibleColumns"); 122 123 const state = {}; 124 for (const col in columns) { 125 state[col] = visibleColumns.includes(col); 126 } 127 128 return state; 129 } 130 131 /** 132 * Get columns data (width, min-width) 133 */ 134 function getColumnsData() { 135 const columnsData = getJsonPref("devtools.netmonitor.columnsData"); 136 if (!columnsData.length) { 137 return ColumnsData(); 138 } 139 140 const newMap = new Map(); 141 columnsData.forEach(col => { 142 if (col.name) { 143 col.minWidth = col.minWidth ? col.minWidth : MIN_COLUMN_WIDTH; 144 col.width = col.width ? col.width : DEFAULT_COLUMN_WIDTH; 145 newMap.set(col.name, col); 146 } 147 }); 148 149 return newMap; 150 } 151 152 /** 153 * Get filter state from preferences. 154 */ 155 function getFiltersState() { 156 const activeFilters = {}; 157 const filters = getJsonPref("devtools.netmonitor.filters"); 158 filters.forEach(filter => { 159 activeFilters[filter] = true; 160 }); 161 162 return { 163 requestFilterTypes: new FilterTypes(activeFilters), 164 requestFilterText: Services.prefs.getCharPref( 165 "devtools.netmonitor.requestfilter" 166 ), 167 }; 168 } 169 170 /** 171 * Get json data from preferences 172 */ 173 174 function getJsonPref(pref) { 175 try { 176 return JSON.parse(Services.prefs.getCharPref(pref)); 177 } catch (_) { 178 return []; 179 } 180 } 181 182 exports.configureStore = configureStore;