Files
react/shells/browser/shared/src/backend.js
T
Ivan Babak 0b817777b4 Remove Agent addBridge: there can only be one bridge, add in constructor
Let's make impossible states truly impossible, and fix Flow types, too.

All three usages of Agent called addBridge right after constructing it.
Agent has one field `_bridge` which is force-typed as not-null despite
there's a temporary zone between the constructor end and addBridge start
where `_bridge` is null.
2019-04-28 04:03:28 -07:00

68 lines
1.6 KiB
JavaScript

// Do not use imports or top-level requires here!
// Running module factories is intentionally delayed until we know the hook exists.
// This is to avoid issues like: https://github.com/facebook/react-devtools/issues/1039
/** @flow */
function welcome(event) {
if (
event.source !== window ||
event.data.source !== 'react-devtools-content-script'
) {
return;
}
window.removeEventListener('message', welcome);
setup(window.__REACT_DEVTOOLS_GLOBAL_HOOK__);
}
window.addEventListener('message', welcome);
function setup(hook) {
const Agent = require('src/backend/agent').default;
const Bridge = require('src/bridge').default;
const { initBackend } = require('src/backend');
const listeners = [];
const bridge = new Bridge({
listen(fn) {
const listener = event => {
if (
event.source !== window ||
!event.data ||
event.data.source !== 'react-devtools-content-script' ||
!event.data.payload
) {
return;
}
fn(event.data.payload);
};
listeners.push(listener);
window.addEventListener('message', listener);
},
send(event: string, payload: any, transferable?: Array<any>) {
window.postMessage(
{
source: 'react-devtools-bridge',
payload: { event, payload },
},
'*',
transferable
);
},
});
const agent = new Agent(bridge);
agent.addListener('shutdown', () => {
hook.emit('shutdown');
listeners.forEach(fn => {
window.removeEventListener('message', fn);
});
listeners.splice(0);
});
initBackend(hook, agent, window);
}