mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2024-11-21 17:16:42 +03:00
Fix monitoring on opening panel (#1739)
* Fix monitoring on opening panel * Create polite-foxes-rest.md * Further cleanup * Fix * Simplify * ===
This commit is contained in:
parent
e49708d831
commit
fd9f9504f0
5
.changeset/polite-foxes-rest.md
Normal file
5
.changeset/polite-foxes-rest.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'remotedev-redux-devtools-extension': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix monitoring on opening panel
|
|
@ -161,10 +161,6 @@ export type UpdateStateRequest<S, A extends Action<string>> =
|
||||||
| SerializedActionMessage
|
| SerializedActionMessage
|
||||||
| SerializedStateMessage<S, A>;
|
| SerializedStateMessage<S, A>;
|
||||||
|
|
||||||
export interface EmptyUpdateStateAction {
|
|
||||||
readonly type: typeof UPDATE_STATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface UpdateStateAction<S, A extends Action<string>> {
|
interface UpdateStateAction<S, A extends Action<string>> {
|
||||||
readonly type: typeof UPDATE_STATE;
|
readonly type: typeof UPDATE_STATE;
|
||||||
request: UpdateStateRequest<S, A>;
|
request: UpdateStateRequest<S, A>;
|
||||||
|
@ -213,11 +209,6 @@ export type PanelMessage<S, A extends Action<string>> =
|
||||||
export type PanelMessageWithSplitAction<S, A extends Action<string>> =
|
export type PanelMessageWithSplitAction<S, A extends Action<string>> =
|
||||||
| PanelMessage<S, A>
|
| PanelMessage<S, A>
|
||||||
| SplitUpdateStateAction<S, A>;
|
| SplitUpdateStateAction<S, A>;
|
||||||
export type MonitorMessage =
|
|
||||||
| NAAction
|
|
||||||
| ErrorMessage
|
|
||||||
| EmptyUpdateStateAction
|
|
||||||
| SetPersistAction;
|
|
||||||
|
|
||||||
type TabPort = Omit<chrome.runtime.Port, 'postMessage'> & {
|
type TabPort = Omit<chrome.runtime.Port, 'postMessage'> & {
|
||||||
postMessage: (message: TabMessage) => void;
|
postMessage: (message: TabMessage) => void;
|
||||||
|
@ -227,20 +218,15 @@ type PanelPort = Omit<chrome.runtime.Port, 'postMessage'> & {
|
||||||
message: PanelMessageWithSplitAction<S, A>,
|
message: PanelMessageWithSplitAction<S, A>,
|
||||||
) => void;
|
) => void;
|
||||||
};
|
};
|
||||||
type MonitorPort = Omit<chrome.runtime.Port, 'postMessage'> & {
|
|
||||||
postMessage: (message: MonitorMessage) => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const CONNECTED = 'socket/CONNECTED';
|
export const CONNECTED = 'socket/CONNECTED';
|
||||||
export const DISCONNECTED = 'socket/DISCONNECTED';
|
export const DISCONNECTED = 'socket/DISCONNECTED';
|
||||||
const connections: {
|
const connections: {
|
||||||
readonly tab: { [K in number | string]: TabPort };
|
readonly tab: { [K in number | string]: TabPort };
|
||||||
readonly panel: { [K in number | string]: PanelPort };
|
readonly panel: { [K in number | string]: PanelPort };
|
||||||
readonly monitor: { [K in number | string]: MonitorPort };
|
|
||||||
} = {
|
} = {
|
||||||
tab: {},
|
tab: {},
|
||||||
panel: {},
|
panel: {},
|
||||||
monitor: {},
|
|
||||||
};
|
};
|
||||||
const chunks: {
|
const chunks: {
|
||||||
[instanceId: string]: PageScriptToContentScriptMessageForwardedToMonitors<
|
[instanceId: string]: PageScriptToContentScriptMessageForwardedToMonitors<
|
||||||
|
@ -249,7 +235,6 @@ const chunks: {
|
||||||
>;
|
>;
|
||||||
} = {};
|
} = {};
|
||||||
let monitors = 0;
|
let monitors = 0;
|
||||||
let isMonitored = false;
|
|
||||||
|
|
||||||
const getId = (sender: chrome.runtime.MessageSender, name?: string) =>
|
const getId = (sender: chrome.runtime.MessageSender, name?: string) =>
|
||||||
sender.tab ? sender.tab.id! : name || sender.id!;
|
sender.tab ? sender.tab.id! : name || sender.id!;
|
||||||
|
@ -264,10 +249,7 @@ type MonitorAction<S, A extends Action<string>> =
|
||||||
const maxChromeMsgSize = 32 * 1024 * 1024;
|
const maxChromeMsgSize = 32 * 1024 * 1024;
|
||||||
|
|
||||||
function toMonitors<S, A extends Action<string>>(action: MonitorAction<S, A>) {
|
function toMonitors<S, A extends Action<string>>(action: MonitorAction<S, A>) {
|
||||||
for (const port of [
|
for (const port of Object.values(connections.panel)) {
|
||||||
...Object.values(connections.monitor),
|
|
||||||
...Object.values(connections.panel),
|
|
||||||
]) {
|
|
||||||
try {
|
try {
|
||||||
port.postMessage(action);
|
port.postMessage(action);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -412,19 +394,6 @@ function toAllTabs(msg: TabMessage) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function monitorInstances(shouldMonitor: boolean, id?: string) {
|
|
||||||
if (!id && isMonitored === shouldMonitor) return;
|
|
||||||
const action = {
|
|
||||||
type: shouldMonitor ? ('START' as const) : ('STOP' as const),
|
|
||||||
};
|
|
||||||
if (id) {
|
|
||||||
if (connections.tab[id]) connections.tab[id].postMessage(action);
|
|
||||||
} else {
|
|
||||||
toAllTabs(action);
|
|
||||||
}
|
|
||||||
isMonitored = shouldMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getReducerError() {
|
function getReducerError() {
|
||||||
const instancesState = store.getState().instances;
|
const instancesState = store.getState().instances;
|
||||||
const payload = instancesState.states[instancesState.current];
|
const payload = instancesState.states[instancesState.current];
|
||||||
|
@ -436,11 +405,11 @@ function getReducerError() {
|
||||||
function togglePersist() {
|
function togglePersist() {
|
||||||
const state = store.getState();
|
const state = store.getState();
|
||||||
if (state.instances.persisted) {
|
if (state.instances.persisted) {
|
||||||
Object.keys(state.instances.connections).forEach((id) => {
|
for (const id of Object.keys(state.instances.connections)) {
|
||||||
if (connections.tab[id]) return;
|
if (connections.tab[id]) return;
|
||||||
store.dispatch({ type: REMOVE_INSTANCE, id });
|
store.dispatch({ type: REMOVE_INSTANCE, id });
|
||||||
toMonitors({ type: 'NA', id });
|
toMonitors({ type: 'NA', id });
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,9 +512,9 @@ function messaging<S, A extends Action<string>>(
|
||||||
}
|
}
|
||||||
|
|
||||||
function disconnect(
|
function disconnect(
|
||||||
type: 'tab' | 'monitor' | 'panel',
|
type: 'tab' | 'panel',
|
||||||
id: number | string,
|
id: number | string,
|
||||||
listener?: (message: any, port: chrome.runtime.Port) => void,
|
listener: (message: any, port: chrome.runtime.Port) => void,
|
||||||
) {
|
) {
|
||||||
return function disconnectListener() {
|
return function disconnectListener() {
|
||||||
const p = connections[type][id];
|
const p = connections[type][id];
|
||||||
|
@ -559,7 +528,7 @@ function disconnect(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
monitors--;
|
monitors--;
|
||||||
if (!monitors) monitorInstances(false);
|
if (monitors === 0) toAllTabs({ type: 'STOP' });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -581,7 +550,7 @@ function onConnect<S, A extends Action<string>>(port: chrome.runtime.Port) {
|
||||||
chrome.action.enable(id);
|
chrome.action.enable(id);
|
||||||
chrome.action.setIcon({ tabId: id, path: 'img/logo/38x38.png' });
|
chrome.action.setIcon({ tabId: id, path: 'img/logo/38x38.png' });
|
||||||
}
|
}
|
||||||
if (isMonitored) port.postMessage({ type: 'START' });
|
if (monitors > 0) port.postMessage({ type: 'START' });
|
||||||
|
|
||||||
const state = store.getState();
|
const state = store.getState();
|
||||||
if (state.instances.persisted) {
|
if (state.instances.persisted) {
|
||||||
|
@ -607,22 +576,11 @@ function onConnect<S, A extends Action<string>>(port: chrome.runtime.Port) {
|
||||||
port.onMessage.addListener(listener);
|
port.onMessage.addListener(listener);
|
||||||
port.onDisconnect.addListener(disconnect('tab', id, listener));
|
port.onDisconnect.addListener(disconnect('tab', id, listener));
|
||||||
} else if (port.name && port.name.indexOf('monitor') === 0) {
|
} else if (port.name && port.name.indexOf('monitor') === 0) {
|
||||||
id = getId(port.sender!, port.name);
|
|
||||||
connections.monitor[id] = port;
|
|
||||||
monitorInstances(true);
|
|
||||||
listener = (msg: BackgroundAction | 'heartbeat') => {
|
|
||||||
if (msg === 'heartbeat') return;
|
|
||||||
store.dispatch(msg);
|
|
||||||
};
|
|
||||||
port.onMessage.addListener(listener);
|
|
||||||
monitors++;
|
|
||||||
port.onDisconnect.addListener(disconnect('monitor', id));
|
|
||||||
} else {
|
|
||||||
// devpanel
|
// devpanel
|
||||||
id = port.name || port.sender!.frameId!;
|
id = getId(port.sender!, port.name);
|
||||||
connections.panel[id] = port;
|
connections.panel[id] = port;
|
||||||
monitorInstances(true, port.name);
|
|
||||||
monitors++;
|
monitors++;
|
||||||
|
toAllTabs({ type: 'START' });
|
||||||
listener = (msg: BackgroundAction | 'heartbeat') => {
|
listener = (msg: BackgroundAction | 'heartbeat') => {
|
||||||
if (msg === 'heartbeat') return;
|
if (msg === 'heartbeat') return;
|
||||||
store.dispatch(msg);
|
store.dispatch(msg);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user