in src/hook.js [21:100]
export function installHook(target: any): DevToolsHook | null {
if (target.hasOwnProperty('__RELAY_DEVTOOLS_HOOK__')) {
return null;
}
const listeners = {};
const environments = new Map();
let uidCounter = 0;
function registerEnvironment(environment) {
const id = ++uidCounter;
environments.set(id, environment);
hook.emit('environment', { id, environment });
return id;
}
function sub(event, fn) {
hook.on(event, fn);
return () => hook.off(event, fn);
}
function on(event, fn) {
if (!listeners[event]) {
listeners[event] = [];
}
listeners[event].push(fn);
}
function off(event, fn) {
if (!listeners[event]) {
return;
}
const index = listeners[event].indexOf(fn);
if (index !== -1) {
listeners[event].splice(index, 1);
}
if (!listeners[event].length) {
delete listeners[event];
}
}
function emit(event, data) {
if (listeners[event]) {
listeners[event].map(fn => fn(data));
}
}
const environmentWrappers = new Map();
const hook: DevToolsHook = {
registerEnvironment,
environmentWrappers,
// listeners,
environments,
emit,
// inject,
on,
off,
sub,
};
Object.defineProperty(
target,
'__RELAY_DEVTOOLS_HOOK__',
({
// This property needs to be configurable for the test environment,
// else we won't be able to delete and recreate it beween tests.
configurable: __DEV__,
enumerable: false,
get() {
return hook;
},
}: Object)
);
return hook;
}