Skip to content

Commit 8a22e49

Browse files
committed
Trying to reduce amount of hacky code, so we could reuse apollo dev tools code in the debugger.
1 parent 8d14e45 commit 8a22e49

File tree

9 files changed

+139
-20
lines changed

9 files changed

+139
-20
lines changed

app/middlewares/debuggerAPI.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,10 @@ let socket;
3333
const workerOnMessage = message => {
3434
const { data } = message;
3535

36-
if (data.APOLLO_MESSAGE) {
36+
if (data.source === 'apollo-devtools-backend') {
3737
postMessage({
38-
event: data.event,
39-
payload: data,
4038
source: 'apollo-devtools-backend',
39+
payload: data,
4140
}, "*");
4241
}
4342

app/worker/apollo/checkVersions.js renamed to app/worker/apollo/backend/checkVersions.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import genUuid from "uuid/v1";
22

3-
export const checkVersions = async (hook, bridge) => {
4-
const uuid = genUuid();
3+
let uuid = genUuid();
54

5+
export const checkVersions = (hook, bridge) => {
66
const { version } = hook.ApolloClient;
77
const { devToolsVersion } = hook;
88

app/worker/apollo/backend/hook.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// IMPORTANT: this script is injected into every page!!!
2+
3+
/**
4+
* Install the hook on window, which is an event emitter.
5+
* Note because Chrome content scripts cannot directly modify the window object,
6+
* we are evaling this function by inserting a script tag. That's why we have
7+
* to inline the whole event emitter implementation here.
8+
*
9+
* special thanks to the Vue devtools for this solution
10+
*/
11+
12+
export function installHook(window, devToolsVersion) {
13+
let listeners = {};
14+
15+
// XXX change how ApolloClient connects to the dev tools
16+
const hook = {
17+
ApolloClient: null,
18+
actionLog: [],
19+
devToolsVersion,
20+
on(event, fn) {
21+
event = "$" + event;
22+
(listeners[event] || (listeners[event] = [])).push(fn);
23+
},
24+
once(event, fn) {
25+
const eventAlias = event;
26+
event = "$" + event;
27+
function on() {
28+
this.off(eventAlias, on);
29+
fn.apply(this, arguments);
30+
}
31+
(listeners[event] || (listeners[event] = [])).push(on);
32+
},
33+
off(event, fn) {
34+
event = "$" + event;
35+
if (!arguments.length) {
36+
listeners = {};
37+
} else {
38+
const cbs = listeners[event];
39+
if (cbs) {
40+
if (!fn) {
41+
listeners[event] = null;
42+
} else {
43+
for (let i = 0, l = cbs.length; i < l; i++) {
44+
const cb = cbs[i];
45+
if (cb === fn || cb.fn === fn) {
46+
cbs.splice(i, 1);
47+
break;
48+
}
49+
}
50+
}
51+
}
52+
}
53+
},
54+
emit(event) {
55+
event = "$" + event;
56+
let cbs = listeners[event];
57+
if (cbs) {
58+
const args = [].slice.call(arguments, 1);
59+
cbs = cbs.slice();
60+
for (let i = 0, l = cbs.length; i < l; i++) {
61+
cbs[i].apply(this, args);
62+
}
63+
}
64+
},
65+
};
66+
67+
Object.defineProperty(window, "__APOLLO_DEVTOOLS_GLOBAL_HOOK__", {
68+
get() {
69+
return hook;
70+
},
71+
});
72+
73+
// XXX this is a patch to back support previous versions of Apollo Client
74+
// at somepoint we should remove this.
75+
// the newer version has the client connecting to the hook, not the other
76+
// way around that it currently does
77+
let interval;
78+
let count = 0;
79+
function findClient() {
80+
// only try for 10seconds
81+
if (count++ > 10) clearInterval(interval);
82+
if (!!window.__APOLLO_CLIENT__) {
83+
hook.ApolloClient = window.__APOLLO_CLIENT__;
84+
hook.ApolloClient.__actionHookForDevTools(
85+
({
86+
state: { queries, mutations },
87+
dataWithOptimisticResults: inspector,
88+
}) => {
89+
hook.actionLog.push({ queries, mutations, inspector });
90+
},
91+
);
92+
clearInterval(interval);
93+
}
94+
}
95+
96+
interval = setInterval(findClient, 1000);
97+
}

app/worker/apollo/backend/index.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// This is the agent that is injected into the page that an Apollo Client app lives in
2+
// when the Apollo Devtools panel is activated.
3+
import { initBroadCastEvents } from "./broadcastQueries";
4+
import { initLinkEvents } from "./links";
5+
import { checkVersions } from "./checkVersions";
6+
7+
// hook should have been injected before this executes.
8+
let hook;
9+
let bridge;
10+
let connected;
11+
12+
const connect = () => {
13+
if (connected) return;
14+
connected = true;
15+
if (Number(hook.ApolloClient.version[0]) !== 1) {
16+
initLinkEvents(hook, bridge);
17+
initBroadCastEvents(hook, bridge);
18+
}
19+
bridge.log("backend ready.");
20+
bridge.send("ready", hook.ApolloClient.version);
21+
checkVersions(hook, bridge);
22+
};
23+
24+
export const initBackend = (b, h) => {
25+
bridge = b;
26+
hook = h;
27+
connect();
28+
};
File renamed without changes.

app/worker/apollo/bridge.js

100644100755
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export default class Bridge extends EventEmitter {
2121

2222
send(event, payload) {
2323
this.wall.send({
24-
APOLLO_MESSAGE: true,
2524
event,
2625
payload,
2726
});

app/worker/index.js

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ import * as RemoteDev from './remotedev';
1818
import { getRequiredModules, ignoreRNDIntervalSpy } from './utils';
1919
import { toggleNetworkInspect } from './networkInspect';
2020
import Bridge from './apollo/bridge';
21-
import { initBroadCastEvents } from "./apollo/broadcastQueries";
22-
import { initLinkEvents } from "./apollo/links";
23-
import { checkVersions } from "./apollo/checkVersions";
21+
import { initBackend } from './apollo/backend';
2422

2523
/* eslint-disable no-underscore-dangle */
2624
self.__REMOTEDEV__ = RemoteDev;
@@ -68,22 +66,20 @@ const setupRNDebugger = async message => {
6866
listen(fn) {
6967
self.addEventListener("message", evt =>
7068
{
71-
return fn(evt.data);
69+
if (evt.data.source === "apollo-devtools-proxy" && evt.data.payload) {
70+
return fn(evt.data);
71+
}
7272
});
7373
},
7474
send(data) {
75-
postMessage(data);
75+
postMessage({
76+
...data,
77+
source: 'apollo-devtools-backend'
78+
});
7679
},
7780
});
7881

79-
if (Number(hook.ApolloClient.version[0]) !== 1) {
80-
initLinkEvents(hook, bridge);
81-
initBroadCastEvents(hook, bridge);
82-
}
83-
bridge.log("backend ready.");
84-
bridge.send("ready", hook.ApolloClient.version);
85-
checkVersions(hook, bridge);
86-
82+
initBackend(bridge, hook);
8783
}
8884

8985
}, 1000);

electron/extensions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export default async () => {
1414
}
1515
BrowserWindow.addDevToolsExtension(path.resolve('dist/devtools-helper/'));
1616

17-
BrowserWindow.addDevToolsExtension(path.resolve('../apollo-client-devtools/shells/webextension/'));
1817
} else {
1918
BrowserWindow.addDevToolsExtension(path.join(__dirname, 'devtools-helper/'));
2019
}
20+
BrowserWindow.addDevToolsExtension(path.resolve('../apollo-client-devtools/shells/webextension/'));
2121
};

0 commit comments

Comments
 (0)