Skip to content

Commit ef5e5ff

Browse files
committed
fix: reconnect automatically in case background script is killed, fix #1950
1 parent 37aa0a4 commit ef5e5ff

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed

packages/app-backend-core/src/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export async function initBackend (bridge: Bridge) {
6161
initOnPageConfig()
6262

6363
if (!connected) {
64-
// connected = false
64+
// First connect
6565
ctx = target.__vdevtools_ctx = createBackendContext({
6666
bridge,
6767
hook,
@@ -91,8 +91,10 @@ export async function initBackend (bridge: Bridge) {
9191
})
9292
}
9393
} else {
94+
// Reconnect
9495
ctx.bridge = bridge
9596
connectBridge()
97+
ctx.bridge.send(BridgeEvents.TO_FRONT_RECONNECTED)
9698
}
9799
}
98100

packages/shared-utils/src/consts.ts

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export enum BridgeEvents {
1818
/** Tab was switched */
1919
TO_BACK_TAB_SWITCH = 'b:tab:switch',
2020
TO_BACK_LOG = 'b:log',
21+
/** Reconnected after background script is terminated (idle) */
22+
TO_FRONT_RECONNECTED = 'f:reconnected',
2123

2224
// Apps
2325
/** App was registered */

packages/shell-chrome/src/backend.js

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ function handshake (e) {
4444
window.removeEventListener('message', l)
4545
})
4646
listeners = []
47+
window.addEventListener('message', handshake)
4748
})
4849

4950
initBackend(bridge)

packages/shell-chrome/src/devtools.js

+42-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// this script is called when the VueDevtools panel is activated.
22

33
import { initDevTools, setAppConnected } from '@front'
4-
import { Bridge } from '@vue-devtools/shared-utils'
4+
import { Bridge, BridgeEvents } from '@vue-devtools/shared-utils'
55

66
initDevTools({
77

@@ -15,18 +15,47 @@ initDevTools({
1515
// 1. inject backend code into page
1616
injectScript(chrome.runtime.getURL('build/backend.js'), () => {
1717
// 2. connect to background to setup proxy
18-
const port = chrome.runtime.connect({
19-
name: '' + chrome.devtools.inspectedWindow.tabId,
20-
})
18+
let port
2119
let disconnected = false
22-
port.onDisconnect.addListener(() => {
23-
disconnected = true
24-
setAppConnected(false)
25-
})
20+
let connectCount = 0
21+
let timer
22+
23+
const onMessageHandlers = []
24+
25+
function connect () {
26+
try {
27+
clearTimeout(timer)
28+
connectCount++
29+
port = chrome.runtime.connect({
30+
name: '' + chrome.devtools.inspectedWindow.tabId,
31+
})
32+
disconnected = false
33+
port.onDisconnect.addListener(() => {
34+
disconnected = true
35+
setAppConnected(false)
36+
37+
// Retry
38+
timer = setTimeout(connect, 1000)
39+
})
40+
41+
if (connectCount > 1) {
42+
onMessageHandlers.forEach(fn => port.onMessage.addListener(fn))
43+
}
44+
} catch (e) {
45+
console.error(e)
46+
disconnected = true
47+
setAppConnected(false)
48+
49+
// Retry
50+
timer = setTimeout(connect, 5000)
51+
}
52+
}
53+
connect()
2654

2755
const bridge = new Bridge({
2856
listen (fn) {
2957
port.onMessage.addListener(fn)
58+
onMessageHandlers.push(fn)
3059
},
3160
send (data) {
3261
if (!disconnected) {
@@ -37,6 +66,11 @@ initDevTools({
3766
}
3867
},
3968
})
69+
70+
bridge.on(BridgeEvents.TO_FRONT_RECONNECTED, () => {
71+
setAppConnected(true)
72+
})
73+
4074
// 3. send a proxy API to the panel
4175
cb(bridge)
4276
})

0 commit comments

Comments
 (0)