44
55import * as s from 'solid-js'
66import * 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'
88import * as frontend from '@solid-devtools/frontend'
99import * as debug from '@solid-devtools/debugger/types'
1010
1111import {
1212 ConnectionName , Place_Name , port_on_message , port_post_message_obj ,
13- type Versions ,
13+ type Message , type Versions ,
1414} from './shared.ts'
1515
1616import '@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