Skip to content

Commit 4bc6abb

Browse files
committed
Reconnect to the port when disconnected in devtools panel. (#337)
1 parent ee4e7ee commit 4bc6abb

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed

.changeset/lazy-rings-fail.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solid-devtools/extension": patch
3+
---
4+
5+
Reconnect to the port when disconnected in devtools panel. (#337)

extension/src/panel.tsx

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
import * as s from 'solid-js'
66
import * as web from 'solid-js/web'
7-
import {error, log} from '@solid-devtools/shared/utils'
7+
import {error, log, warn} from '@solid-devtools/shared/utils'
88
import * as frontend from '@solid-devtools/frontend'
99
import * as debug from '@solid-devtools/debugger/types'
1010

1111
import {
1212
ConnectionName, Place_Name, port_on_message, port_post_message_obj,
13-
type Versions,
13+
type Message, type Versions,
1414
} from './shared.ts'
1515

1616
import '@solid-devtools/frontend/dist/styles.css'
@@ -26,12 +26,14 @@ function App() {
2626
client_expected: '',
2727
extension: '',
2828
}
29-
const [versions, setVersions] = s.createSignal<Versions>(empty_versions)
29+
const [versions, setVersions] = s.createSignal(empty_versions)
30+
const [port, setPort] = s.createSignal<chrome.runtime.Port | null>(null)
31+
let message_queue: Message[] = []
3032

3133
const devtools = frontend.createDevtools({
3234
headerSubtitle() {
3335
let {extension, client, client_expected} = versions()
34-
return `#${extension}_${client}/${client_expected}`
36+
return `#${extension}_${client}/${client_expected}${port() == null ? ' [DISCONNECTED]' : ''}`
3537
},
3638
errorOverlayFooter() {
3739
return <>
@@ -40,28 +42,60 @@ function App() {
4042
<li>Extension: {versions().extension}</li>
4143
<li>Client: {versions().client}</li>
4244
<li>Expected client: {versions().client_expected}</li>
45+
<li>Connection: {port() != null ? 'Connected' : 'Disconnected (attempting to reconnect...)'}</li>
4346
</ul>
4447
</>
4548
},
4649
useShortcuts: true,
4750
catchWindowErrors: true,
4851
})
4952

50-
const port = chrome.runtime.connect({name: ConnectionName.Panel})
51-
port_on_message(port, e => {
52-
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
53-
switch (e.kind) {
54-
case 'Versions':
55-
setVersions(e.data ?? empty_versions)
56-
break
57-
default:
58-
/* Client -> Devtools */
59-
devtools.input.emit(
60-
// @ts-expect-error
61-
e
62-
)
53+
let connecting = false
54+
function connect_port() {
55+
if (connecting) return
56+
57+
connecting = true
58+
log('Attempting to connect port...')
59+
60+
try {
61+
let new_port = chrome.runtime.connect({name: ConnectionName.Panel})
62+
setPort(new_port)
63+
log('Port connected successfully')
64+
65+
// Flush queued messages
66+
for (let m of message_queue.splice(0, message_queue.length)) {
67+
port_post_message_obj(new_port, m)
68+
}
69+
70+
port_on_message(new_port, e => {
71+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
72+
switch (e.kind) {
73+
case 'Versions':
74+
setVersions(e.data ?? empty_versions)
75+
break
76+
default:
77+
/* Client -> Devtools */
78+
devtools.input.emit(
79+
// @ts-expect-error - type mismatch between debug types and actual message
80+
e,
81+
)
82+
}
83+
})
84+
85+
new_port.onDisconnect.addListener(() => {
86+
if (port() === new_port) {
87+
setPort(null)
88+
setTimeout(connect_port, 100)
89+
}
90+
})
91+
} catch (_err) {
92+
error('Failed to reconnect port:', _err)
6393
}
64-
})
94+
95+
connecting = false
96+
}
97+
98+
connect_port()
6599

66100
devtools.output.listen(e => {
67101
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
@@ -73,7 +107,7 @@ function App() {
73107
*/
74108
let get_value = `window[${JSON.stringify(debug.GLOBAL_GET_VALUE)}]`
75109
let value_id = JSON.stringify(e.data)
76-
110+
77111
chrome.devtools.inspectedWindow.eval(
78112
/*js*/`typeof ${get_value} === 'function' && (() => {
79113
let v = ${get_value}(${value_id})
@@ -89,7 +123,21 @@ function App() {
89123
}
90124
default:
91125
/* Devtools -> Client */
92-
port_post_message_obj(port, e)
126+
let curr_port = port()
127+
if (curr_port == null) {
128+
warn('Port not available, message queued')
129+
message_queue.push(e)
130+
connect_port()
131+
return
132+
}
133+
134+
try {
135+
port_post_message_obj(curr_port, e)
136+
} catch (err) {
137+
warn('Message failed to send:', err)
138+
message_queue.push(e)
139+
connect_port()
140+
}
93141
break
94142
}
95143
})

0 commit comments

Comments
 (0)